欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

三招干废“植物大战僵尸”

程序员文章站 2022-07-13 08:35:24
...

一直以来都是用CE修改“植物大战僵尸”的相关数据,感觉很不爽,为什么不直接修改主程序呢?
既然学了逆向,为什么不用呢?
其实“植物大战僵尸”就三个关键点,一、阳光值,二、冷却时间,三、一击毙命
哦对了,版本不同,地址可能不同,我的这个文件版本:1.0.0.1051

一、修改收取阳光得到的值

标准一个大阳光=25,小阳光(夜晚阳光)=15
1、启动游戏,打开CE,载入游戏,“首次扫描“当前阳光值50,会找到很多地址
2、当掉落阳光时收取,阳光总值变为75,回到CE“再次扫描“75,一般就剩下一个地址了
3、双击找到的地址,把地址放到下方地址栏,然后在地址栏鼠标右击地址选”找出是什么改写了这个地址“
4、当再次有阳光掉落并收集时,就会出现我们要的地址,如下图:
三招干废“植物大战僵尸”
5、找到了关键地址:00430A11,用OD载入主程序,CTRL+G,输入地址,就到了程序处,如图:三招干废“植物大战僵尸”
6、向上找到函数开始处下断,经过分析,得到ECX为增加的值,那么就找是谁修改了ECX,向上找到2处。
1)、004309EF,2)、004309FB
第一个19为十六进制,转为十进制就是25,既然找到了,那就不客气了,就看你想让一个阳光值多少了。
我改为:

  004309EF    mov ecx,0x3E8
   第二个为小阳光的修改处,我改为:
  004309F6      cmp eax,0x5     ”这句没动,也可以NOP004309F9      mov ecx,0x3E8

二、去除冷却时间

还是先用CE查找关键地址,方法如下:
1、先放下一个植物,然后回到CE,这时游戏自动暂停,“扫描类型”选择“值介于…两者之间”,输入10-1000,
(第三的一击毙命也是用这个方法)如图:三招干废“植物大战僵尸”
2、继续游戏后马上再回到CE,这样游戏又暂停了,这时“扫描类型”改为“增加的数值”,
技巧:为了加快搜索,这里的“扫描类型”要经常变换,常用的有:
1)、“增加的数值”
2)、“未变动的数值”
3)、“值介于…两者之间”
以上三种方法结合使用,尤其“未变动的数值”能去除很多的数据。
3、最后就会找到一个相应的地址,同样双击,放到地址栏,然后在地址栏鼠标右击地址选”找出是什么改写了这个地址“
4、回到游戏,就会出现一个地址:三招干废“植物大战僵尸”

0048728C   8347 24 01    add dword ptr ds:[edi+0x24],0x1

5、用OD载入游戏,CTRL+G来到关键地址处:三招干废“植物大战僵尸”
关键代码就这4行:

0048728C    8347 24 01    add dword ptr ds:[edi+0x24],0x1
00487290    8B47 24       mov eax,dword ptr ds:[edi+0x24]
00487293    3B47 28       cmp eax,dword ptr ds:[edi+0x28]
00487296    7E 14         jle short PlantsVs.004872AC

这里的修改方法有很多种,我说几种吧:
1)、00487296 改为: jg short PlantsVs.004872AC
2)、将00487290行NOP
3)、00487293 改为: cmp eax,0x0

三、一击毙命

同二的方法很相似,如下:
1、先放下一个植物,然后回到CE,这时游戏自动暂停,“扫描类型”选择“值介于…两者之间”,输入10-1000,如图:
三招干废“植物大战僵尸”
2、然后回到游戏,当僵尸中弹后,再次回到CE,这时“扫描类型”改为“减少的数值”,
为了加快搜索,这里的“扫描类型”要经常变换,常用的有:
1)、“减少的数值”
2)、“未变动的数值”
3)、“值介于…两者之间”
以上三种方法结合使用,尤其“未变动的数值”能去除很多的数据。
提供一些数据供使用:僵尸的初始血量为270,豌豆射手的攻击为20。
3、最后就会找到一个相应的地址,同样双击,放到地址栏,然后在地址栏鼠标右击地址选”找出是什么改写了这个地址“
4、回到游戏,当僵尸中弹后,就会出现一个地址:

00531319 - 89 BD C8000000        - mov [ebp+000000C8],edi

5、用OD载入游戏,CTRL+G来到关键地址处,下面的查找要比第二复杂一些(其实这里也是有很多技巧的,嘴笨,说不太好),方法如下:
1)通过F2下断,F8跟踪,此处并非关键点,必须上层查找。
三招干废“植物大战僵尸”

2)、在堆栈处找到“返回到 XXXXXX…”这样的地方,鼠标右键选“反汇编窗口中跟随”
就会跳转到上层地址处,从这里向上找到本段程序(函数)的入口处,一般都是“PUSH XXX”
下断(F2),跟踪(F8)分析后,没发现关键代码,继续向上层查找,
还是到堆栈处找到“返回到 XXXXXX…”这样的地方,鼠标右键选“反汇编窗口中跟随”
三招干废“植物大战僵尸”

同样向上找到本段程序(函数)的入口处:0046E003 . 53 push ebx
下断(F2),跟踪(F8)分析后找到关键地址处:

三招干废“植物大战僵尸”
经过分析发现这里给寄存器EDX赋值0x14,也就是十进制的20,正好是豌豆射手的实际伤害值。

0046E073  8B148D C8F16900   mov edx,dword ptr ds:[ecx*4+0x69F1C8]

由此可得:dword ptr ds:[ecx*4+0x69F1C8]=伤害,
改:mov edx,0x1000,让伤害为1000(这是十六进制的1000,你转为十进制看看。)

怎么这么费尽?不能简单点吗?
重新分析00531319地址代码处:

0053130F    2B7C24 20       sub edi,dword ptr ss:[esp+0x20] 
00531313    894424 1C       mov dword ptr ss:[esp+0x1C],eax
00531317    8BC5            mov eax,ebp
00531319    89BD C8000000   mov dword ptr ss:[ebp+0xC8],edi
0053131F    E8 ECC3FFFF     call PlantsVs.0052D710

看下面这句代码

00531319    89BD C8000000   mov dword ptr ss:[ebp+0xC8],edi

意思是将EDI的值存到ebp+0xC8地方,分析得到EDI为中弹后剩余的血量。
那么只要将EDI变为0,就可以了。
mov dword ptr ss:[ebp+0xC8],0,这样修改行吗?答:不行,因为这样修改会把下面的CALL语句覆盖。
向上找,看谁修改了EDI,0053130F处sub edi,dword ptr ss:[esp+0x20] 修改了EDI,就改它。
这里方法很多,比如sub edi,edi,xor edi,edi。

至此,三项全部修改完成,再也不用每天打开CE来修改了。

其实说句实话,本来很好玩的游戏,一但修改了,就没意思了!

四、换个版本

又安装了另一个版本:1.2.0.1073,方法不在赘述。还是用CE找地址,用OD修改。
一、阳光地址:0044BA45

0044BA1C - 83 F8 04              - cmp eax,04
0044BA1F - 75 07                 - jne 0044BA28
0044BA21 - B8 19000000           - mov eax,00000019 { 25 }
0044BA26 - EB 1A                 - jmp 0044BA42
0044BA28 - 83 F8 05              - cmp eax,05
0044BA2B - 75 07                 - jne 0044BA34
0044BA2D - B8 0F000000           - mov eax,0000000F { 15 }
0044BA32 - EB 0E                 - jmp 0044BA42
0044BA34 - 33 C9                 - xor ecx,ecx
0044BA36 - 83 F8 06              - cmp eax,06
0044BA39 - 0F95 C1               - setne cl
0044BA3C - 49                    - dec ecx
0044BA3D - 83 E1 32              - and ecx,32
0044BA40 - 8B C1                 - mov eax,ecx
0044BA42 - 8B 7E 04              - mov edi,[esi+04]
0044BA45 - 01 87 78550000        - add [edi+00005578],eax

这里很明显就能看到25和15的位置,随便改吧骚年。

二、冷却地址:004B2FEA

004B2FEA    FF47 24         inc dword ptr ds:[edi+0x24]
004B2FED    8B47 24         mov eax,dword ptr ds:[edi+0x24]
004B2FF0    3B47 28         cmp eax,dword ptr ds:[edi+0x28]
004B2FF3    7E 12           jle short PlantsVs.004B3007

将jle跳转改为jg。

三、一击毙命地址:00566D10

00566D06  |.  2B7424 20     sub esi,dword ptr ss:[esp+0x20]
00566D0A  |.  894424 1C     mov dword ptr ss:[esp+0x1C],eax
00566D0E  |.  8BC5          mov eax,ebp
00566D10  |.  89B5 C8000000 mov dword ptr ss:[ebp+0xC8],esi
00566D16  |.  E8 75C0FFFF   call PlantsVs.00562D90

把sub esi,dword ptr ss:[esp+0x20]改为sub esi,esi,或者xor esi,esi。