首页
社区
课程
招聘
打造一个游戏成无敌版
发表于: 2005-6-26 03:40 10453

打造一个游戏成无敌版

2005-6-26 03:40
10453

目标程序:BrickBuster Demo.exe
程序介绍:一个打砖块游戏,还可以玩一下。
破解目的:本人游戏水平太菜了,不作弊玩不下去。人当然不能被电脑玩,只好……
          当然,为了让程序还有玩头,我们只是想在按某键(本次为D键)时让程序变成无敌版,
          直接变成3条命,加1000分(作人要厚道,别太贪),不然谁都无敌就没什么好炫耀了。
破解工具:OD1.1、FPE2001
破解过程:先用OD载入程序,运行后,随便玩一下,当分数改变或生命值改变时切换至FPE2001搜索生命值和分值保存地址,
          如原来分数1000,加分后变成1050,就先用FPE2001搜索1000,加分后切换至FPE2001搜索1050,应该只有几个地址,
          一般00xxxxxx是我们需要的地址。然后在OD中对该地址下硬件写入断点,令程序在写入时中断。
          在这里可以修改程序成我们的代码。
          程序保存分值和生命值的地址是动态生成的,不是静态地址,所以我先将动态地址取出改成静态地址,
          以方便修改程无敌版。程序446C00后都是空代码,可以修改成我们的代码。

修改保存分值地址:
原程序:
00423417    add dword ptr ds:[eax+1C],edx            ; EAX+1C为保存分数的动态地址,EDX为正常加分值
0042341A    mov al,byte ptr ds:[458718]
0042341F    test al,al
00423421    je short BrickBus.0042343C

修改后程序:
00423417    nop
00423418    jmp BrickBus.00446C40                    ; 跳至我们的代码
0042341D    nop
0042341E    nop
0042341F    test al,al
00423421    je short BrickBus.0042343C

00446C40    mov dword ptr ds:[459FE0],eax            ; EAX+1C为保存分数的动态地址,修改成保存在静态地址459FE0中
00446C45    add dword ptr ds:[459FE0],1C
00446C4C    nop
00446C4D    nop
00446C4E    nop
00446C4F    nop
00446C50    add dword ptr ds:[eax+1C],edx            ; 恢复原程序代码
00446C53    mov al,byte ptr ds:[458718]
00446C58    jmp BrickBus.0042341F                    ; 返回原程序

修改保存生命值地址:
原程序:
0040C078    mov dword ptr ds:[ecx+28],edx            ; ECX+28为保存生命值动态地址,EDX为生命值
0040C07B    mov ecx,dword ptr ds:[458D38]
0040C081    call BrickBus.004147B0

修改后程序:
0040C078    jmp BrickBus.00446C60                    ; 跳至我们的代码
0040C07D    nop
0040C07E    nop
0040C07F    nop
0040C080    nop
0040C081    call BrickBus.004147B0

00446C60    mov dword ptr ds:[459FF0],ecx            ; ECX+28为保存生命值动态地址,修改成静态地址459FF0
00446C66    add dword ptr ds:[459FF0],28
00446C6D    nop
00446C6E    nop
00446C6F    nop
00446C70    mov dword ptr ds:[ecx+28],edx            ; 恢复原程序代码
00446C73    mov ecx,dword ptr ds:[458D38]
00446C79    jmp BrickBus.0040C081                    ; 返回原程序

改无敌版的代码:
原程序:
0041B1A7    cmp edi,73
0041B1AA    je short BrickBus.0041B1B1
0041B1AC    cmp edi,53
0041B1AF    jnz short BrickBus.0041B1C7

修改后程序:
0041B1A7    nop                                      ;  开始修改按键处理
0041B1A8    jmp BrickBus.00446C90                    ;  跳至446C90处理
0041B1AD    nop
0041B1AE    nop
0041B1AF    jnz short BrickBus.0041B1C7

00446C90    cmp edi,73                               ;  先恢复原程序代码
00446C93    je BrickBus.0041B1B1
00446C99    cmp edi,53
00446C9C    jnz short BrickBus.00446CA5              ;  否就跳至446CA5继续处理
00446C9E    jmp BrickBus.0041B1B1                    ;  回原程序
00446CA3    nop
00446CA4    nop
00446CA5    cmp edi,44                               ;  是否为按D键?
00446CA8    je short BrickBus.00446CB0               ;  是就跳至446CB0修改成无敌版
00446CAA    jmp BrickBus.0041B1C7                    ;  回原程序
00446CAF    nop
00446CB0    mov dword ptr ds:[459FE8],eax            ;  先保存EAX
00446CB5    mov eax,dword ptr ds:[459FE0]            ;  取分值
00446CBA    add dword ptr ds:[eax],3E8               ;  加1000分
00446CC0    mov eax,dword ptr ds:[459FF0]            ;  取生命值
00446CC5    mov dword ptr ds:[eax],3                 ;  生命值变成3
00446CCB    mov eax,dword ptr ds:[459FE8]            ;  恢复EAX值
00446CD0    jmp BrickBus.0041B1C7                    ;  返回原程序

小结:由于保存分数的地址保存在EAX+1C中,当按下D键处理时,EAX值改变了,就不能指向正确地址,
      所以需要先改成静态地址(注意不要改在代码段中,因为它是只读属性,否则程序立即出错),
      处理按键时直接用静态地址就方便了。
      如果按键设置更复杂些,那就只有你自己知道怎么玩了,不过我还不会设置^_^
      千万记得在OD中设置为前台显示,不然程序要死不活可别怪我。

      好了,现在你已经无敌了,赶紧打个通关和英雄榜给朋友们看看你的“实力”吧。


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

收藏
免费 7
支持
分享
最新回复 (13)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
看了你的帖子,我以后再也不相信什么通关英雄版了......
2005-6-26 08:12
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
3
好文!
PEDIY的高境界啊
------------------------------
    切换至FPE2001搜索生命值和分值保存地址
------------------------------
FPE2001??什么东西??
2005-6-26 09:58
0
雪    币: 519
活跃值: (1223)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
4
Fix Person Expert
中文名为 整人专家
2005-6-26 10:03
0
雪    币: 223
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
FPE2001是跟金山游侠一类的东西,搜游戏内存的
2005-6-26 10:19
0
雪    币: 206
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
ECX+28为保存生命值动态地址,修改成静态地址459FF0

这个静态地址是根据什么改的,可不可以随便找个空的地方?
2005-6-26 11:54
0
雪    币: 332
活跃值: (479)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
7
先用OD载入程序,运行后,随便玩一下,当分数改变或生命值改变时切换至FPE2001搜索生命值和分值保存地址。这个方法不错,对于次数限制的软件,也可以此法吧。
2005-6-26 13:09
0
雪    币: 280
活跃值: (281)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
8
最初由 linsion 发布
ECX+28为保存生命值动态地址,修改成静态地址459FF0

这个静态地址是根据什么改的,可不可以随便找个空的地方?

静态地址459FF0是随便找的,但不能在程序的代码段,因为它没有写入权限。一般找内存数据动态变化的段。
2005-6-26 13:39
0
雪    币: 280
活跃值: (281)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
9
最初由 laoqian 发布
先用OD载入程序,运行后,随便玩一下,当分数改变或生命值改变时切换至FPE2001搜索生命值和分值保存地址。这个方法不错,对于次数限制的软件,也可以此法吧。

可能不行,因为程序每次运行都会有不同的ID,FPE好像无法捕捉不同进程的内存。除非你能刚好在读入上次次数时中断,并用FPE搜索,然后当次数减1后再此搜索。真这样直接用调试器都能作了。
2005-6-26 13:43
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
10
最好的游戏搜索不工具, 不是fpe2001, 不是金山游侠东方不败等。
而是TSearch1.6 以及用CheatEngine44配合就更完美了。
2005-6-26 22:45
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
11
偶做外挂一直用游戏修改工具加od。 呵呵。
2005-6-26 22:45
0
雪    币: 159
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
原来在别的地方看到的小技巧,在这儿都用上了支持!!!
2005-6-26 23:44
0
雪    币: 328
活跃值: (925)
能力值: ( LV9,RANK:1010 )
在线值:
发帖
回帖
粉丝
13
支持支持!
2005-6-29 14:03
0
雪    币: 234
活跃值: (370)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
14
请问逆向分析游戏的一般步骤?很想进行逆向分析
2005-6-30 03:27
0
游客
登录 | 注册 方可回帖
返回
//