-
-
打造一个游戏成无敌版
-
发表于:
2005-6-26 03:40
10452
-
目标程序: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期)