欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

HTMLZip 1.0 beta 的脱壳 (3千字)

HTMLZip 1.0 beta 的脱壳 (3千字)

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

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功