如果代码未被压缩,那么很容易。但是区分压缩和混淆的代码却很困难。
我找到了这个链接:http://research.microsoft.com/pubs/148514/tr.pdf
如何检测压缩和混淆的代码之间的差异?
这里没有什么可谈的。
但首先,让我们问一个问题:什么是压缩代码?
好吧,那不太难。维基百科 上有解释!但它没有解释如何实现压缩代码。
基本上,您需要尽可能减少代码量,但保持相同的功能。
让我们分析一些代码!
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 + ' × ' + 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+' × '+i+' = '+(i*t)+'<br/>');else alert('Invalid number');
'5'
替换为数字5
parseInt()
t/1==t/1
替换!isNaN(times)
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(___________, _________, _______________, _______________, __________,
______, ______________, __________, _____________, _______________, ________, _______));