HTMLZip 1.0 beta 的脫殼 (3千字)

看雪資料發表於2001-02-03

用fi240檢測,報告為win gui,說明fi240不認識,但是我估計它是用ASProtect1.0以上版本加的殼,為什麼呢?因為我在跟蹤過程中發現如下一段程式碼:
0167:00C00684  PUSH    EBP
0167:00C00685  MOV      EBP,ESP
0167:00C00687  ADD      ESP,BYTE -0C
0167:00C0068A  CALL    00BF2F7C
0167:00C0068F  JNZ      NEAR 00BF3C58
0167:00C00695  CALL    00BF4114
0167:00C0069A  CALL    00BF8894
0167:00C0069F  CALL    00BF9224
0167:00C006A4  CALL    00BFB584
0167:00C006A9  CALL    00BF3C58
0167:00C006AE  MOV      ESP,EBP
0167:00C006B0  POP      EBP
0167:00C006B1  RET      0C
從ASProtect1.0開始(以前版本沒試過),每次都有這樣的幾個連續的CALL,而且最後一個必須用F8進入。還有它也在輸入表裡做文章,所以我估計是用ASProtect加的殼。既然是這樣,那首先考慮的就是用caspr,但試了一下,脫不了。那就只有手動了。
    以前要找程式正確的入口點比較難,有了衝擊波2000現在就簡單多了。執行衝擊波2000 0.2,按下track,然後執行htmlzip,它會彈出一個對話方塊,確定後程式繼續執行。衝擊波顯示enter point為4542E4。退出htmlzip,執行trw2000。下斷點bp 4542E4,再執行htmlzip,程式最終會停在4542E4處,執行命令suspend,暫停htmlzip返回windows下,執行procdump162,在Task中尋找htmlzip,點選右鍵,選擇Dump(full),將htmlzip脫殼儲存,比如儲存為h.exe,再選擇PE Editor,開啟h.exe,將Entry Point由1000改為542E4,加上Image Base的400000,實際入口即為4542E4。最後不要忘了,再切回到trw2000,將暫停的程式執行,然後關閉。
    如果對於一般的加殼,這樣脫後一般就可以了,但由於是用ASProtect加的殼,它改動了程式的輸入表(程式呼叫dll檔案的呼叫入口地址表),所以直接執行會非法操作。需要修復輸入表。修復可分全手動與藉助特定工具兩種,先看全手動。
用trw2000載入h.exe,用F8執行幾步後,用d 457100可看到如下:(下面還有很多,不便都貼)
0030:00457100 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0030:00457110 00 00 00 00 00 00 00 00-7C 22 C1 00 88 22 C1 00 ........|"???
0030:00457120 94 22 C1 00 A0 22 C1 00-AC 22 C1 00 BC 22 C1 00 ????????
0030:00457130 C8 22 C1 00 D8 22 C1 00-E8 22 C1 00 F4 22 C1 00 ????????
其中的00C1227C、00C12288等就是被破壞後的輸入表地址,我們需要把它復原。那這些地址到底指向哪呢?先看00C122C8的指向。執行未脫殼的程式。在4542E4處停下,命令U C122C8,看到:
0167:00C122C8  PUSH    EBP        \
0167:00C122C9  MOV      EBP,ESP         >注意這3行
0167:00C122CB  SUB      ESP,BYTE +08    /
0167:00C122CE  PUSH    DWORD BFF80262
0167:00C122D3  RET        ----------------------------------------|
再用命令U BFF80259,看到:                    |
0167:BFF80259  RET    04                    |
KERNEL32!VirtalAlloc                        |
0167:BFF8025C  PUSH    EBP         \            |
0167:BFF8025D  MOV      EBP,ESP         >同上3行        |
0167:BFF8025F  SUB      ESP,BYTE +08    /            |
0167:BFF80262  CMP      DWORD [EBP+0C],7FC00000        跳到這<-----|
0167:BFF80269  PUSH    EBX
我想大家也明白了。C122C8處的空間是程式動態申請的,脫殼時不會被保留,所以脫殼後就無法正常執行,真正的入口點應該是BFF8025C,只要將00C122C8改為BFF8025C,程式執行就正常了。但輸入表很長,全部手動很費時間,估計對這個程式得花一天時間才行,而且容易出錯。所以還是藉助工具來得方便。工具用Imp_list 1.12。
    先正常執行htmlzip,再執行Imp_list,在Process name中查詢htmlzip然後單擊,Module name中會列出它呼叫的dll檔案,去掉Auto-detect import前的鉤,在RVA中填入57000,Virtual size改為1000,Level選3,點選Rebuilt import,可能會跳出出錯對話方塊,不用管它,在Imp_list同目錄下的Import1.bin中就是正確的輸入表,用16進位制編輯器將正確的輸入表覆蓋掉錯誤的輸入表就OK了(不知什麼原因,有時用Imp_list重建的輸入表是錯誤的,試幾次,憑經驗看就可以了)。

相關文章