首先是我最近遇到一個網馬,加密結果如下:
是不是看的很頭疼啊?亂七八糟的,無從下手了,不是簡單的解密工具就行了吧?我們一起來動手解決掉它吧!首先我們來一起了解兩個關鍵詞“document.write”和“eval”。
“document.write”在JAVASCRIPT是一條打印語句,而“eval”指的是eval()函數,這個函數可以把一個字符串當作一個JavaScript表達式一樣去執行它。如果在JS的加密代碼中碰上document.write,我們一般把它改成“alert”,如果遇到“eval”一般改成“document.write”。我們首先吧eval改為document.write然后運行看看結果:
這段代碼,最快的防翻譯辦法就是加入上面地址中http://www.baidu.com/s?wd=document,返回的結果是:
下面我們一起看看天網被掛過的一個網馬:
一堆亂七八糟的,都不知道是什么。如何解讀?其實在最快最簡單的辦法就是瀏覽這個頁面,保存時候選擇中歐(ISO)編碼就可以了。
得到結果:
保存時候依然選擇中歐(ISO)編碼即可得到如下結果:
接下來就來看一個有貌似點難度的了。最近黑客防線出的《黑暗網馬》使用了火狐里一個人出的加密工具。解密過程需要提供密碼,難道是為了防止修改?看起來有點類似md5加密,難道真的不可逆?1K的網馬可以加密到15K甚至更大,太可怕了吧?讓我們一起來把他解密出來吧!
意思就是調用pass驗證函數,如果為真,就繼續執行里面的內容。XOR是運算符,對兩個表達式進行邏輯“異或”運算。這里就不詳細了解了。關鍵是最后的Document.write(cuteqq3)了解網頁代碼的人就知道這段具體的意思就是,如果密碼驗證正確。就輸出cuteqq3這個函數里的內容。當我們遇到document.write的時候我們一般把它改成“alert”得到初步解密:
這里我們就遇到一個問題。Alert根據里顯示器的大小顯示內容。無法完整顯示出內容。怎么辦?我們引入一段javascript代碼:document.getElementById('textfield').value=cuteqq3;替換掉原來的document.write(cuteqq3);然后在頁面的</head>
<body>和<script></script>之間添加一段,效果如下:
<html>
<;head>
<title>網馬</title>
</head>
<body>
<form id="form1" name="form1" method="post" action="">
<label>
<textarea name="textfield" cols="100" rows="50"></textarea>
</label>
</form>
<script>
….這里省略解密部分
</script>
這里的意思是建立一個文本框,然后吧剛才的cuteqq3的內容賦值給文本框,Textfield是文本框的名稱。可以自己修改。但是必須修改document.getElementById('textfield').value里對應的名稱,再次運行剛才的網馬得到結果:
剛才加密過代碼大小是:
解密后是:
至于里面的\x72\x65\x73\x70\x6F\x6E\x73\x65\x42\x6F\x64\x79這樣的代碼,我們就可以用簡單的辦法突破了。
十六進制轉義字符串如下:
<SCRIPT LANGUAGE="JavaScript">
alert("\x72\x65\x73\x70\x6F\x6E\x73\x65\x42\x6F\x64\x79")
</SCRIPT>
就可以顯示出來了,順便說下。剛才的加密頁面里用到了防止查看源代碼的技術。就是適用下面的代碼
<noscript>
<iframe src=*>
</iframe>
</noscript>
這個是申通快遞被掛馬的時候抓到的,后來無意中得知這個加密方式用到的是JS混淆,http://www.cha88.cn/safe/JSencode.php這個網站有這個加密方式,但是沒有解密方式。怎么辦?簡單!
大家一起看看最后這段代碼:
t=utf8to16(xxtea_decrypt(base64decode(t), '\x64\x63\x75\x6d\x65\x6e\x74'));//對t數組進行提取、重組、解密處理
window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x77\x72\x69\x74\x65"] (t);//輸出加密后的t的內容
是不是有什么感覺?覺得像什么?
我們把\x64\x6f\x63\x75\x6d\x65\x6e\x74和\x77\x72\x69\x74\x65分別用我們剛才的alert的辦法解密出來,他們分別對應的是document和write,也就是說最后這2行的意思就是對t數組進行提取、重組、解密處理并輸出最后正確的結果。知道這個我們就很容易理解了,所有網馬到最后為了輸出讓瀏覽器識別,都要進行最后的解密輸出。通常就是document.write和eval里的內容了。那么我們用剛才的document.getElementById('textfield').value=t;替換掉window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x77\x72\x69\x74\x65"] (t);并再頁面頂端的<body>下面加入如下代碼:
<form id="form1" name="form1" method="post" action="">
<label>
<textarea name="textfield" cols="100" rows="50"></textarea>
</label>
</form>
再次運行網馬。即可得到第一層解密的結果:
這還不是我們要的最終結果。還記得上面講過的?遇到eval就替換為alert:
順便提下最近比較流行的溢出型網馬的解密方式:var shellcode = unescape("邐"+"邐"+
這樣的代碼其實是可以翻譯成明文的,這里使用的加密方式是將ASCII轉換為unescape,對應解密方式就是反過來啦,借助工具
就可以輕易解密了,這樣你就可以再沒有生成器的時候將別人的網馬改為自己的了!
無意中獵取到一個Oday的話,就happy了O(∩_∩)o…
最后終結:
我們適用到的幾個關鍵詞和辦法:
關鍵詞:
1. document.write
2. eval
3. alert
4. <noscript>
<iframe src=*>
</iframe>
</noscript>
5.document.getElementById('textfield').value=t;
<form id="form1" name="form1" method="post" action="">
<label>
<textarea name="textfield" cols="100" rows="50"></textarea>
</label>
</form>
用法:
碰上document.write,我們一般把它改成“alert”,如果遇到“eval”一般改成“document.write”,遇到alert無法顯示完整代碼時適用document.getElementById('textfield').value=t;將他賦值給一個文本框,然后再<form id="form1" name="form1" method="post" action="">
<label>
<textarea name="textfield" cols="100" rows="50"></textarea>
</label>
</form>
表單中顯示出來,如果遇到使用了
<noscript>
<iframe src=*>
</iframe>
</noscript>
而無法顯示網頁代碼的。就到IE緩存中尋找被保存到本地的網馬文件,用我提供的辦法應該可以解開絕大部分的網馬了,
希望大家看完知道不是盲目的套用,而是可以舉一反三!這樣才能不斷進步。沒有你做不到的,只有你想不到的!