1. 程式人生 > >內嵌補丁練習(一)

內嵌補丁練習(一)

ont 校驗和 經歷 info 長度 mil str font call

內嵌補丁練習(一)

0x00 前言

首先介紹以下運行時壓縮或者運行解壓文件,這類文件通常是代碼在運行之前已經壓縮過或者代碼被加密過,在運行過程中在進行解壓縮或者解密的PE文件。通常這樣做的目的可能為了壓縮文件體積或者加密代碼保護代碼安全。下圖位運行時解壓縮文件和普通壓縮文件對比。

技術分享圖片

0x01 調試查看代碼解密過程

不載入od運行查看大致的界面過程。技術分享圖片技術分享圖片

由上圖可知大致可以判斷調用了MessgaBox函數。 載入OD查看代碼流

見下圖:

技術分享圖片

由上圖我們可以分析出在401007後面的代碼都是加密的,所以401001出的調用應該就是代碼的解密函數。我們F7進入該函數。如下圖:

技術分享圖片

進入之後發現4010F5之後的代碼依然加密了。前面有個

call 40109b,我們猜測這依然還是一個解密函數,我們還是F7進入函數。如下圖:

技術分享圖片

可以看到圖中有兩個循環結構,碰到這種結構可以猜測是否位循環解密或者循環解壓結構。我們可以看到mov ebx eax 這句話,把地址4010f5傳遞給ebx然後ebx進入循環體,這應該就是解密4010f5這一塊的代碼,長度為44h

技術分享圖片

我們移動到4010AF處按F4運行到此處。觀察ecx以及ebx的值。當ecx=0ebx=00401249跳出循環(就是解密4010f5——401249這一段代碼)。接下來運行至下一個callF7進去。如下圖:

技術分享圖片技術分享圖片

由上圖可以知道這也是一個代碼解密過程,將起始地址為401007(這是前面所提的加密代碼區)的一塊大小為

7f的代碼解密。我們F4跳過。接下來又來到了一塊循環區域,如下圖:

技術分享圖片

上圖可知解密代碼從地址004010F5開始的大小為154h的區域,其實這是一個二次解密區,仔細看看第一次解密的區域,也是從004010F5開始的,所以這塊地址經歷了兩次加密。跳出這個循環來到下圖區域:

技術分享圖片

F7進入CALL 401039處得到下圖:

技術分享圖片

仔細分析此處代碼發現這其實是取004010F5後面得到154h代碼相加到EDX處,如果值不是31EB8DB0這跳轉至錯誤,這是防止代碼代碼被篡改的校驗和。在地址401083接下下代碼跳轉至40121e處,如下圖:

技術分享圖片

技術分享圖片

這種情況我們先把分析去掉得到原始代碼,如下圖:

技術分享圖片

看到上圖幾個熟悉的函數沒,我們剛剛從校驗那裏跳轉過來,這裏應該就是程序的

OEP了。至此程序執行過程就明白了。

程序的流程如下:

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 總結

過程中碰到循環過程就要留意了,仔細觀察寄存器的值的變化。還有就是留意利用校驗和來判斷代碼是否被篡改的操作。明天將進行內嵌補丁的練習。

內嵌補丁練習(一)