1. 程式人生 > >手動脫殼—dump與重建輸入表

手動脫殼—dump與重建輸入表

很久沒玩逆向了,今天權當複習,順便做個筆記

文章中用到的demo下載地址:

附件中包含demo以及文章word原稿

用到工具:

Ollydbg

LordPE

ImportREC

這些工具請自行下載準備

Dump原理這裡也不多做描述,想要了解google it!常見的dump軟體有LordPE,ProcDump,PETools等本文以LordPE為例

首先,開啟 LordPE,由於此時機器上只有一個漢化版,也懶得花時間去找原版了。我們開啟選項,設定成如圖樣子:

 

設定好後,在LordPE的程序視窗選擇相關程序(這裡以加了Aspack殼 的dumpDemo.exe為例),單擊右鍵,執行【完整轉存】DumpFull,儲存即可,如果有Anti-Dump,先執行修正映象大小(correct ImageSize),再dump full。儲存名字預設為dumped.exe

重建輸入表:

一般而言,一個加密的外殼,破壞原有的輸入表是必有的功能。程式被dump出來後還需要重建輸入表,例如這個程式dump後執行提示:

 

這裡以ImportREC為例。在執行ImportREC之前,需要滿足:

  • 目標檔案完全被dump,另存為另一個檔案
  • 目標檔案正在執行中
  •  事先找到程式的真正入口(OEP)或IAT的偏移和大小

這裡使用堆疊平衡原理找OEP,由於找OEP不是本文重點,這簡單點說明過程:

1,OD載入,在執行完pushad後,看到各個暫存器被壓進

0012FFA4h~0012FFC0h中,如圖:

 

2,在OD中下硬體訪問斷點:

hr 12FFA4

3,按F9執行程式,外殼程式碼處理結束後,呼叫popad恢復現場環境,將訪問這些堆疊。OD就會中斷,此時離OEP不遠了。中斷如圖:

 

其實如果瞭解其原理,可以在PE檔案開始執行時,記下當時的ESP,假設是 12FFC4h,大多數程式第一句都是push 指令,就是對12FFC0h進行寫入操作,因此對其設定硬體寫斷點,(hr 12FFC0),就可以方便地來到OEP附近了。

4,回到正題,跟到Retn後發現程式來到

00401700 /.  55            PUSH EBP

這裡,按Ctrl+A讓OD分析一下,發現這裡就是真正入口點了,記錄之。

好像有點離體了。。。。回到剛才正題,執行ImportREC,在下拉框中選擇dumpdemo程序,然後在右邊OEP中填入我們獲取的OEP的RAV,這裡我們輸入1700(由於映像基質是00400000),然後點選 自動搜尋(IAT AutoSearch),讓其自動檢測IAT大小和偏移

如果出現如圖對話方塊,表示輸入的OEP發揮作用了


單擊 【獲取輸入表】(Get Imports)按鈕,讓其自動分析IAT結構得到基本資訊,如圖:


這裡有一個無效的,經過嘗試右鍵選單中的Trace level 1,2,3命令修復均無效,而且由圖中資料也可以看出這個指標式無效的,我們展開,右鍵【刪除指標資料】,現在全部都是有效的了。

5,修復已脫殼的Dumped.exe,選保證選中【增加新區段】(預設選中),再點選【修復轉存檔案】,開啟Dumped.exe,此時不需要手工備份,程式將建立檔案Dumped_.exe,此時OEP也被修正。我們執行Dumped_.exe,已經沒有剛才那個錯誤提示了。功能完全正確,確定就是比剛才的大了點(原檔案11.5k,這個修正後的36.0k),中間多了外殼資料和新增區段(.mackt)的輸入表資料。

6,如果不捨得新增一段區段的空間,也可以在.rdata中選取一段空白,這裡輸入000029C0,在單擊修復轉存檔案即可,這次修復後體積是32.0k,節省了4k  O__O”…