通过本次实训,你将掌握使用 Cheat Engine 进行游戏内存搜索与修改的核心技术:
| 软件/工具 | 说明 |
|---|---|
| Cheat Engine | 开源内存扫描与调试工具,本实训核心工具 |
| 植物大战僵尸 (PvZ) | 目标游戏,用于演示内存修改 |
| 浏览器 | 访问参考教程:cmd.goodstudy.fun |
Cheat Engine(简称 CE)是一款开源的调试器,其最强大的功能在于内存搜索——能够扫描目标进程的内存空间,查找特定的数值,并对其进行修改。
CE 的核心能力是在搜索结果的基础上再次搜索:你不需要一次就找到目标地址,而是通过多次筛选逐步缩小范围,最终精确定位。
假设你要从全体学生中,找出「男、戴眼镜、身高超过 1 米 7」的同学:
| 步骤 | 搜索范围 | 条件 | 操作类型 |
|---|---|---|---|
| 第 1 步 | 全体学生 | 男生 | 首次扫描 |
| 第 2 步 | 男生群体 | 戴眼镜 | 再次扫描 |
| 第 3 步 | 眼镜男群体 | 身高 > 1.7m | 再次扫描 |
最终从全体中逐步筛选出"1 米 7 眼镜男",这就是 CE 内存搜索的核心逻辑。
如果在第 2 步不小心选成了首次扫描(而不是再次扫描),会发生什么?
你不会在"男生"范围内搜索"戴眼镜",而是从全体学生中重新搜索"戴眼镜"的同学——也就是说,结果里会包含戴眼镜的女生。前面的筛选成果全部丢失!
这在 CE 中意味着:你又回到了全部内存空间搜索,之前通过条件筛选出的结果集合被废弃了。
阳光是植物大战僵尸中的已知数值资源。这是 CE 入门最经典的练习,因为你可以直接在界面上看到当前的阳光数量。
plantsvszombies.exe 进程游戏中每个植物槽位都有独立的冷却时间。种下植物后槽位变暗,需要等待一段时间才能再次种植。
与阳光值不同,冷却值有两大难点:
图:冷却值查找原理示意图
冷却机制在代码层面由两个关键变量控制:
两个线程协同工作:
找到 bOK 的内存罐子(1 字节),将其值固定为 1(true)。
效果:界面槽位始终认为冷却已完成,植物永远可种。
分析:这是一种"欺骗界面"的做法——计时器仍在跑,但界面不再等它。
找到 iTimer 的内存罐子(4 字节),将其值固定为 999(大于 768)。
效果:线程 1 的条件 iTimer >= 768 永远成立,bOK 始终为 true。
分析:这是从源头解决问题——让计时器永远处于"已完成"状态。
理解 iTimer 在不同游戏状态下的变化规律,是正确设置 CE 扫描条件的关键:
| 界面槽位状态 | 槽位 iTimer 值 | 说明 |
|---|---|---|
| 亮着,没种 | 0 | 冷却初始值,准备就绪 |
| 亮着,没种 | 0 | 同上,空闲等待 |
| 种下,不亮,在冷却 | 1, 2, 3, ... | 计时器递增中 |
| 种下,不亮,在冷却 | 500 多 | 冷却中后期 |
| 种下,不亮,在冷却 | 600 多 | 接近冷却完成 |
| 种下,不亮 → 变亮 | 768 → 立刻变 0 | 冷却完成,bOK=true,iTimer 重置 |
查找冷却值时,扫描类型的选择顺序至关重要。以下是正确的操作流程:
| 步骤 | CE 操作 | Scan Type | 原因 |
|---|---|---|---|
| 1 | 首次扫描 | Unknown initial value | 我们不知道 iTimer 从什么值开始 |
| 2 | 再次扫描 | Changed value(变动的数值) | 进入冷却后值在持续变化 |
| 3 | 再次扫描 | Changed value | 继续观察,值仍在变动 |
| 4 | 再次扫描 | Unchanged value(未变动的数值) | 冷却完成时值稳定(为 0) |
图 1:首次扫描 - 未知的初始值
图 2:再次扫描 - 变动的数值
图 3:再次扫描 - 继续筛选变动的数值
图 4:再次扫描 - 未变动的数值(冷却空档期)
当你找到一个槽位的冷却值地址后,其他槽位的冷却值通常存储在附近的内存区域。这是因为程序通常用数组或连续结构体来管理同类型的槽位数据。
操作方法是:浏览第一个槽位冷却值附近的内存单元。
以下截图展示了 Cheat Engine 在植物大战僵尸中的实际使用过程。请仔细观察每张图中的操作细节。
图 5:CE 实战操作界面 1
图 6:CE 实战操作界面 2
图 7:CE 实战操作界面 3
图 8:CE 实战操作界面 4
图 9:CE 实战操作界面 5
| 知识点 | 要点 |
|---|---|
| 首次扫描 vs 再次扫描 | 首次扫描搜索全部内存;再次扫描仅在上次结果中筛选 |
| 已知值扫描 | 适用于阳光等可见数值,使用 Exact Value + 精确值 |
| 未知值扫描 | 适用于冷却计时器等未知初始值,使用 Unknown initial value |
| 内存模型 | iTimer (4字节 int) + bOK (1字节 bool) 控制冷却 |
| 修改策略 | 可直接固定 bOK=1,也可固定 iTimer 为超大值 |
| 浏览内存 | 找到首个地址后,浏览附近内存可发现关联数据 |