解决无法存盘
上次脱了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掉吧。
存盘试一下,大功告成了!
