欢迎来到 嗅灵易学

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

解决无法存盘

解决无法存盘

上次脱了IconEdit2 v2.3的壳,发现有个重大问题,就是无法存盘。

v2.3的破解倒不难,很容易抓出注册码来,用
Name: chilly200
Code: 8kHXkiJ8qGfk9ig7hwy7bhMT
注册成功后,存盘时不会弹出什么对话框,好像一切正常似的,可实际上却没有
存到,在硬盘上找不到存盘的文件。而原版则可以。

再来找BUG,载入原版,存盘的时候下bpx createfilea,拦住以后F12几次返回
程序空间,如下:

018F:0048D780  CALL     00403B8C
018F:0048D785  CALL     00491098
018F:0048D78A  TEST     AL,AL
018F:0048D78C  JNZ      NEAR 0048D9A2
018F:0048D792  PUSH     EBP
018F:0048D793  CALL     0048D1D0      <-- 这个CALL是关键。
018F:0048D798  POP      ECX           <-- 停在这
018F:0048D799  JMP      0048D9A2

第二次,用F8进入上面的CALL,一直F10跟到这里:

018F:0048D1F5  PUSH     DWORD 0048D5DB
018F:0048D1FA  PUSH     DWORD [FS:EDX]
018F:0048D1FD  MOV      [FS:EDX],ESP
018F:0048D200  CALL     0048A2EC       <-- 这个CALL关键,要进去
018F:0048D205  JMP      0048D5CC
018F:0048D20A  SUB      [EDI+9C849801],EBP
018F:0048D210  MOV      CH,E9
018F:0048D212  JS       0048D1F0
018F:0048D214  STOSB  
018F:0048D215  DB       82
018F:0048D216  PUSH     DWORD 1D8D0E8D
018F:0048D21B  MOV      ESP,57A1446B
018F:0048D220  SHL      DWORD [ESI+9B724265],CL
018F:0048D226  MOV      DH,1D
018F:0048D228  OUTSB  

上面这个CALL里面肯定有SMC,因为带过后代码变了:

018F:0048D1F5  PUSH     DWORD 0048D5DB
018F:0048D1FA  PUSH     DWORD [FS:EDX]
018F:0048D1FD  MOV      [FS:EDX],ESP
018F:0048D200  CALL     0048A2EC
018F:0048D205  JMP      0048D20B    <-- 变了!上面的CALL好厉害呀
018F:0048D20A  NOP                  <-- 这里原本是花指令,呵呵
018F:0048D20B  MOV      EAX,[EBP+08]
018F:0048D20E  MOV      EAX,[EAX-04]
018F:0048D211  MOV      EAX,[EAX+02E0]
018F:0048D217  MOV      AX,[EAX+0246]
018F:0048D21E  SUB      AX,BYTE +10
018F:0048D222  JZ       NEAR 0048D2C1
018F:0048D228  SUB      AX,BYTE +10
018F:0048D22C  JNZ      NEAR 0048D35C
018F:0048D232  LEA      EAX,[EBP+FFFFF342]
018F:0048D238  MOV      ECX,FF
018F:0048D23D  MOV      EDX,0CBE
018F:0048D242  CALL     00402B70

因此跟进这个关键CALL去追踪,一步步耐心的跟,最终发现,这段代码用到了原
来壳中的一些代码和数据,一共有三段(当然是一段一段来的,不是一下子全找
到的,呵呵),全部dump出来,分别是:
 file      start      end     lenth
add1.bin:  0530000   0535000   5000
add2.bin:  11B1000   11C8000   17000
add3.bin:  11D0000   11D9000   9000
注意,这三段不是在OEP处dump的,而要在
cs: 00491DF9 CALL 00448FE0 的CALL过后再dump(因为这里面好像也有些SMC)

不巧的是importREC加的段.mackt的RAV和add1的有冲突,将.mackt的RAV改为
140000,当然也要改文件中相关的IT和IAT的RAV值(用查找替换就行了),最后
再改一下180H处的00001300为00001400即可。
然后把上面dump出的三个文件内容添加到原脱壳后的文件中,用PEditor1.7分别
添加三个段.add1;.add2;.add3,并改好相应的数值。
添第二个段的时候,PEditor说PE头没有足够的空间添加段了,不知道是怎么回
事,诚请高手指点一下!我看到有几个段的size是0,估计删掉应该可以吧,可
是PEditor中却不能删,用Procdump的PE editor删掉了。然后就可以继续添加段
了。最后用rebuilder只选中make PE Header win nt/2000 compatible进行PE头
文件重建,就OK了。

不幸,还是不能成功存盘。继续跟踪知道,dump出来的数据在使用的时候已经改
变了,是有什么程序又用了SMC把我们千辛万苦抓出来的数据和代码给改了,真是
可恶呀!我也尝试了把这几个段改成只读,没成功。只好继续耐心的追踪,终于
找到了这段SMC的代码在这里:

018F:0048A1EC  MOV      BYTE [004935DC],01 <-- 这里必须置1,存盘判断
018F:0048A1F3  PUSH     EDX
018F:0048A1F4  PUSH     EAX
018F:0048A1F5  CALL     NEAR [004935E0]    <-- CALL壳里的一段SMC
018F:0048A1FB  RET    
就是这里改变了我们dump出来的东西,把从push开始的全NOP掉吧。

存盘试一下,大功告成了!

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

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

0 0 0 举报
复制成功