很多同学第一次接触 Cheat Engine(简称 CE)时,总是把它和“改单机游戏数值”画等号,甚至认为它只是一款娱乐工具。但实际上,Cheat Engine 是一个功能非常强大的开源内存扫描与调试工具,很多从事游戏开发、逆向工程、漏洞研究、CTF 竞赛的开发者,都把它当成理解“程序运行时内存布局”的入门载体。而近两年 AI 编程工具快速普及,像 Cursor、GitHub Copilot、通义灵码等辅助编码工具已经进入日常开发流程,于是出现了一个非常自然的组合需求:能不能用 Cheat Engine 做内存分析练习,同时让 AI 帮我写扫描脚本、解释汇编指令、生成自动化工具?这篇文章就是围绕这个组合展开的。
本文会从零开始带大家搭建一套完整的入门环境,先讲清楚 Cheat Engine 的核心概念和工作原理,再通过一个本地测试程序完成“定位内存数值 → 修改内存数值 → 用 Lua 脚本自动化 → 用 AI 生成 Python 分析脚本”的完整闭环。文章同时会给出比较详细的 AI 编程提示词示例,帮你理解如何把模糊需求转换成 AI 能看懂的指令。无论你是刚接触逆向工程的新手,还是已经在做后端开发、游戏开发,想拓展内存调试能力,这篇文章都值得完整看一遍。
1. 为什么要学 Cheat Engine + AI 编程
1.1 Cheat Engine 是什么
Cheat Engine 是一款开源的内存扫描工具,它的核心能力是附加到一个正在运行的进程上,读取和修改该进程的内存数据。它的常见用途包括:
- 游戏开发调试:在开发阶段快速验证数值逻辑,例如把血量、金币、分数这些变量改成指定值,观察游戏行为是否正常。
- 逆向工程入门:通过数值变化反推内存地址、指针结构、对象属性偏移,这是很多逆向工程师的启蒙工具。
- 漏洞研究与 CTF 竞赛:配合调试器分析程序行为,定位关键函数和内存布局。
- 教学演示:帮助学生直观理解进程内存、地址空间、指针、数据类型等底层概念。
从技术实现上看,Cheat Engine 本质上做的是“动态二进制分析”中最基础的一步:在进程运行时,按照用户指定的条件扫描内存,筛选出符合条件的数据位置,然后允许用户修改。这个过程听起来简单,却涵盖了操作系统的虚拟内存、进程句柄、内存分页、数据对齐等许多底层知识。
1.2 AI 编程在这个领域有什么用
AI 编程的核心价值不是替你“无脑写代码”,而是把重复性工作、资料检索、模板生成、逻辑解释这些环节显著提速。在 Cheat Engine 的学习和使用过程中,AI 编程可以在几个方面提供帮助:
- 根据自然语言需求生成 CE Lua 脚本,例如“扫描 4 字节整数 100,把结果输出到列表”。
- 用 Python 写内存分析脚本,例如借助 pymem 库读取指定进程的某个地址,并做数据格式化输出。
- 解释一段反汇编代码或内存数据,帮助理解程序的控制流和数据流。
- 在你遇到报错时,快速定位是 CE API 版本问题、权限问题,还是代码逻辑问题。
- 将一次性的手动扫描流程固化成可复用的脚本工具。
简单来说,Cheat Engine 负责“发现问题”,AI 编程负责“提高解决问题的效率”。两者结合,非常适合作为一门入门课来学习。
1.3 本文的学习路线与安全边界
在开始之前,有一件事必须强调清楚:本教程的所有操作都必须在合法授权的前提下进行。也就是说,你分析的应该是自己编写的程序、开源项目、CTF 官方提供的靶机程序,或者你拥有明确授权的软件。严禁使用 Cheat Engine 修改在线游戏数据、破坏他人软件、绕过认证系统或窃取数据。文中的示例程序是本地产的一个简单可执行文件,不涉及任何第三方游戏,所以可以放心跟着练习。
整体学习路线安排如下:
- 准备环境:安装 Cheat Engine、编译测试程序、准备 AI 编程工具。
- 理解原理:内存地址、数值扫描、指针、偏移、汇编指令。
- 完成一个完整实战:编写 C 测试程序,用 Cheat Engine 定位并修改数值。
- 使用 Lua 脚本把扫描流程自动化。
- 借助 AI 生成 Lua 和 Python 脚本,并学会检查和验证 AI 输出。
- 整理常见问题和工程建议。
2. 环境准备与版本说明
这一节我们先把开发和学习环境准备好。由于 Cheat Engine 的版本迭代比较快,界面布局和 Lua API 在不同版本之间可能存在差异,因此本文重点演示的是通用的操作思路,大家需要根据自己本地的实际版本做微调。
2.1 下载与安装 Cheat Engine
Cheat Engine 官网是cheatengine.org,这里可以提供最新版本的安装包。这里有一个很重要的建议:不要为了追求“老版本”去第三方网站下载所谓的“精简版”“压缩包绿色版”。老版本往往存在兼容性问题,而且非官方渠道下载的压缩包有可能被捆绑了恶意程序,完全不值得冒险。官网下载的版本可能会被杀毒软件误报,这是因为 CE 本身具备读取和写入其他进程内存的能力,属于安全软件高度敏感的行为。建议在确认安装包来源可靠的情况下,将 CE 加入杀毒软件的白名单,或者使用虚拟机、隔离环境进行学习。
安装时注意几点:
- 安装路径不要包含中文和空格,避免部分脚本解析异常。
- 安装时建议看清是否捆绑了其他组件,如果不需要就取消勾选。
- 如果是 Windows 系统,建议以管理员身份运行 CE,否则后续附加进程时可能权限不足。
2.2 准备一个本地测试程序
为了学内存扫描,不能上来就附加一个大型游戏,那样内存数据量大,新手容易懵。更好的方式是自己写一个行为简单、输出清晰的小程序,用于观察内存变化。我会选择 C 语言来写这个测试程序,因为 C 程序的变量在内存中的布局很直观,也可以让读者对地址和数据类型的理解更加扎实。需要准备一个 C 编译器,Windows 下可以用 MinGW-w64,Linux 下直接用 gcc 即可。
如果你平时主要写 Python,也不用担心,后面的 AI 辅助脚本部分会用到 Python。测试程序只是辅助我们理解 CE 的工作原理。
2.3 AI 编程工具的选择
AI 编程工具目前非常多,常见的有:
- Cursor:一款 AI 原生的代码编辑器,内置对话式编程能力,支持多种主流模型。
- GitHub Copilot:由 GitHub 和 OpenAI 推出的 AI 编程助手,集成在 VS Code、JetBrains 等 IDE 中。
- 通义灵码、CodeGeeX 等国内 AI 编程插件:可以集成在 VS Code、PyCharm 等编辑器中,使用门槛较低。
- 一些通用大模型聊天工具,例如 ChatGPT、Claude、DeepSeek 等,也可以用来生成脚本和解释概念。
不同工具的免费策略一直在变化。举例来说,Cursor 有免费版和付费 Pro 版,GitHub Copilot 针对学生和开源维护者有免费额度,具体政策以官方页面为准。我不在这里推荐“哪个最好”,因为模型和工具更新太快。关键是选一个你用得顺手、能处理代码生成和代码解释的 AI 工具。本文的示例会把提示词写清楚,大家把它们复制到任意 AI 工具中,基本都能得到类似的结果,再根据 AI 返回的代码做适当调整即可。
3. 核心概念拆解:内存扫描背后的原理
在动手指操作之前,先把几个核心概念讲透。很多新手照着教程扫描成功后,换一个程序就不会了,根本原因就是没有理解 CE 到底在做什么。
3.1 进程与内存地址空间
现代操作系统给每个进程分配了一个独立的虚拟地址空间。这个地址空间听起来像是一个连续的大数组,每个字节都有一个地址,例如0x00401000、0x7FFE1234。程序中声明的变量,本质上是虚拟地址空间中的一小片数据区域。
举例来说,C 语言里的int score = 10;,在内存中占用 4 个字节,里面保存了整数 10。程序运行时,CPU 通过地址来访问这个值。Cheat Engine 做的事情,就是附加到进程上,通过操作系统提供的调试接口去搜索“内存中哪个地址保存了符合条件的数据”。它可以读取任意地址的值,也可以写入新值,这很像一个“可视化内存调试器”。
3.2 数值扫描:精确扫描与未知初始值扫描
Cheat Engine 最核心的交互是“扫描”。所谓精确扫描,就是告诉 CE 当前目标值的具体数值,例如“请帮我找到内存中所有值为 100 的 4 字节整数”。CE 会把进程内存空间遍历一遍,把所有符合条件的内存地址列出来。
但大多数程序里的数值是会变化的,比如人物的血量从 100 变成 80,再从 80 变成 50。这时候可以使用“未知初始值扫描”方式:先扫描全部内存,然后等待程序数值变化,再告诉 CE “这个值增加了”“这个值减少了”“这个值没变”,通过多轮筛选缩小范围,最终定位到唯一或少数几个地址。这个过程非常适合用来理解“动态筛选”的思路,也是很多内存分析的通用方法。
3.3 指针、偏移与多级指针
在很多实际程序中,目标值并不是一个孤立的全局变量,而是一个复杂对象内部的一个字段。例如一个玩家对象存放在地址0x00A1B2C0,血量字段在这个对象基址偏移0x10的位置,那么实际血量地址就是0x00A1B2C0 + 0x10。
更麻烦的是,这个对象本身往往不是固定的。程序可能会在每次启动时动态分配内存,导致玩家对象的地址每次都不一样。为了稳定找到血量值,CE 引入了“指针扫描”的概念:先找到指向玩家对象地址的指针,再分析指针和偏移链。这个知识点比较进阶,入门阶段不需要完全掌握,但至少要知道“数值地址可能变化”这件事很常见,所以 CE 提供了指针扫描功能。
3.4 汇编指令与修改行为
除了修改内存数值,CE 还能查看和修改机器指令。比如一条指令是cmp eax, 0x64,意思是把 eax 和 100 比较,后面可能跟着一个跳转指令决定逻辑走向。如果把这个比较条件改掉,或者把跳转指令改成 NOP(空指令),程序的行为就会发生变化。这属于汇编级修改,比单纯改数值更接近逆向工程的核心。入门阶段可以把重点先放在数值修改上,但要对“指令也是内存中的字节”有概念。
4. 第一个实战:用 Cheat Engine 定位内存数值
这一节是整篇文章最核心的实操环节。我会带着大家从编写测试程序开始,完成一次完整的内存定位和修改过程。
4.1 编写并编译本地测试程序
在任意目录下新建一个文件,名字可以叫demo_score.c,内容如下:
#include <stdio.h> #ifdef _WIN32 #include <windows.h> #else #include <unistd.h> #endif int main() { int score = 0; int round = 1; while (1) { score += round; printf("[Round %d] score = %d\n", round, score); #ifdef _WIN32 Sleep(1000); #else sleep(1); #endif round++; } return 0; }这个程序的行为非常简单:定义一个score变量,每一轮把round累加到score上,然后打印出来,等待 1 秒后进入下一轮。也就是说,score会按照 1、3、6、10、15……这样的规律递增。程序本身非常安全,不会破坏任何外部资源,适合作为 CE 的练习目标。
编译命令如下。
Windows 下使用 MinGW-w64:
gcc demo_score.c -o demo_score.exeLinux 下使用 gcc:
gcc demo_score.c -o demo_score编译成功后,先运行这个程序。你会看到类似下面的输出:
[Round 1] score = 1 [Round 2] score = 3 [Round 3] score = 6 [Round 4] score = 10按Ctrl+C可以终止程序。接下来我们要一边运行这个程序,一边用 CE 扫描。
4.2 附加进程并完成精确扫描
启动demo_score.exe,让其保持运行。然后以管理员身份打开 Cheat Engine。打开后界面上通常会有一个类似放大镜的按钮,或者直接显示“选择进程”的入口。点击后,在弹出的进程列表中找到demo_score.exe,选中并点击“打开”。
附加成功后,CE 会自动进入当前进程的内存空间。我们的目标是找到score变量的地址。
操作步骤:
- 观察终端里程序刚打印出的
score值,例如[Round 5] score = 15。 - 在 CE 的 Value 输入框中输入
15。 - 扫描方式(Scan Type)选择
Exact Value(精确数值)。 - 数值类型(Value Type)选择
4 Bytes,也就是 4 字节整数。 - 点击
First Scan(首次扫描)。
此时 CE 会遍历进程内存,找出所有值为 15 的 4 字节整数。由于内存中存在大量临时数据,结果通常不止一个,比如可能有几千个。不要慌,继续下一步。
回到终端等待程序输出下一轮结果,假设变成了[Round 6] score = 21。在 CE 的输入框中改成21,点击Next Scan(再次扫描)。此时结果数量会急剧减少。重复这个过程,每轮都输入终端上显示的最新score值,并点击Next Scan,直到结果数量减少到几个甚至一个。
当结果只剩个位数时,就可以在 CE 下方的地址列表中看到候选地址了。这组地址就是在当前进程运行期间,实际保存score变量的内存地址。双击其中一个地址,它会出现在 CE 底部的结果栏中。
简化为下表:
| 操作 | 输入值 | 预期结果 |
|---|---|---|
| First Scan | 15 | 大量结果 |
| Next Scan | 21 | 结果减少 |
| Next Scan | 28 | 结果继续减少 |
| Next Scan | 36 | 结果接近唯一 |
4.3 修改内存数值并观察程序行为
拿到地址后,我们可以尝试修改这个地址中的值。在 CE 底部结果栏中,双击Value列下的数值,把它改成例如999,然后回车。
回到测试程序的终端,观察下一次输出。你会看到score被打印成了 999 或 1000 这样的值。为什么不是一直 999?因为程序本身还在执行score += round,当你修改完内存后,下一轮循环会继续在这个基础上累加,所以打印出的值会从 999 继续增长。
这里引出一个非常重要的概念:内存修改是即时的,但程序后续的写操作会继续改变该地址。如果希望目标值一直被锁定,就需要使用 CE 的“激活锁定”功能。在地址列表中,点击该地址所在行的“锁定”复选框(通常是一个小方框)。锁定后,CE 会以固定频率把该地址的值强制写成你设定的值。这样程序每次累加后,值又会被 CE 改回来,体现在终端上就是score维持不变。这个功能非常适合用来理解“程序写入 vs 外部写入”的竞争关系。
4.4 用 Lua 脚本自动化扫描流程
手动扫描虽然直观,但每次都要输入数值、点击按钮,效率太低。Cheat Engine 内置了 Lua 脚本环境,可以通过脚本自动完成扫描过程。
下面是一段完整的 Lua 脚本,它的功能是:输入一个目标数值,对当前已经附加的进程执行精确扫描,并输出结果数量。
-- 获取当前附加的进程ID local pid = getOpenedProcessID() if pid == 0 then print("请先打开一个进程") return end -- 让用户输入要扫描的数值 local value = tonumber(inputQueryBox("请输入要扫描的数值", "100")) if value == nil then print("输入无效,脚本退出") return end -- 创建内存扫描对象 local scan = createMemScan() -- 执行首次扫描: -- soExactValue 表示精确匹配 -- vtDword 表示 4 字节整数 -- 扫描范围 0x00000000 ~ 0x7FFFFFFF scan.firstScan(soExactValue, vtDword, 0, 0x7FFFFFFF, "", 0, 0, value, 0, 0) scan.waitTillDone() -- 创建结果列表并输出数量 local list = createFoundList(scan) list.initialize() print(string.format("扫描完成,共找到 %d 个结果", list.Count)) -- 释放资源 list.destroy() scan.destroy()在 CE 中打开 Lua 脚本的入口通常是菜单栏的Table -> Show Cheat Table Lua Script,或者直接按Alt + L。把上面的代码粘贴进去,点击执行。如果 CE 的版本较老,部分 API 名称可能不同,需要参考当前版本的英文帮助文档。这段脚本只是一个最小示例,真实项目里建议在firstScan之前先清空上一次的结果列表,避免内存占用过高。
5. AI 编程辅助实践:从自然语言到内存工具
环境准备好之后,我们进入 AI 编程部分。很多读者会有疑问:AI 到底能帮我做什么?这一节我会给出几个完整的提示词和输出示例,同时强调“如何检查 AI 输出”。
5.1 为什么需要给 AI 写清楚提示词
AI 编程工具虽然强大,但如果你只说“帮我写一个 CE 脚本”,AI 根本不知道你的 CE 版本、目标进程、数据类型、扫描范围,给出的代码往往不可用。这就是为什么“AI 编程提示词”本身也是一项技能。一份好的提示词应该包含以下信息:
- 目标平台和工具版本:例如 Cheat Engine 7.x。
- 场景描述:我要附加一个什么特征的进程,想要完成什么操作。
- 输入与输出:例如输入一个整数,输出扫描结果数量。
- 编程语言或脚本语言:Lua、Python、C 等。
- 约束条件:例如要求代码注释清楚、要求处理错误输入、要求兼容 x64 进程。
把需求描述得越具体,AI 返回的代码就越接近可用状态。
5.2 示例一:让 AI 生成 CE Lua 扫描脚本
你可以把下面的提示词复制给任意 AI 编程工具:
我使用 Cheat Engine 7.5,附加了一个正在运行的 C 语言测试程序。程序里有一个 4 字节整数变量 score,每隔 1 秒递增。请帮我写一个 CE Lua 脚本: 1. 提示用户输入要扫描的数值; 2. 使用精确扫描扫描当前进程中的 4 字节整数; 3. 创建结果列表并输出结果数量; 4. 扫描结束后释放资源; 5. 请给每一行代码添加中文注释,并说明 API 的用途。AI 给出的代码可能会和我们上一节写的 Lua 脚本高度相似,也可能会有 API 名称上的差异。这不代表 AI 是错的,而是因为不同 CE 版本的 Lua API 确实有区别。我们需要逐行检查,尤其注意getOpenedProcessID、createMemScan、firstScan、createFoundList这些关键函数在本地 CE 版本中是否存在。
5.3 示例二:让 AI 生成 Python 内存分析脚本
除了 Lua,我们还可以用 Python 来读取和修改进程内存。这里会用到pymem库,它是一个跨平台的 Python 内存操作库,底层封装了 Windows API。安装方法是:
pip install pymem下面是一段 Python 脚本示例,演示如何附加进程并读取指定地址的整数:
import pymem import pymem.process def main(): process_name = "demo_score.exe" try: pm = pymem.Pymem(process_name) except pymem.exception.ProcessNotFound: print("未找到进程,请先运行测试程序") return # 获取主模块基址 # 注意:这里只是示例,实际基址需要根据本机情况修改 module = pymem.process.module_from_name(pm.process_handle, process_name) if module is None: print("未找到主模块") return base_address = module.lpBaseOfDll print(f"主模块基址: 0x{base_address:X}") # 第 4 节中我们用 CE 定位到了 score 的地址 # 假设该地址为 0x00400000,读者需要替换为 CE 实际找到的地址 score_address = 0x00400000 value = pm.read_int(score_address) print(f"地址 0x{score_address:X} 的值为 {value}") # 修改内存值 pm.write_int(score_address, 123) print("已将目标地址写为 123") if __name__ == "__main__": main()需要注意,pymem在 Windows 上操作进程内存需要管理员权限,所以脚本也要以管理员身份运行。score_address不能照抄,必须用 CE 实际定位后得到的地址替换,否则读取到的不是score变量。这个脚本展示了 AI 可以帮我们快速搭起功能骨架,但“地址是什么”依然需要人通过 CE 来确认。
5.4 示例三:用 AI 解释汇编指令与特征码
在 CE 中打开内存查看器,可以看到目标进程的反汇编指令。例如下面这段汇编:
0x004015A3 mov eax, [ebx+0x10] 0x004015A6 cmp eax, 0x64 0x004015A9 jle 0x004015B2 0x004015AB xor eax, eax 0x004015AD ret看不懂这些指令时可以发给 AI,提示词可以这样写:
请解释下面这段 x86 汇编指令的作用,逐行说明每条指令对寄存器和内存的影响,以及整体逻辑可能是什么场景: mov eax, [ebx+0x10] cmp eax, 0x64 jle 0x004015B2 xor eax, eax retAI 会告诉你:这段代码从[ebx+0x10]地址处读取一个 4 字节值到eax,接着与 100 比较,如果小于等于 100 则跳转到0x004015B2,否则将eax清零并返回。这种逐行解释对新手理解汇编非常有帮助。但要注意,AI 只能基于指令本身推断逻辑,不清楚程序上下文时不能给出 100% 确定的结论,它更适合作为辅助理解工具。
5.5 如何检查 AI 输出
AI 生成的代码并不总是正确,尤其是涉及底层 API 时。下面给出几个检查点:
- API 是否存在:查阅 CE 的 Lua 文档或 pymem 的官方文档,确认函数名和参数。
- 版本是否匹配:CE 7.x 和 CE 6.x 的 Lua API 有差异,pymem 在不同 Python 版本下的兼容性也要注意。
- 权限是否充足:附加进程、读取内存、写入内存都需要相应权限,本地测试时建议用管理员运行。
- 是否有安全风险:AI 可能生成包含注入、修改其他进程、绕过安全机制的代码,这类代码只能在合法授权的测试环境中使用,绝不能用于破坏他人系统。
- 是否有硬编码地址:很多 AI 生成的脚本会假设某个固定地址,实际地址需要自己通过 CE 扫描得到,这些占位符必须替换。
6. 常见问题与排查思路
在实际操作中,大家最容易遇到下面这些问题。我整理成了一份速查表。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| CE 打不开或被杀毒软件查杀 | CE 具备进程内存读写能力,容易被安全软件误报 | 从官网下载最新版,确认文件来源可信后可加白名单 |
| 附加进程失败 | 权限不足,或目标进程是管理员权限 | 以管理员身份运行 CE |
| 首次扫描结果太多 | 内存中符合条件的值很多,属于正常现象 | 等待数值变化后继续 Next Scan 缩小范围 |
| 扫描到最后没有结果 | 数值类型选错,或目标进程已退出 | 确认数值类型是 4 Bytes,并保持目标程序运行 |
| 修改内存数值后,程序输出又变回原值 | 程序后续代码会持续写入该地址 | 使用 CE 的锁定功能,或通过脚本周期性写入 |
| AI 生成的 Lua 脚本报错 | CE 版本不同导致 API 名称不兼容 | 逐行检查 API,查阅当前版本的 CE 帮助文档 |
| pymem 报权限错误 | Python 脚本没有以管理员身份运行 | 以管理员身份重新运行终端和脚本 |
| 读出来的值不是实际分数 | 地址是硬编码的占位地址 | 用 CE 先定位真实地址,替换脚本中的地址 |
| 目标程序崩溃 | 修改了程序关键代码或数据 | 先用单机测试程序练习,不要修改核心控制流 |
除了上面这些,还有一个常见误区:很多新手一开始就打开一个大型游戏来练手,内存数据量非常大,扫描一次可能卡顿很久,而且结果列表庞大,很难定位。强烈建议先用本文这样的小程序练熟操作,再去研究更复杂的对象。
7. 最佳实践与工程建议
7.1 明确合法授权与测试边界
使用 Cheat Engine 分析任何程序之前,请先确认你是否有权这样做。自己编写的程序、开源项目源码构建出来的程序、CTF 提供的靶机、明确授权的软件分析项目,都是安全的练习对象。对于没有授权的商业软件和在线游戏,不要擅自附加进程修改数据。这个边界不仅在法律层面很重要,也是技术人员职业操守的一部分。
7.2 从“改数值”走向“理解结构”
很多人学会修改数值后,就停留在“改金币、改血量”的层面。如果想把能力转化为工程价值,建议继续深入几个方向:
- 指针与偏移:研究复杂对象在内存里的组织方式。
- 数据结构分析:理解链表、数组、对象池在内存中的体现。
- 汇编指令修改:从修改数据升级到修改控制流。
- 特征码定位:在程序更新后自适应定位关键函数。
这些能力在游戏开发、调试器开发、安全研究和 CTF 竞赛中都非常有用。Cheat Engine 不只是“改游戏工具”,它是一扇理解计算机底层运行机制的窗口。
7.3 用 AI 辅助而不是替代思维
AI 编程能生成大量代码,但如果你不理解代码每一行在做什么,遇到细微的问题就会束手无策。建议把 AI 当作“结对编程的助手”,而不是“作业代写工具”。每拿到一段 AI 生成的脚本,至少做到:
- 通读一遍,理解关键 API 的作用。
- 在本地测试环境中运行验证。
- 标注哪些行是固定的、哪些行需要根据目标环境调整。
- 记录修改过程和遇到的问题,形成自己的调试笔记。
这样做不仅能提升代码质量,也能让 AI 的辅助效果真正转化成为你自己的能力。
7.4 保存工作区与配置管理
CE 中有一个非常有用的功能是.CT表文件,它可以保存你扫描出的地址、指针路径、锁定状态以及 Lua 脚本。建议为每个目标程序单独建一个目录,里面保存:
- CE 的
.CT表。 - 相关的 Lua 脚本。
- Python 分析脚本。
- 运行日志和记录。
这样即使程序重启导致地址变化,你也能通过 CT 表和指针扫描快速恢复工作现场。
7.5 版本兼容与可复现性
如果你把脚本分享给同事或同学,一定要注明 CE 版本、目标程序架构(x86 还是 x64)、操作系统版本。这些信息直接影响脚本能否运行。例如在 x64 进程中,某些地址范围会超出 32 位 Lua 脚本的约定上限;pymem 在 Python 3.12 和 Python 3.8 上也可能出现第三方依赖差异。尽量在脚本开头用注释记录版本信息,这样后续维护和排查都会高效很多。
学习 Cheat Engine 和 AI 编程的组合,最大的收获不是学会某个具体按钮,而是建立一种“观察程序运行时行为”的思维模式。建议你照着第 4 节的例子先把一次扫描完整跑通,再让 AI 帮你生成 Lua 和 Python 脚本,最后把这些脚本改造成适合自己的工具。等你对数值扫描和地址定位足够熟练后,再尝试指针扫描、汇编级修改和复杂数据结构分析,这些能力在调试、逆向和 CTF 中都能长期复用。