用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重建的输入表是错误的,试几次,凭经验看就可以了)。
- 标 题:HTMLZip 1.0 beta 的脱壳 (3千字)
- 作 者:hying
- 时 间:2001-2-3 15:03:54
- 链 接:http://bbs.pediy.com