逆向脫殼——脫殼后的修復


脫殼后的修復

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,獲取輸入表。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM