前言
一直都想搞一个植物大战僵尸的修改器,想通过学习自己制作一个
打算使用Cheat Engine修改器找到阳光的真正地址,然后再用易语言制作一个针对植物大战僵尸的阳光修改器
名词释义
植物大战僵尸:可怕的僵尸即将入侵你的家,唯一的防御方式就是你栽种的植物!武装你的植物,切换他们不同的功能,诸如强悍的豌豆射手或樱桃炸弹,更加快速有效的将僵尸阻挡在入侵的道路上。不同的敌人,不同的玩法构成五种不同的游戏模式,加之夕阳、浓雾以及泳池之类的障碍增加了其挑战性,奇特的游戏乐趣永无止境!
Cheat Engine:是一款旨在帮助您在没有互联网连接的情况下修改单人游戏的修改器,以便您可以根据自己的喜好使游戏变得更难或更容易(例如:发现 100hp 太容易了,尝试玩最大 1 HP 的游戏),简称CE
Cheat Engine is a tool designed to help you with modifying single player games without internet connection so you can make them harder or easier depending on your preference(e.g: Find that 100hp is too easy, try playing a game with a max of 1 HP)
易语言:是一个自主开发,适合国情,不同层次不同专业的人员易学易用的汉语编程语言。易语言降低了广大电脑用户编程的门槛,尤其是根本不懂英文或者英文了解很少的用户,可以通过使用本语言极其快速地进入Windows程序编写的大门
功能
- 设置一个很大的阳光数值
下载地址
目前不直接提供下载,防止某些三方网站没有经过允许私自转发售卖,有需要可以发邮件告诉我
参考链接
准备工具
- Cheat Engine v6.7
- 易语言 v5.9
- 易语言超级模块 v9.2
基础概念
内存
内存,一切皆内存,我们操作的全部都是内存。
所有地址相关的概念,都可以理解为坐标,用来给我们做标记的而已。
如果实在搞不明白,你想想指南针为啥指向北边,为啥叫南北,只是定义,只是公认
基址
以阳光为例,由于内存是动态分配的,我们每一次搜索存放阳光的内存地址都会不一样。
基址,就是指每一次分配我们都能通过偏移,来找到动态的地址,一般是由模块地址+固定的偏移实现。
例:我知道阳光在内存中存放地址,是模块地址+400的内存位置,所以阳光基址就一定是模块地址+400。所以动态就变成了,30格的时候,30+400。在40格的时候,40+400了。
指针
指针其实就可以理解成外号,你的外号叫二狗子,别人先知道你的外号,然后熟悉了才可以根据外号找到你的真名。
更多的用处是引用,就像别人往往更愿意叫你二狗子,而不愿意叫你真名一样。
例:一个指针叫做point,他指向内存的0xFF923200。那他就可以有两个作用,一个就是直接使用指向的内存地址FF923200;另一个可以直接查到FF923200里的值。
为什么要找基址
因为游戏退出基址不会变化,只有游戏更新后才会变化,而要是用找到的内存地址,例如:血的内存地址,游戏退出是会变化的,不方便我们编写辅助调用。
寻找阳光的数量的地址
需要注意的是每次、每个人搜索的地址都是不是一样的,所以只需要和我的步骤保持一致就行
首先打开游戏,使用CE加载游戏进程。
进入游戏,在CE的数值处输入起始默认的50阳光,然后点击首次扫描
选择好要加入战斗的植物,然后种下一个向日葵,此时阳光数量变为0,再次使用CE修改数值为0,然后点击再次扫描
此时列表中出现了两个结果,第二个结果的当前值就是阳光现在的数量,选中这个结果右键选择找出是什么改写了这个地址,然后在弹出的确认提示框中点击Yes,然后回到游戏收获一个阳光
选中0041F4D0 - 01 88 78550000 - add [eax+00005578],ecx
这一行点击右侧的详细信息,然后在弹出的窗口中复制这个红色框的地址,需要记住的是这个蓝色框的地址5578
勾选Hex复选框,输入刚才复制的红色框地址,点击新的扫描,然后再次点击首次扫描会看到有47个结果,首先关注蓝色框地址这一列,如果没有绿色的地址那么就从上自下找一个地址相差比较大的,比如红色框中的地址就和上面的地址相差比较大。选中这个红色框的地址右键选择找出是什么访问了这个地址
和第5步骤相同,在弹出的窗口中可以看到有很多指令,如果你的窗口中没有任何指令,可以在游戏中拾取1个阳光。选择第一个地址004577C3 - 8B B7 68080000 - mov esi,[edi+00000868]
然后点击右侧的详细信息,在弹出的窗口中可以看到和之前一样的界面,这里同样复制红色框中的地址,并手动记录下蓝色框的数字868
和第6步骤相同,把刚才复制的地址粘贴到数字窗口并确保你已经选中了Hex复选框,然后点击新的扫描,再次点击首次扫描,到这里你应该能在地址列看到绿色的地址,当然如果你并没有看到绿色的地址,那么你可以向下滚动鼠标。如果你依然没有找到绿色的地址,那么请重复以上的步骤直到找到绿色的地址。当你找到绿色的地址时选中其中一个地址并双击会被添加到下面的窗口
双击地址00731C50会打开一个小窗口,取消勾选十六进制,勾选指针,填写刚才手动记住的两个值5578和868,这里的5578和868是阳光地址的偏移量,然后你会看到这个窗口中的地址20994C40后面的数字是25,这就是游戏中阳光的真正地址和阳光的真实数值,然后点击确定
你会看到在下面窗口中刚才的地址00731C50已经变成了P->20994C40,然后导出保存这个地址,下次打开CE直接加载这个文件就可以直接修改。需要注意的是当前这个地址的数值还是25,你需要双击数值并修改成你需要的一个数值,比如4789。下次打开这个脚本就可以直接修改阳光为4789
使用CE生成修改器
在CE中依次点击文件—从表单中生成通用修改器Lua脚本,点击添加热键设置激活的键位和功能描述,也可以设置激活和禁用的声音,修改完成可以设置修改器的程序名称、标题、程序图标。这里需要注意的是一定要确保CE和CE要生成的修改器名称和路径都是英文并不含特殊字符的,否则会生成失败。
特殊字符:\ / * ? : | “<> . , ; :
下次打开游戏就可以直接使用CE生成的修改器来修改游戏的阳光数量了。如果你的修改器没有生效,但是你发现却可以使用之前导出的P->20994C40地址的脚本来修改游戏,在这种情况下最好还是使用其他语言编写修改器来达到和CE生成修改器一样的目的
使用易语言编写修改器
搭建环境
新建一个Windows窗口程序,创建好之后双击窗口会打开代码编辑页面
首先需要把超级模块加入模块引用列表
编写代码
思路
首先根据之前CE的操作步骤,我们可以先记录下每一个步骤的关键信息
- 首先使用CE打开了游戏进程
- 寻找阳光在当前游戏进程中的地址
- 根据阳光的地址找到偏移量
- 根据阳光的地址偏移量找到了游戏基址
- 根据游戏基址又找到了阳光的真实地址
- 最后生成修改器
开始编写
首先创建四个程序集变量,如果担心出问题可以按照我的写,接着空白处往下写就行
根据游戏的进程名获取进程ID,从CE界面的上面不难发现进程名popcapgame1.exe
1 | 进程ID = 取进程ID (“popcapgame1.exe”) |
然后打开CE修改器就是刚才导出的脚本,看到下面红色框出来的地址00731C50,这个地址就是游戏的基址
1 | 游戏基址 = 读内存整数型 (进程ID, 十六到十 (“00731C50”)) |
然后在游戏的基址之上加入5578和868的偏移量,切记先加868,然后才是5578
1 | 阳光偏移 = 读内存整数型 (进程ID, 游戏基址 + 十六到十 (“868”)) |
然后就可以设置阳光的数量了,这块的到整数 (阳光基址) + 54188
是每次打开修改器修改的阳光数量,值得注意的是每次打开游戏时阳光基址都会变在加上54188就会变得更大。这里的阳光基址相对于游戏基址不会改变,因为每次打开游戏的游戏基址都并不是固定的,阳光基址是在游戏基址基础之上确定的相对的地址
1 | 写内存整数型 (进程ID, 阳光基址, 到整数 (阳光基址) + 54188) |
然后保存代码,设置窗口标题和背景图
还可以设置程序的图标和个人信息
调试并运行修改器
打开游戏进入战斗界面,就可以点击红色框的运行修改器,蓝色框为停止运行修改器。如果你的修改器不能正常工作,请停止运行修改器并检查重复以上步骤
生成修改器
依次点击编译—独立编译,在弹出的对话框中点击确定,然后选择你要放在哪个位置下