目录
上一期教程中,我们学习了修改植物大战僵尸的阳光数量、向日葵生产阳光速率以及实现“太阳雨”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表了:
激活脚本,如下图,成功了!