內嵌補丁練習(一)
內嵌補丁練習(一)
0x00 前言
首先介紹以下運行時壓縮或者運行解壓文件,這類文件通常是代碼在運行之前已經壓縮過或者代碼被加密過,在運行過程中在進行解壓縮或者解密的PE文件。通常這樣做的目的可能為了壓縮文件體積或者加密代碼保護代碼安全。下圖位運行時解壓縮文件和普通壓縮文件對比。
0x01 調試查看代碼解密過程
不載入od運行查看大致的界面過程。
由上圖可知大致可以判斷調用了MessgaBox函數。 載入OD查看代碼流
見下圖:
由上圖我們可以分析出在401007後面的代碼都是加密的,所以401001出的調用應該就是代碼的解密函數。我們F7進入該函數。如下圖:
進入之後發現4010F5之後的代碼依然加密了。前面有個
可以看到圖中有兩個循環結構,碰到這種結構可以猜測是否位循環解密或者循環解壓結構。我們可以看到mov ebx ,eax 這句話,把地址4010f5傳遞給ebx然後ebx進入循環體,這應該就是解密4010f5這一塊的代碼,長度為44h。
我們移動到4010AF處按F4運行到此處。觀察ecx以及ebx的值。當ecx=0且ebx=00401249跳出循環(就是解密4010f5——401249這一段代碼)。接下來運行至下一個call,F7進去。如下圖:
由上圖可以知道這也是一個代碼解密過程,將起始地址為401007(這是前面所提的加密代碼區)的一塊大小為
上圖可知解密代碼從地址004010F5開始的大小為154h的區域,其實這是一個二次解密區,仔細看看第一次解密的區域,也是從004010F5開始的,所以這塊地址經歷了兩次加密。跳出這個循環來到下圖區域:
F7進入CALL 401039處得到下圖:
仔細分析此處代碼發現這其實是取004010F5後面得到154h代碼相加到EDX處,如果值不是31EB8DB0這跳轉至錯誤,這是防止代碼代碼被篡改的校驗和。在地址401083接下下代碼跳轉至40121e處,如下圖:
這種情況我們先把分析去掉得到原始代碼,如下圖:
看到上圖幾個熟悉的函數沒,我們剛剛從校驗那裏跳轉過來,這裏應該就是程序的
程序的流程如下:
1)EP處連續兩次跳轉至第一次解密處地址40109B。
2)40109B對起始地址為004010F5 大小為154進行XOR 44解密。
3)運行到004010BD處開始對401007處大小為7F的區域進行XOR 7解密。
4)運行至401039 處,開始對004010F5 大小為154的區域進行XOR 11解密,這個是此區域的第二次解密。
5)運行至401039 對解密後的004010F5 大小位154的代碼區域進行校驗和計算
6)運行至401083跳往OEP處
7)OEP開始執行原程序
0x02 總結
過程中碰到循環過程就要留意了,仔細觀察寄存器的值的變化。還有就是留意利用校驗和來判斷代碼是否被篡改的操作。明天將進行內嵌補丁的練習。
內嵌補丁練習(一)