javascript - 如何以编程方式检测 JavaScript 混淆?

标签 javascript classification obfuscation abstract-syntax-tree deobfuscation

如果代码没有最小化,这很容易。但很难区分最小化和混淆。 我发现了这个:http://research.microsoft.com/pubs/148514/tr.pdf

我如何检测精简代码和混淆代码之间的区别?

最佳答案

这里就不多说了。

但首先,让我们问一个问题:什么是最小化代码?

嗯,这并不难。 Wikipedia有!但没有解释如何实现缩小代码。

基本上,您需要尽可能减少代码,但保留相同的功能。

让我们分析一些代码!

var times;

times = window.prompt('Insert a number','5');

times = parseInt( times, 10 );

if( !isNaN(times) )
{
  for(var i=0; i<=10; i=i+1 )
  {
    document.write(times + ' &times; ' + i + ' = ' + ( i * times) + '<br/>');
  }
}
else
{
  alert('Invalid number');
}

现在,我们可以大大减少代码!

这就是缩小的意义所在。

现在,让我们看一下这段代码:

var i=0,t=window.prompt('Insert a number',5);if(t/1==t/1)for(;i<11;i++)document.write(t+' &times; '+i+' = '+(i*t)+'<br/>');else alert('Invalid number');

完全一样!但是那么多更短!

我做了什么:

  • 减少变量名
  • 同时声明了它们
  • 减少了将值归因于变量的次数
  • 将字符串 '5' 替换为数字 5
  • 删除了不必要的 parseInt()
  • !isNaN(times) 替换为 t/1==t/1
    如果不是数字,t/1 将是 NaN
    如果您运行 NaN==NaN,它将是 false
  • 删除空格(空格、换行符)
  • 摘下牙套

此代码可以进一步减少,但您可以(更努力地)看到功能。

还有更多的技术可以减少代码量,但我不会详细介绍。


但是,现在,另一个问题:什么是混淆代码?

混淆代码是我们无法理解的代码。

您可以阅读代码,但功能不会很容易理解。

这比缩小更进一步。减小它的大小不是必需的。

但是,大多数时候,混淆代码会以您无法理解的方式减少。

只有懂的人才懂。

JSF*ck 就是一个例子。

使用 2 个在线工具,混淆代码如下所示:

使用 http://www.jsobfuscate.com/ 混淆:

eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('4 2;2=d.e(\'c a 3\',\'5\');2=b(2,6);7(!8(2)){9(4 i=0;i<=6;i=i+1){h.j(2+\' &2; \'+i+\' = \'+(i*2)+\'<f/>\')}}k{l(\'g 3\')}',22,22,'||times|number|var||10|if|isNaN|for||parseInt|Insert|window|prompt|br|Invalid|document||write|else|alert'.split('|'),0,{}))

使用 http://packer.50x.eu/ 混淆:

eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(c/a))+String.fromCharCode(c%a+161)};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\[\xa1-\xff]+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp(e(c),'g'),k[c])}}return p}('£ ¡;¡=©.¨(\'§ a ¢\',\'5\');¡=¥(¡,¤);¦(!ª(¡)){«(£ i=0;i<=¤;i=i+1){®.¬(¡+\' &¡; \'+i+\' = \'+(i*¡)+\'<±/>\')}}­{¯(\'° ¢\')}',17,17,'times|number|var|10|parseInt|if|Insert|prompt|window|isNaN|for|write|else|document|alert|Invalid|br'.split('|'),0,{}))

使用这些工具有一些相似之处:

  • 两者都有一个eval()
  • 两者都使用变量 p,a,c,k,e,d 创建一个函数。
  • 两者都在最后列出了所有属性和其他内容
  • 两者都使用字符串巫术来生成代码

但是每个混淆代码都是平等的吗?不!它不是。

这是一个例子:

var ________________ = [] + []; var _ = +[]; _++; var _____ = _ + _;
var ___ = _____ + _____; var __ = ___ + ___; var ____ = __ + __; var ______ = ____ + ____;
var _______ = ______ + _; var ___________ = ______ + ______ + __;
var ______________ = ___________ + ____ -  _; var ____________ = _ + _____;
var ________ = _______ * ____________ + _; var _________ = ________ + _;
var _____________ = ______________ + ______ - ___ - _; var __________ = _____________ -
____________; var _______________ = __________ - ____________; document.write(________________ +
String.fromCharCode(___________, _________, _______________, _______________, __________,
______, ______________, __________, _____________, _______________, ________, _______));

这是从另一个网站截取的。您可以在此处查看原始答案:https://codegolf.stackexchange.com/a/22746/14732

如何区分这两者? 你根本做不到。或者您是 super 天才,可以看到混淆代码并了解它的作用。

您需要一个非常智能的算法来了解代码的作用。然后向后重建它。 如果两个代码不同,则它可能被混淆了。


结论:您无法区分混淆代码和缩小代码。

关于javascript - 如何以编程方式检测 JavaScript 混淆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30156247/

相关文章:

javascript - 如何在 Angular 中实现模板变量?

android - 使用 Proguard 时使用 jackson-json 库的问题

javascript - 加载到另一个 url 后,我如何使用 reactjs 中的路由从一个页面重定向

javascript - JavaScript 中的 void、eval 和 Function 构造函数有什么区别?

javascript - 使用vue + webpack加载图片

java - 使用Weka : Can Training Data be of Multiple Length?

python - NumPy 的 : convert labels into indexes

python - 使用 10 倍交叉验证时 sklearn 的特征大小

java - 如何使用 Proguard 仅混淆包名称

java - 作为 Java 库提供的最好的免费 JavaScript 混淆器是什么?