解javascript 混淆加密收藏
更新時(shí)間:2009年01月16日 19:53:22 作者:
今天硬著頭皮去搞一段混淆過的js代碼,因?yàn)樵创a丟了。。。
本來打算要在js引擎那一層去獲取代碼的,發(fā)現(xiàn)根本不需要。
直接手工解密,比想象中的要簡(jiǎn)單不少,花了不到半個(gè)小時(shí)就搞出來了。
Js解混淆最關(guān)鍵的部分:
l eval或者document.write、VBS的EXECUTE、execScript之類的可以運(yùn)行js的函數(shù)
l unescape
js的混淆一般有幾種方法:
1. 把代碼通過escape轉(zhuǎn)換成hex形式的代碼,讓人看不懂
2. 把代碼進(jìn)行簡(jiǎn)單的可逆加密,然后提供一個(gè)解密函數(shù),通過解密函數(shù)把代碼解出來,并用eval之類的調(diào)用將代碼串交給js引擎運(yùn)行。
3. 過濾掉代碼中的注釋和空格,修改js代碼中的內(nèi)部函數(shù)/內(nèi)部變量的名稱,修改成非常難懂的數(shù)字或者很容易混淆的串比如數(shù)字0和字母O混合的串,讓人很難辨認(rèn)。
高級(jí)一點(diǎn)的辦法,自然是把以上幾個(gè)方法結(jié)合起來使用。
因此,還原的辦法就是
1.把可見的%XX的字符串用unescape解出來
2.找到eval或者類似的解釋函數(shù)入口
3.把傳入eval的參數(shù)字符串找出來
4.如果這些字符串也是hex形式的,用unescape解出來
5.循環(huán)2-4的過程,直到找出所有的代碼
6.這個(gè)時(shí)候很可能會(huì)發(fā)現(xiàn)還有一些變量在解出來的函數(shù)中使用,并且這些變量是一些大字符串,這種情況下,這些字符串應(yīng)該就是被加密了的源碼了。在使用他們的函數(shù)的最后的適當(dāng)位置插入代碼,顯示出他們解密后的字符串,即可得源碼。
這里面最需要注意的就是要看清楚變量名稱,解密部分的代碼很多都是通過類似000O、0O00之類的名稱相加而成的,看清楚這些變量的真正名稱。
注意要保留函數(shù)和變量聲明和定義的順序,避免由于移動(dòng)位置而導(dǎo)致找不到函數(shù)或變量。
另外,混淆工具還會(huì)在代碼里面添加不少垃圾代碼,可以刪除之。
如果更強(qiáng)一點(diǎn)的混淆工具,還可以在產(chǎn)生的類似垃圾代碼的代碼中插入一些有用的代碼,用于為下面緊接著的亂碼函數(shù)提供一些變量,比如解密的key之類,因此要注意不能打亂代碼的順序,如果確認(rèn)不了是不是垃圾代碼,留著先。
看上去方法3最簡(jiǎn)單也最弱智,但實(shí)際上這個(gè)方法對(duì)我們的影響卻最大,嘗試閱讀沒有注釋、格式混亂并且有著一堆亂七八糟名稱的標(biāo)識(shí)符的代碼,對(duì)任何一個(gè)正常人來講都是噩夢(mèng)。不過估計(jì)是因?yàn)椤皟?nèi)部”這個(gè)標(biāo)準(zhǔn)不太好判斷,有些混淆工具并不提供這樣的功能。
另:解網(wǎng)頁(yè)加密
在地址欄或按Ctrl+O,輸入:
javascript:s=document.documentElement.outerHTML;document.write('<body></body>');document.body.innerText=s;
源代碼就出來了。不論加密如何復(fù)雜,最終都要還原成瀏覽器可以解析的html代碼,而documentElement.outerHTML正是最終的結(jié)果。
Js解混淆最關(guān)鍵的部分:
l eval或者document.write、VBS的EXECUTE、execScript之類的可以運(yùn)行js的函數(shù)
l unescape
js的混淆一般有幾種方法:
1. 把代碼通過escape轉(zhuǎn)換成hex形式的代碼,讓人看不懂
2. 把代碼進(jìn)行簡(jiǎn)單的可逆加密,然后提供一個(gè)解密函數(shù),通過解密函數(shù)把代碼解出來,并用eval之類的調(diào)用將代碼串交給js引擎運(yùn)行。
3. 過濾掉代碼中的注釋和空格,修改js代碼中的內(nèi)部函數(shù)/內(nèi)部變量的名稱,修改成非常難懂的數(shù)字或者很容易混淆的串比如數(shù)字0和字母O混合的串,讓人很難辨認(rèn)。
高級(jí)一點(diǎn)的辦法,自然是把以上幾個(gè)方法結(jié)合起來使用。
因此,還原的辦法就是
1.把可見的%XX的字符串用unescape解出來
2.找到eval或者類似的解釋函數(shù)入口
3.把傳入eval的參數(shù)字符串找出來
4.如果這些字符串也是hex形式的,用unescape解出來
5.循環(huán)2-4的過程,直到找出所有的代碼
6.這個(gè)時(shí)候很可能會(huì)發(fā)現(xiàn)還有一些變量在解出來的函數(shù)中使用,并且這些變量是一些大字符串,這種情況下,這些字符串應(yīng)該就是被加密了的源碼了。在使用他們的函數(shù)的最后的適當(dāng)位置插入代碼,顯示出他們解密后的字符串,即可得源碼。
這里面最需要注意的就是要看清楚變量名稱,解密部分的代碼很多都是通過類似000O、0O00之類的名稱相加而成的,看清楚這些變量的真正名稱。
注意要保留函數(shù)和變量聲明和定義的順序,避免由于移動(dòng)位置而導(dǎo)致找不到函數(shù)或變量。
另外,混淆工具還會(huì)在代碼里面添加不少垃圾代碼,可以刪除之。
如果更強(qiáng)一點(diǎn)的混淆工具,還可以在產(chǎn)生的類似垃圾代碼的代碼中插入一些有用的代碼,用于為下面緊接著的亂碼函數(shù)提供一些變量,比如解密的key之類,因此要注意不能打亂代碼的順序,如果確認(rèn)不了是不是垃圾代碼,留著先。
看上去方法3最簡(jiǎn)單也最弱智,但實(shí)際上這個(gè)方法對(duì)我們的影響卻最大,嘗試閱讀沒有注釋、格式混亂并且有著一堆亂七八糟名稱的標(biāo)識(shí)符的代碼,對(duì)任何一個(gè)正常人來講都是噩夢(mèng)。不過估計(jì)是因?yàn)椤皟?nèi)部”這個(gè)標(biāo)準(zhǔn)不太好判斷,有些混淆工具并不提供這樣的功能。
另:解網(wǎng)頁(yè)加密
在地址欄或按Ctrl+O,輸入:
復(fù)制代碼 代碼如下:
javascript:s=document.documentElement.outerHTML;document.write('<body></body>');document.body.innerText=s;
源代碼就出來了。不論加密如何復(fù)雜,最終都要還原成瀏覽器可以解析的html代碼,而documentElement.outerHTML正是最終的結(jié)果。
相關(guān)文章
微信小程序websocket聊天室的實(shí)現(xiàn)示例代碼
這篇文章主要介紹了微信小程序websocket聊天室的實(shí)現(xiàn)示例代碼,小程序本身對(duì)http、websocket等連接均有諸多限制,所以這次項(xiàng)目選擇了node.js自帶的ws模塊。感興趣的可以參考一下2019-02-02CSS+JS實(shí)現(xiàn)點(diǎn)擊文字彈出定時(shí)自動(dòng)關(guān)閉DIV層菜單的方法
這篇文章主要介紹了CSS+JS實(shí)現(xiàn)點(diǎn)擊文字彈出定時(shí)自動(dòng)關(guān)閉DIV層菜單的方法,設(shè)計(jì)javascript操作菜單的彈出與關(guān)閉的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-05-05javascript完整操作Table的增加行,刪除行的列子大全
非常漂亮的js操作table行代碼函數(shù)。比較方便2008-10-10js實(shí)現(xiàn)顯示手機(jī)號(hào)碼效果
本文主要介紹了js實(shí)現(xiàn)顯示手機(jī)號(hào)碼效果的實(shí)例,具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-03-03兩種方法實(shí)現(xiàn)文本框輸入內(nèi)容提示消失
第一種方法:基于HTML5 input標(biāo)簽的新特性 - placeholder 。另外,x-webkit-speech 屬性可以實(shí)現(xiàn)語音輸入功能;第二種方法: 用span模擬,定位span,借助JS鍵盤事件判斷輸入,確定span里的內(nèi)容顯示隱藏2013-03-03javascript Error 對(duì)象 錯(cuò)誤處理
javascript常見error對(duì)象處理,錯(cuò)誤代碼集合2008-05-05使用JavaScript開發(fā)跨平臺(tái)的桌面應(yīng)用詳解
下面小編就為大家?guī)硪黄褂肑avaScript開發(fā)跨平臺(tái)的桌面應(yīng)用詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07