首页
社区
课程
招聘
ASPack v2.12做Patch时,为什么会有这种问题?
发表于: 2012-2-2 16:04 4667

ASPack v2.12做Patch时,为什么会有这种问题?

2012-2-2 16:04
4667
一个CrackMe,PEid 检测:Borland Delphi 6.0 - 7.0
找到的关键跳转处:
00476C59   /75 18               jnz short Project.00476C73     ; 关键跳转
只需要将jnz 更改为 jz 就可以暴力破解了。
然后我将Crack加了一个ASPack v2.12的壳。
准备直接给壳做个Patch。
开始直接使用ESP定律,到达
004A73B0   /75 08               jnz short Project[.004A73BA  //ESP 到达这里
004A73B2   |B8 01000000         mov eax,1
004A73B7   |C2 0C00             retn 0C
找到的空数据段的位置:
004A75A8    0000                add byte ptr ds:[eax],al    // 空数据起始位置
004A75AA    0000                add byte ptr ds:[eax],al
004A75AC    0000                add byte ptr ds:[eax],al
004A75AE    0000                add byte ptr ds:[eax],al
004A75B0    0000                add byte ptr ds:[eax],al
004A75B2    0000                add byte ptr ds:[eax],al

第一步更改:
然后更改代码:
004A73B0   /E9 F3010000         jmp Project[.004A75A8
004A73B5   |90                  nop
004A73B6   |90                  nop
004A73B7   |C2 0C00             retn 0C
004A73BA   |68 786F4700         push Project[.00476F78

第二部更改:
空数据段更改为:
004A75A8    C605 596C4700 74    mov byte ptr ds:[476C59],74
004A75AF  - E9 C4F9FCFF         jmp Project[.00476F78     //直接跳转到OEP
004A75B4    0000                add byte ptr ds:[eax],al

然后全选进行保存,程序报错。
跟踪调试后,发现进入OEP,全部都是空数据。

接着我把步骤拆开,先进行第一步更改,保存,程序当然无法运行,
我对无法运行的文件,进行第二步更改,报讯,程序可以正常运行,达到patch目的。

我的问题:
为什么直接保存全部更改,程序不能正常运行,分步更改却可以达到目的?

附件中有加壳和未加壳的CrackME,请帮忙解答,小弟是菜鸟,很多不太明白。。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
最重要的东西你不上传,报错的程序。
2012-2-2 16:53
0
雪    币: 1363
活跃值: (139)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
按照第一种方法直接会报错,加壳的源程序已经都添加到附件了,如果你确定全部保存后,不会报错,那证明会有跨平台的问题,如果你没有调试完成,你没有发言权。。。
2012-2-2 17:48
0
雪    币: 517
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
帖子不多,火气不小。

偶不知道是否有跨平台问题,自己这里测试感觉没问题。

技术嘛,靠火气是学不来的。

Project[Patched].rar
上传的附件:
2012-2-2 20:19
0
雪    币: 463
活跃值: (111)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
用SMC就解决了
2012-2-2 23:32
0
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
感谢,希望我还有发言权了,没禁言。

我自己能搞,想为你分析原因,才让你上传你报错误的那个。
上传的附件:
2012-2-3 08:35
0
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我猜是你有地方保存漏了,因为这个 复制所有到文件 选项是没有的,要保存一个地方,回到cpu窗口再保存另一个地方,直到全部保存,然后存为文件。

传出错的文件才能帮你分析,并验证我的猜想。

楼主你明白我的苦心吗?哦弥陀佛
2012-2-3 08:46
0
雪    币: 1363
活跃值: (139)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
,抱歉啊,不该发火,直接保存,的确没有全部保存的选项,所以我是使用shift把修改的部分全部选择上,然后保存的。我在虚拟机中调试的,保存完以后,重新跟踪了一遍。
修改的部分全都保存了,
jmp Project[.00476F78
跟踪进入OEP后,里面全部都是空数据,这点让自己很纳闷。
附件中,是自己一次保存得到的结果,无法正常运行。
上传的附件:
2012-2-3 10:16
0
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
你的原因是:
你应该用esp定律走到OEP之后,改代码,然后用shift全选上,保存,这样做的错误是,保存的不仅仅是你写的smc代码,还有壳在解码过程中自修改的代码,就是说保存过多了,简单举个例子,用你修改的文件F7 14下,有个jnz是会跳走的,由于你保存过多,后面的解压过程全部被跳过了,OEP处自然就是空的。只是个例子,当然不仅仅如此。

拿原来的加壳文件同样F7 14下,你就发现区别了。

你可以载入OD后直接Ctrl+G到004A73B0进行修改为jmp 004A75A8,再Ctrl+G到004A75A8写mov byte ptr ds:[476C59],74再跳到OEP,然后用shift键全部保存,就可以运行了。
2012-2-3 14:20
0
雪    币: 1363
活跃值: (139)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
,谢谢你了,弄明白了~~~
2012-2-6 15:09
0
游客
登录 | 注册 方可回帖
返回
//