目标程序: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中设置为前台显示,不然程序要死不活可别怪我。

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