• 标 题:PE-Crypt V.1.02 之手動脫殼 (2千字)
  • 作 者:C-pen
  • 时 间:2000-10-6 14:46:17
  • 链 接:http://bbs.pediy.com

[前      言]:寫這篇文章的目的是簡單的介紹PE-Crypt的保護機制,和Imp_list這個工具的應用,我想在大家讀過這篇文章後,大概也不會親自去實
踐吧!理由是它蠻繁雜的,而且它已經有優秀的脫殼工具,這個工具
是Bye PE-Crypt V1.02  by Iczelion & Plushmm, 這兩個軟體均可
在Program tool 中下載.


[保 護 機 制]:
(1)    Import Table 重新編碼:此點與Asprotect相近,但Asprotect將其分割
    的更細,讓你更難重建,所以在這一部份,PE-Crypt可算是比卡丘,而
    Asprotect則是進化了的雷丘.
(2)    防內部下BPX:你在PE-Crypt 下BPX是無法中斷的,因為它調用
    VXD call 進入0級,將你下的斷點Recover,使你的斷點失效,但它卻
    沒防BPM (這也需要進入0級,Win9X下可用Cdllgate或是hook IDT
    上的中斷去改drx的值)
(3)    可能因為調用VXDcall的關係,BW2K無法找出它的OEP.

[使 用 工 具]: (1) Soft-ICE V.4.01
(2) Procdump32
(3) Imp_list V.1.05
(4) Hex Workshop

[脫      殼]:
(1)    先用Procdump32去分析它:
    Entry point:29000
    Size of image:32000
    Image Base:400000
    Section    .idata
            VS:1000
            VO:15000
            RS:97C
            RO:13E00
(2) 用Symbole loader載入PECrypt.exe,下d 415000,此時.idata還未解
  壓,下BPM 00415000,按F5數次,直到出現Image_Import_Descriptor
  的結構,此時觀察一下.idata section 的結構,你會發現,在Image_Thunk_Data 矩陣中,有些已經被編碼了,而Image_Import_By_Name的結構還在.
  你可以在此時dump出 .idata section,然後再去重建, 估計Bye PE-Crypt 就是用這個方法.
我們打算用Imp_list來重建Import Table,故我們在Image_Import_By_Name 中的最後一個成員,下bpm斷點.按F5一直到這個函數也被編碼完成後,你再觀察一次.idata section 的結構
變成:
Image_Import_Descriptor <--已被編碼
Image_Thunk_Data <--已被API位址所取代(這也是我們用Imp_list的原因)
Image_Import_By_Name <--已被編碼,所有的API Name都不見了.

(3) 觀察完.idata section 後,下BD* ,按F8 Trace,你會經過繁複的解壓
  過程,一直到:
  :0042E112  JMP EAX  &szlig; 此時 EAX=0040644D
  聰明的你看到位址差那麼多,那你應該知道這就是OEP了.
  此時下a eip / jmp eip ,按F5離開,用Procdump,dump(full),存檔,改
  EP為0000644D, Import Table RVA=00015000
(4) 重建Import Table : 按Ctrl-D叫出Soft-ICE,此時還在PE Crypt的
  領空, 我們為了要用Imp_list來重建Import Table, 故我們必須只
  保留Image_Thunk_Data這個矩陣結構,其餘將其清掉:
  f 415000 l 415068-415000 00
  f 415348 l 415cd0-415348 00
  執行Imp_list ,它會產生三個文件,Address.txt,Import1.bin,
  Imprt2.bin,沒有Import0.bin,那就有可能是因為Image_Thunk_Data
  的結構有錯, 以至於Imp_list無法工作,OK我們打開Address.txt
  觀察一下, 你會看到:
BFF77796 ->BFF77796[1]=(00000068)KERNEL32.DLL!GetModuleHandleA
在下面你又會看到:
BFF77796 ->BFF77796[1]=(000001D8)KERNEL32.DLL!GetModuleHandleA
奇怪!怎麼會有兩組相同的API,肯定有一組是錯的, 你仔細的觀察, 會發現在
(000001D8)以前的Image_Thunk_Data的結構是錯的, 這也是作者設下的障眼法
按Ctrl-D再叫出Soft-ICE, 下
f 415068 l 4151d4-415068 00
再執行一次Imp_list, 這次會重建的很好, 有Import0.bin
        (5 ) 最後的工作: 用Hex workshop打開Import0.bin, 選取適當的方塊
黏貼至我們dump下來的檔案至偏移13E00處.

      JOHNSON    2000/10/06