最近和ucd部分的前端开发有合作,可曾想他们发过来组件什么的都是加密处理过的,事实上组件又不完善,很多小的bug都要给他们定位,很是头疼,果断解密看看。

很多朋友以为JS的加密是不可逆的,其实常见的eval加密也谈不上是加密,只能算是一种编码(Encode)或者也可以成为是一种打包(packer),类似于base64这样的编码,都是可以以一定方式还原的,当然也就是“解密”了。

仔细观察加密JS,你会发现,大部分文件里面都有function(p,a,c,k,e,r)或者是function(p,a,c,k,e,d),据说这样的pack方式是dean edwards提出的,你可以访问其个人主页以获取这方面的最新信息。后来还有一些编码打包方式也是eval开头,但是特征字符串p,a,c,k,e,r(d)改变了,我们姑且称为是这种打包方式的一个变种吧,其实解码很简单,我们回顾一下JavaScript脚本中eval含义及用法。

其实就是调用JavaScript分析解释器处理有效的js脚本字符串,注意我这里提到的是字符串,有点类似于ASP的Execute方法。好,既然eval执行的字符串,那么function(p,a,c,k,e,r)函数肯定返回的是字符串,究竟是什么内容呢?你猜对了,就是我们要解码的源代码,其实function(p,a,c,k,e,r)相当于是个自解码函数,返回的就是解码好的源代码,然后传递给eval,那么这段解码后的字符串脚本就执行了。

到这里,突破点就有了,那就是function(p,a,c,k,e,r)这样的自解码函数,我们要获取其返回的字符串,怎么办?很简单,替换eval函数就可以了,比如替换成alert、document.write或者console.log,那么明文是不是显示出来了?答案是肯定的。

对于大多数情况,单独写个页面去解密,有点麻烦了,所以最好写一个工具页面专门来对付此类JS,或者页面也不想写,只是偶尔想用某个文件,你也可以人为破坏JS,在加密的文件中找到相对关键的字符(比如window,jQuery等等),然后改成一个绝对不等效的字符,丢到需要用到该JS的页面,加载后绝对报错,打开控制台(chrome、高版本IE、Firefox都可以),可以看到错误信息,点进去查看详情,复制出错代码所在的整段代码,改回你刚刚更改的关键字符,再覆盖回加密文件。解密成功。

小小经验,不喜勿喷