目录

 1.单卡片无CD

1.1 思路一

1.2 思路二

2.全卡片无CD

3.豌豆射手射速修改(修改植物射速)

4.实现豌豆射手发射“玉米加农炮”(思路)


上一期教程中,我们学习了修改植物大战僵尸的阳光数量、向日葵生产阳光速率以及实现“太阳雨”PS:上篇链接:(38条消息) 【CE入门教程】使用Cheat Engine(CE)修改游戏“植物大战僵尸”之阳光篇_Fly1ng.M的博客-CSDN博客

首先,用CE打开植物大战僵尸。

 此时我们可以直接导入上次找出的三个基址:

 导入成功!

 1.单卡片无CD

为了方便我们继续,首先现将阳光数量改为9999。

1.1 思路一

分析:植物在CD结束后卡片可选状态和鼠标点击卡片但不松手是两种相反的状态,我们可以利用这点通过1/0搜索排查。

游戏刚开始时,豌豆射手处于可选状态,我们在CE中搜索“1”。

注:因为此次搜索的值为0和1,在0~255之间,所以在搜索前必须将“数值类型”改为“字节”。

 切回游戏,鼠标点击豌豆射手但不种下,使豌豆射手处于纯黑背景状态,我们切出CE,搜索“0”。

 

重复上述步骤,直到数量结果不再减少。此时结果数量可能还是很多,我们可以Ctrl+A全部选中,将所有地址都添加到CT表中。(如下图,全选后点击红色箭头添加到CT表)

 此时,我们可以同时选中很多地址,对他们的数值进行更改,此时数值为1,我们双击数字1,修改为0,如果豌豆射手进入不可选中状态,则可说明豌豆射手CD在选中的这些地址中;如果没有变化,则继续筛选。

 最终,我们终于找到了豌豆CD的地址(其实就是最后一个)。

 接下来我们寻找基址,右键->“找出是什么改写了这个地址”,然后我们切回游戏,点击豌豆射手再放回去。能得到如下结果:

 通过分析可知,下面那一行“01”代表了豌豆无冷却的状态,我们双击它(或查看详细信息)。

 可知“可能的地址”为1D3250E8,虽然是[eax+ecx+70],但是仔细观察可以发现EAX=0,所以一级偏移量为70,我们记下这个值,后面要用。

右键“可能的地址是”后面的地址可以直接复制:

 点击新的扫描,因为我们要搜索地址,地址的表示形式为16位,所以我们要勾选搜索框前面的Hex,还要注意的一点,搜索地址时别忘了把数值类型改为4字节!

 

 如图,可知可能的地址为1D296218,二级偏移量为144,记录。

这次扫描会出现很多地址,前几个与其他地址明显不同的都有可能,一般像这种指令比较工整的就是我们要寻找的方向。

 

 

 如图,可知可能的地址为02879B88,三级偏移量为768,记录。

再次搜索地址时,就会发现绿色的基址了。

 双击任意一个基址添加到CT表中,可以看到基址地址为006A9EC0。

我们点击“手动添加地址”, 因为有三层偏移,所以我们点击“指针”-->“添加偏移”。下面一栏输入006A9EC0,三行偏移从上至下依次填入先前记录的70、144、768,单击确定。

 这样我们就成功找到了豌豆射手单卡片CD的基址,我们把数值改为1并锁定,可以看到实现了豌豆射手的无CD!

1.2 思路二

分析:植物在刚种植后进入冷却,此时植物不可选,直到冷却结束才能再次种植,我们可以通过CD变化搜索“变动的数值”不断查找该植物的CD(至于为什么不用“减少的数值”,一会就知道了)。

首先,种下豌豆射手,搜索“未知的初始值”。

 

 切换到游戏状态让游戏运行一会,再切换回CE,搜索“变动的数值”。

当冷却结束后,我们也可以搜索几次“未变动的数值”筛选更少的结果,然后再种一颗豌豆射手,重复上述步骤。

通过观察可以发现,当豌豆射手在CD时,该地址当前值一直在变化;而当豌豆射手冷却完毕后,该地址为0,由此推断出,该地址就是存放豌豆射手CD的地址,仔细观察就会发现,植物卡片的CD并不是一直减少到0,而是先增大后变为0,所以“减少的数值”是搜不到的。

2.全卡片无CD

我们在1中已经找到了第一张卡片CD的基址,那么其他卡片的CD基址可以找到吗?每个卡片依次按照上述方法一步一步找基址当然能找到,可以这样太浪费时间了。这里提供一种思路:通过观察可知,植物槽上相邻卡片的地址应该离得很近,所以我们可以直接右击第一张卡片CD基址,选择“浏览相关内存区域”。

打开地址区域后,我们点击第二张卡片再放下,仔细看,内存区域中有一个地址在随着我们点击进行00/01的切换,可知,这个地址为第二张卡片的地址。

 右键该地址,将它添加到列表中:

 我们依然用第一次查找第一张卡片CD的基址时所用的方法,此处不在赘述。三次查找的线索如下:

 

 仔细看!第一次偏移时,EAX的值变为了50,而在第一张卡片的第一次偏移值里EAX=0,我们可以大胆推断下一格植物卡片比上一格偏移量多了50!

将第二个植物的CD基址添加一下:

 为了保险起见,我们可以继续验证一下,第三张卡片进行查找后第一次偏移为:A0+70

 没看懂不要紧,通过计算器算一下可知,A0-50=50!也就是说第三张的确比第二张偏移多了50!

 所以第三张卡片的基址也可以直接手动添加了:

 综上所述,通过这种方法我们就可以求出任何一张植物卡片的基址了!

第n张卡片的基址第一次的偏移量:70+50*(n-1)

(PS:第二次和第三次偏移量不变!)

 3.豌豆射手射速修改(修改植物射速)

思路:豌豆射手打僵尸会发射豌豆,我们假设豌豆射手应该有一个内置“计时器”,每当射出一粒豌豆后,计时器开始减小,不断循环(类似CD不断减少)

 注:为了方便操作,建议开启变速精灵,把游戏速度调慢!

 此时,搜索未知的初始值。

 然后切回游戏,“让子弹飞一会”,再切回CE搜索“减少的数值”,当豌豆射出下一发时再搜索“增大的数值”,然后重复上述步骤。

注:此处容易失误!原因是:看起来豌豆射手好像没有发出下一发,但是计时器其实已经刷新了,(可以理解成蓄力的动画时已经开始计时了,但这个动画并不明显)所以建议快打到僵尸的这段时间不要继续“再次扫描”了!

 我们右键,“找出是什么访问了这个地址”,如果没有切回游戏让豌豆射一会。

 分析可知,这个“-01”可能代表着豌豆的涉及射击频率,可是怎么把这个指令以代码或脚本的形式提取出来呢?接下来我们学习CE的进阶知识:代码注入。点击这行指令-->“显示反汇编程序”。

 我们在工具栏里找到“自动汇编”。

 

 框架代码注入后,我们再选择代码注入,因为之前选中的就是这行指令,所以我们不用管,“OK”就好。

 

 如图,把-01改为-04,这会增加豌豆射手的发射速度。

好了,我们已经生成好了自己的脚本,不要急着关闭,点击“文件”-->“分配到当前的CT表”

 

 锁定该脚本后,可以明显发现豌豆射手的射速变快了。

 右键该脚本点击“创建热键”,可以实现选择性的开关脚本。

 

4.实现豌豆射手发射“玉米加农炮”(思路)

首先,我们点击“查看内存”。

 右键任一地址,点击“转到地址”。

 地址栏输入:004672A5。

 “工具”-->“自动汇编”。

 引入CT表框架代码:

代码注入,当前地址确定即可。

 

 然后我们在下图中位置插入几行代码,稍后会逐行进行讲解:

注释:

cmp [ebp+24],#0 //cmp是判断,0代表豌豆射手,这句话用来判断植物是不是豌豆射手。#的意思是10进制,否则为16进制

je h //je是等于跳转,表示如果是豌豆射手就跳转到h

jne originalcode //jne是不等于跳转,表示如果不是豌豆射手就仍然按照原来的代码执行

h: //由上,如果是豌豆就跳转至此

mov eax,#11 //mov是赋值,表示把11放到EAX里。这里的11代表的是子弹类型(玉米加农炮),大家也可以尝试换成其他数字,看看会出现什么效果(注意:如果数字超出界限游戏会崩溃)

然后我们可以分配到当前CT表了:

 

 激活脚本,如下图,成功了!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐