1秒破解 js packer 加密


其實有點標題黨了,不過大概就是這個意思。

進入正題,

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;}('(1(){1 4(0){6(0){2 0};2 5};7 3=4();8(3)})();',9,9,'a|function|return|ret|test|123|if|var|alert'.split('|'),0,{}))

類似這樣一段代碼,高手見了笑而不語,熟悉js的朋友嗤之以鼻,js新人卻茫然了,去各種群里問怎么解密。
我教你 1 秒解密 packer加密過的js (應該叫壓縮更合適)。

ps: 我很神奇的發現竟然有很多人看不懂,那我重新把步驟編輯下 [2014-07-08 更新]
1. 打開 谷歌 或者 火狐 瀏覽器
2. 按 F12 打開控制台
3. 把代碼復制進去
4. 刪除開頭 eval4個字母
5. 按回車鍵 (我嚴重懷疑說還是沒解密的人連回車都沒按。)
你可以看到如下結果。

chrome

firefox

格式化得到的源碼后即可得到:(在線代碼格式化 http://jsbeautifier.org/)

(function (){
    function test(a) {
        if (a) {
            return a;
        }
        return 123;
    }

    var ret = test();
    alert(ret);
})();

是不是 so easy ?

當然不是所有亂七八糟的代碼都是這樣解密的,用這個方法解密有一個特征。
eval 包裹着函數或者其他語句的密文都可以這樣做,最常見的就是 packer壓縮 了。

packer壓縮 的特征是  eval(function(p,a,c,k,e,d)  或者  eval(function(p,a,c,k,e,r)  開頭是這些的,用此方法1秒還原。

packer 谷歌翻譯:打包機
packed 谷歌翻譯:打包 (應該是 "已打包" 的意思)

很明顯都不是什么加密,只是早前的一些打包算法而已,現在不推薦使用,效率不高不說,還沒有任何安全性。
JS混淆加密壓縮 http://tool.chinaz.com/js.aspx
這是站在工具提供的打包,混淆工具。感興趣的朋友自己去測試下吧。

可能有朋友會說,明明比源碼多,怎么能說這是壓縮呢?
其實分析下他的算法就會發現,其實他是提取相同字符進行壓縮的,所以相同單詞越多,壓縮率越大,來看個例子:

(function () {
var aaaaaaaaa=1;
aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;aaaaaaaaa;
return aaaaaaaaa;
})();

壓縮后:

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;}('(3(){2 0=1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;4 0})();',5,5,'aaaaaaaaa||var|function|return'.split('|'),0,{}))

很明顯變量aaaaaaaaa被替換成了0,這樣就起到了壓縮功能,所以用他壓縮的前提是重復單詞非常多的情況。

比較好的習慣是用 Google ClosureUglifyjsYUI Compressor 等工具進行打包壓縮(我覺得應該叫編譯更為恰當)。
這些工具打包壓縮后的代碼,優化了語句,把局部變量重命名為 a,b,c 這樣的變量,所以大幅度的減小了代碼容量。

比如:

(function (){
    function test(text) {
        if (text) {
            return text;
        }
        return 'hehe';
    }

    var ret = test();
    alert(ret);
})();

用 UglifyJS 編譯后:

!function(){function a(a){return a?a:"hehe"}var b=a();alert(b)}();

不僅變量變成了 a,b 而且 if 語句也發生了變化,所以叫做編譯更貼切。

再來試試剛才那段全是 aaaaa 的代碼,用 UglifyJS 編譯后就變成一行了:

!function(){var a=1;return a}();

是不是很神奇啊,大量的優化了垃圾代碼。

著名的 jQuery 就是用 UglifyJS 編譯的,也許你會說不是 grunt 構建的么,是的,但是編譯器用的就是 UglifyJS。

好了,今天又水了一篇,而且文不對題,重心變成介紹各種工具了。


在線代碼格式化:
http://jsbeautifier.org/

JS混淆加密壓縮
http://tool.chinaz.com/js.aspx

在線UglifyJS:
http://marijnhaverbeke.nl/uglifyjs/

在線Closure Compressor:(請翻牆)
http://closure-compiler.appspot.com/home

在線YUI Compressor:
http://tool.oschina.net/jscompress


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM