脫殼后的修復
IAT修復
IAT
導入地址表(IAT):Import Address Table 由於導入函數就是被程序調用但其執行代碼又不在程序中的函數,這些函數的代碼位於一個或者多個DLL 中.當PE 文件被裝入內存的時候,Windows 裝載器才將DLL 裝入,並將調用導入函數的指令和函數實際所處的地址聯系起來(動態連接),這操作就需要導入表完成.
為什么要手動修復IAT?
我們已經掌握了如何尋找OEP和脫殼,有的時候,Dump出來的時候不能正常運行,是因為還有一個輸入表沒有進行處理,這時候,我們可以嘗試手動修復IAT。
原理
程序的IAT是連續的排列的,所以我們只需要找到IAT的起始位置和末位置,就可以確定IAT的地址和大小。在壓縮殼中,我們只要找一個調用系統的API的Call的地址,然后在數據窗口中查找,確定IAT起始和結束地址。然后在OD中手動修復。
思路
- 1.查殼
- 2.找到程序入口
- 3.OD插件脫殼-->失敗
- 4.LoadPE脫殼-->失敗
- 5.用ImportREC自動修復-->失敗
- 6.手動查找IAT,用ImportREC進行修復-->成功
實驗過程
-
查殼,顯示FSG殼

-
我們用ESP定律法脫殼,關鍵跳轉后,沒有到OPE,右鍵分析,從模塊中刪除分析。

-
到達OPE

-
用OD的脫殼插件脫殼,這個插件是可以自動修復ITA的,如圖勾擇重建輸入表。

-
用OD自帶的插件脫殼以后,查殼顯示無殼,但不能運行。

-
換一種方法脫殼試試~用LoadPE脫殼
-
修正鏡像大小

-
還是不能運行
-
用ImportREC進行輸入表重建,嘗試修復程序,輸入剛剛調試時找到的OPE地址,點擊自動查找IAT

-
點擊獲取輸入表,工具自動幫你填充RVA,這里的RVA是IAT起始的偏移量。RAV是偏移地址的意思,如果說Windows裝載器將一個PE文件裝入 00400000h處的內存中,而某個節中的某個數據被裝入0040xxxxh處,那么這個數據的RVA就是(0040xxxxh- 00400000h)=xxxxh。

- 轉儲到文件,嘗試運行,殼已經沒有了,但是還是不行,不能運行……


- 那我們只有試一下手動修復了
- 隨便找一個調用系統的API的Call,如果這個函數的調用地址在IAT中,那么我們根據這個地址就能找到IAT的地址范圍。

- 在輸入表(IAT)中找到該地址

-
記錄地址0x425210,在命令下輸入 d 425210
-
到達數據窗口的這一段,這是IAT地址,名稱與輸入表重建工具中的函數對比,內容一致,可以確定這個CALL的調用函數地址在IAT中。

-
因為IAT段是連續的,因此向上找到開頭,向下找到結尾
-
IAT段開始:

-
IAT段結束

- 獲取IAT信息
起始:00425000
結束:00425510
RAV:0x00425000-0x00400000=0x25000
Size:0x0042410-0x00425000=0x510
- 進行修復,輸入IAT信息,RVA和SIZE,獲取輸入表。

- 轉存,運行成功~脫殼完成~

