JS eval加密的代码如何解密?

JS的eval加密方法,很古老,也很常见。其解密方法,也非常简单。

类似于下面这样的JS加密代码,相信很多人都见到过:

eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);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}('8 a(){    f 6 = "b.3";    f 7 = 0;    f 5 = "(2)" + 7 + "-" + (d 1).9() + "," + 6;    e 5;}4.c(a());    ',62,16,'2017|Date|c|com|console|copyright|domain|from_year|function|getFullYear|get_copyright|jshaman|log|new|return|var'.split('|'),0,{}))

很多朋友以为这段js代码是“加密”的,其实这甚至谈不上是真正的加密,只能算是一种编码(Encode)。类似于base64这样的编码,都是可以以一定方式还原的,当然也就是js解密了。

分析这一段js加密代码,可发现代码开头都是eval,特征字符串是function(p,a,c,k,e,r)或者是function(p,a,c,k,e,d)

解密原理很简单,回顾一下JavaScript脚本中eval含义及用法:检查JS代码并执行。

eval(codeString)

必选项codestring参数是包含有效JS代码的字符串值。这个字符串将由JS分析器进行分析和执行。

既然eval执行的字符串是参数,那么function(p,a,c,k,e,r)函数肯定返回的是字符串,就是我们要解密的js源代码,其实function(p,a,c,k,e,r)相当于是个自解码函数,返回的就是解密好的js源代码,然后传递给eval,那么这段解码后的字符串脚本就执行了。

那么,替换eval函数就可以了,比如替换成alert或者document.write,或console.log,明文代码就显示出来了?就完成解密了。就是如此简单

在网页控制台中把上面的代码中eval,替换成console.log,即可完成eval解密,代码如下:

console.log(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);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}('8 a(){    f 6 = "b.3";    f 7 = 0;    f 5 = "(2)" + 7 + "-" + (d 1).9() + "," + 6;    e 5;}4.c(a());    ',62,16,'2017|Date|c|com|console|copyright|domain|from_year|function|getFullYear|get_copyright|jshaman|log|new|return|var'.split('|'),0,{}))

解密得到的JS代码:

function get_copyright() {
	var domain = "jshaman.com";
	var from_year = 2017;
	var copyright = "(c)" + from_year + "-" + (new Date).getFullYear() + "," + domain;
	return copyright;
}
console.log(get_copyright());

因此可见,eval加密看起来像回事,实际上,只需简单的替换就解密了,实在称不上加密。

如果实际的工作中遇到需要对JS代码进行加密,还需使用如JShaman之类的专业JS代码混淆加密工具,才能真正保护代码安全。

赞(0) 打赏
未经允许不得转载:JavaScript » JS eval加密的代码如何解密?

评论 抢沙发

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏