天天看點

手動脫PeCompact 2.20殼實戰

作者:Fly2015

PeCompact殼又是一個沒有聽說過的殼,需要脫殼的程式是吾愛破解教育訓練的第一課的選修作業四。最近對脫殼有點上瘾了,當然也遭受了脫殼受挫的無奈,但是比較幸運還是把這個殼給搞了。

對加殼程式進行查殼。

工具DIE顯示程式加的是PeCompact殼,并且原來沒加殼的程式使用Microsoft Visual C/C++(2008)編寫的,這一點對于查找原程式的真實OEP非常有幫助。

手動脫PeCompact 2.20殼實戰
手動脫PeCompact 2.20殼實戰

OD載入加殼的程式進行分析,加殼程式的入口點的彙編代碼。

手動脫PeCompact 2.20殼實戰

F8走了幾步,坑啊,寫殼的作者在代碼中設定了異常,例如上圖中辨別的指令就會導緻F8單步的時候觸發向位址0指派的異常,即使将這兩條指令Nop掉,後面的指令中F8單步跟蹤也會觸發異常。

手動脫PeCompact 2.20殼實戰

要對這個加殼程式進行脫殼,就必須規避觸發指令中異常的問題。是不是不能處理呢?還是有辦法規避異常問題的,還好加殼的作者比較善良。

既然F8單步的方法不能處理,那就想另外的辦法對加殼程式進行脫殼。Ctrl+F2再次載入該加殼程式進行調試分析,并在函數VirtualProtectA和VirtualProtectExA上設定斷點(直接使用OD提供的API設定斷點插件在API函數的上設定斷點),如圖。

手動脫PeCompact 2.20殼實戰

F9運作4次,此時OD中的程式的狀态如圖。坑啊,這個殼的IAT表在不經意中就被暴漏了,IAT表的起始位址VA為432000。

手動脫PeCompact 2.20殼實戰

Alt+F9讓程式從系統臨空回到使用者程式的臨空,停在使用者程式的指令代碼中如圖。

手動脫PeCompact 2.20殼實戰

Ctrl+F9執行完所在的函數到Retn指令處,F8單步回到上一層的調用方函數中如圖。

手動脫PeCompact 2.20殼實戰

Ctrl+F9再次執行完所在的函數到Retn指令處,F8單步回到上一層的調用方函數中如圖。

離脫殼已經很近了,直覺告訴位址00455D8E  jmp eax中EAX儲存的值就是原程式真實OEP的位址。 

手動脫PeCompact 2.20殼實戰

在位址00455D8E處F2斷點,F4/F9運作到此處,得到EAX=0041DDAC即為原程式真實的OEP的VA位址。

手動脫PeCompact 2.20殼實戰

F7單步跟進到位址0041DDAC處,選中部分記憶體資料,Ctrl+A分析記憶體資料,終于見到了光明。

手動脫PeCompact 2.20殼實戰

OK,原程式的OEP找到了,使用Load PE和RECImport 工具或者Scylla工具進行程式的完美脫殼,IAT表的修複也比較順利。

手動脫PeCompact 2.20殼實戰

運作一下脫殼後的程式,證明脫殼成功。

手動脫PeCompact 2.20殼實戰