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代码混淆加密工具,才能真正保护代码安全。