其實有點標題黨了,不過大概就是這個意思。
進入正題,
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 (應該叫壓縮更合適)。
最後,去掉開頭 4 個字母 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 Closure,Uglifyjs,YUI Compressor 等工具進行打包壓縮(我覺得應該叫編譯更爲恰當)。
比如:
用 UglifyJS 編譯後:
不僅變量變成了 a,b 而且 if 語句也發生了變化,所以叫做編譯更貼切。
再來試試剛纔那段全是 aaaaa 的代碼,用 UglifyJS 編譯後就變成一行了:
是不是很神奇啊,大量的優化了垃圾代碼。
著名的 jQuery 就是用 UglifyJS 編譯的,也許你會說不是 grunt 構建的麼,是的,但是編譯器用的就是
UglifyJS。
好了,今天又水了一篇,而且文不對題,重心變成介紹各種工具了。
JS混淆加密壓縮
在線UglifyJS:
在線Closure Compressor:(請翻牆)
在線YUI Compressor: