• 标 题:HTMLZip 1.0 beta 的脱壳 (3千字)
  • 作 者:hying
  • 时 间:2001-2-3 15:03:54
  • 链 接:http://bbs.pediy.com

用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重建的输入表是错误的,试几次,凭经验看就可以了)。

  • 标 题:还是有些不明白 (294字)
  • 作 者:henryw
  • 时 间:2001-2-4 8:08:44

由于实在太菜,看了hying大侠的文章,还是有两点不明:

1. "用trw2000载入h.exe,用F8运行几步后,用d 457100可看到如下:(下面还有很多,不便都贴)"

  怎么知道要看457100这个地址的?

2. "在RVA中填入57000,Virtual size改为1000,Level选3,点击Rebuilt import"

  57000这个地址又是如何得到的?

  • 标 题:请进 (365字)
  • 作 者:hying
  • 时 间:2001-2-4 10:22:37

用trw2000载入h.exe,用F8运行几步,如果走得太多,就会出现非法操作,为什么呢?因为程序跳到了C12560处,此处的程序是原程序动态生成的,脱壳后不会保存。C12560这个地址是放在内存4571FC处,然后前后看一下,差不多是从457100处开始的(再往前都是00)。下面的457000只是取了个整数,你取457100,Virtual size改为F00甚至更小一些也没关系,只要保证把所有的错误地址都包含在里面就可以了。