【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;}('(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,{}))
我教你 1 秒解密 packer加密過的js (應該叫壓縮更合適)。
最後,去掉開頭 個字母 eval 然後回車運行下就得到源碼了。
(function (){ function test(a) { if (a) { return a; } return 123; } var ret = test(); alert(ret);})();
eval 包裹着函數或者其他語句的密文都可以這樣做,最常見的就是 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,{}))
這些工具打包壓縮後的代碼,優化了語句,把局部變量重命名爲 a,b,c 這樣的變量,所以大幅度的減小了代碼容量。
(function (){ function test(text) { if (text) { return text; } return 'hehe'; } var ret = test(); alert(ret);})();
!function(){function a(a){return a?a:"hehe"}var b=a();alert(b)}();
!function(){var a=1;return a}();
在線代碼格式化:
http://jsbeautifier.org/
http://tool.chinaz.com/js.aspx
http://marijnhaverbeke.nl/uglifyjs/
http://closure-compiler.appspot.com/home
http://tool.oschina.net/jscompress

類似這樣一段代碼,高手見了笑而不語,熟悉js的朋友嗤之以鼻,js新人卻茫然了,去各種羣裏問怎麼解密。

打開谷歌或者火狐瀏覽器,然後按 F12,接着把這代碼複製進去,

chrome

firefox

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

是不是 so easy ?

當然不是所有亂七八糟的代碼都是這樣解密的,用這個方法解密有一個特徵。

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

packer 谷歌翻譯:打包機

很明顯都不是什麼加密,只是早前的一些打包算法而已,現在不推薦使用,效率不高不說,還沒有任何安全性。

可能有朋友會說,明明比源碼多,怎麼能說這是壓縮呢?

壓縮後:

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

比較好的習慣是用 Google ClosureUglifyjsYUI Compressor 等工具進行打包壓縮(我覺得應該叫編譯更爲恰當)。

比如:

用 UglifyJS 編譯後:

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

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

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

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

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


JS混淆加密壓縮 

在線UglifyJS:

在線Closure Compressor:(請翻牆)

在線YUI Compressor:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章