脫殼一般流程
-
資訊搜集
檢視殼是什麼是什麼語言編寫的,以及是什麼類型的殼
搜集到資訊可以用于判斷殼/OEP 的二進制特征或API特征
vs2013特征:
二進制特征 E8???E9
API特征 GetSystemTimeAsFileTime
vc6.0特征
API特征 GetVersion
Delphi特征
GetModuleHandleA
-
找到OEP
可以通過中調用的函數找到IAT表,并從中判斷IAT表是否有被加密
如果沒有被加密就可以直接dump,并脫殼
-
解密IAT
如果IAT被加密就需要根據殼的類型進行解密,在将進行dump
資訊搜集
-
查殼
首先我們在脫殼之前要知道殼使用什麼語言編寫,以及是什麼類型的殼,是以第一步我們需要使用PEID/ExeInforPE進行查殼,
由連結器版本6.0我們可以猜測,這個程式是vc6.0編寫,是以在函數GetVersion中可能找到OEP 找到OEP找到函數GetVersion并下斷點
運作到斷點處看右下角堆棧視窗觀察函數傳回位址
位址以7開頭的都是系統代碼
在沒有重定位的情況下,主子產品區域都是以4開頭
找到OEP 檢視IAT表,發現IAT表儲存的位址,不大對
對IAT進行了加密,那麼就要對IAT表下一個寫入斷點,然後重新跑起來,當對函數位址加密後,在寫入的時候就會斷下來,在函數的上面一般都可以找到加密的迹象,隻是有時候代碼會特别的多,很難找到
OEP中沒有代碼的樣子
OD報錯是因為,OEP處的代碼是殼解密後生成的,是以要把OEP處的斷點換成硬體執行斷點,注意硬體斷點一次最多隻能下四個,是以一定要勤儉持家
第一次斷下來的位置為殼進行加密的地方,是以需要繼續F9,找到寫入IAT的地方
這裡可以看到對函數位址進行異或加密,并将位址儲存到局部變量中,是以我們需要修改殼代碼,删除異或代碼,在擷取到函數位址後,将其放入IAT中。
然後繼續跑,斷到OEP處
我們可以看到,IAT已經可以擷取正常的函數位址了
從OEP處将檔案dump下來
使用工具importREC修複IAT表
最後選擇轉儲到檔案選擇之前dump的exe,就完成了脫殼