天天看點

脫殼之加密殼

脫殼一般流程

  1. 資訊搜集

    檢視殼是什麼是什麼語言編寫的,以及是什麼類型的殼

    搜集到資訊可以用于判斷殼/OEP 的二進制特征或API特征

    vs2013特征:

    二進制特征 E8???E9

    API特征 GetSystemTimeAsFileTime

    vc6.0特征

    API特征 GetVersion

    Delphi特征

    GetModuleHandleA

  2. 找到OEP

    可以通過中調用的函數找到IAT表,并從中判斷IAT表是否有被加密

    如果沒有被加密就可以直接dump,并脫殼

  3. 解密IAT

    如果IAT被加密就需要根據殼的類型進行解密,在将進行dump

資訊搜集

  1. 查殼

    首先我們在脫殼之前要知道殼使用什麼語言編寫,以及是什麼類型的殼,是以第一步我們需要使用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,就完成了脫殼

繼續閱讀