用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重建的輸入表是錯誤的,試幾次,憑經驗看就可以了)。