第一次接触Cheat Engine(CE)是在大学时期,当时为了修改单机游戏里的金币数值。这款免费的内存扫描工具远比我想象的强大,特别是对《植物大战僵尸》这类经典游戏的逆向分析,简直是绝配。你可能不知道,通过简单的内存扫描,我们不仅能修改阳光值,还能深入游戏机制,实现自动收集、无限阳光等高级功能。
CE的工作原理其实很直观。游戏运行时,所有数据都会加载到内存中,包括阳光值、植物冷却时间、僵尸血量等。这些数据在内存中都有特定地址,CE通过不断扫描内存变化,帮我们定位关键数据的位置。比如修改阳光值,就是先扫描初始值150,再消耗阳光后扫描新值50,逐步缩小范围直到找到准确地址。
《植物大战僵尸》特别适合逆向分析新手练手。它的数据结构清晰,数值变化明显,而且没有复杂的反作弊机制。我建议从最基础的阳光值修改开始,逐步深入到自动收集、关卡跳跃等高级功能。记得第一次成功锁定阳光值时,那种成就感至今难忘。
打开CE和游戏后,第一步是附加到游戏进程。在CE左上角点击电脑图标,选择PlantsVsZombies.exe。这时游戏画面可能会卡顿几秒,属于正常现象。初始阳光值通常是50或150,我们先在CE的数值框输入当前值,点击"首次扫描"。
重点来了:扫描结果可能有几千个地址,这时候需要让阳光值发生变化。种个向日葵消耗阳光,或者等待自然掉落增加阳光,然后在CE输入新值,点击"再次扫描"。通常两三次扫描后,剩下的地址就很少了。右键点击最可能的地址,选择"更改数值",输入9999试试看,游戏里的阳光值应该立即变化。
直接修改动态地址有个问题:每次重启游戏,地址都会变化。我们需要找到指向阳光值的基址。右键点击阳光地址,选择"找出是什么改写了这个地址",然后随便消耗点阳光。CE会显示访问该地址的汇编指令,通常能看到类似mov [eax+38],ecx这样的代码,其中38就是偏移量。
这时候点击"显示反汇编程序",往上翻找eax的来源。可能会看到mov eax,[ebx+5568]这样的指令,5568就是另一个偏移量。记录这些偏移量,然后点击CE的"内存查看"按钮,手动添加指针地址。经过几次这样的操作,就能找到绿色的静态基址,这个地址每次游戏启动都不会变。
游戏里阳光自然产出的速度其实是由一个冷却时间控制的。我们可以用CE找出这个值:首次扫描选择"未知初始值",然后等待阳光即将产出时扫描"减少的数值"。当阳光开始发光时,改为扫描"增加的数值"。反复几次后,应该能找到唯一的地址。
把这个值改为0,你会发现阳光像下雨一样不停掉落。更有趣的是,这个地址往往和植物血量在同一个结构体里。我测试时发现,修改这个结构体的其他偏移量,可以改变第一行第一列植物的血量值,从默认的300变成任意数值。
除了修改产出速率,还可以让掉落的阳光不消失。当阳光刚出现时,扫描"未知初始值",然后等阳光快要消失时扫描"减少的数值"。找到的地址通常有两个关键偏移量:00005538和0768。把这两个地址的值都改为1,掉落的阳光就会永远悬在空中,随时可以点击收集。
手动点阳光太累?我们可以让游戏自动收集。先找到阳光的内存地址,然后点击"找出是什么改写了这个地址"。收集一次阳光,CE会暂停在修改阳光值的汇编指令处。点击"显示反汇编程序",在跳转指令(通常是jne或je)上设置断点。
关键步骤来了:右键点击这条指令,选择"自动汇编",然后选"模板→代码注入"。把条件跳转jne直接改成无条件跳转jmp,这样游戏每次检测到阳光都会自动收集。配合前面修改的无限阳光,简直就是懒人必备组合。
僵尸血量比阳光复杂些,因为不同僵尸类型血量不同。我的方法是让僵尸被攻击一次后,扫描"减少的数值"。通常需要攻击3-4次才能准确定位。找到地址后,可以尝试锁定数值,这样僵尸就无敌了。不过要注意,有些僵尸(如铁桶僵尸)可能有多个血量参数。
想直接跳到特定关卡?先通关一次,扫描当前关卡数(比如5-1就扫描5)。然后退回主菜单再进入,扫描新关卡数(通常是1-1)。反复几次就能找到关卡地址。有趣的是,修改这个值为5,游戏会直接跳转到第5关。通过分析偏移量24,还能找到关卡基址,实现任意跳关。
想让豌豆射手变成加特林?先用变速精灵把游戏速度降到0.1倍,这样更容易捕捉子弹发射的瞬间。选择"未知初始值"扫描,当子弹射出时扫描"增加的数值"。范围限制在2000以内能提高效率。找到地址后,查看"什么改写了这个地址",在反汇编窗口会看到控制发射间隔的代码。把对应的数值改为负数(如-04),射速就会快得惊人。
植物卡牌的冷却机制是由0和1控制的。保持三个卡槽正常状态,扫描0;等卡牌刷新后,扫描1。反复几次后,剩下的地址可能还有30多个。这时候需要更精确的定位:拿起放下植物,观察哪些地址被改写。通常会看到类似mov byte ptr [eax+ecx+70],01的指令,其中70就是关键偏移量。
通过分析mov esi,[esi+00000768]这样的指令,可以找到植物基址。768是个常见偏移量,但不同植物可能有不同偏移。我测试时发现,有些植物需要加上C0偏移量(70和50的十六进制和)才能准确访问。记住一个原则:不要跨段添加指针,尽量保持所有偏移量在同一个IP范围内。
当遇到多级指针时,一定要耐心。比如先找到eax的来源,可能是[ebx+5568],而ebx又来自[ecx+144]。每层偏移量都要记录下来,最后手动添加多级指针。我花了整整一个周末才完全理清《植物大战僵尸》的植物数据结构,但这个过程对理解游戏内存布局帮助巨大。