ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Cheat Engine + AI编程:内存调试与Lua脚本自动化入门

Cheat Engine + AI编程:内存调试与Lua脚本自动化入门 拿到“Cheat Engine AI 编程入门课”这个题目时大多数人第一反应是“用 AI 教人做游戏修改器”。这个判断并不准确。Cheat Engine 虽然名字里有 Cheat网上教程也大多围绕“修改金币、锁定血量”但它的底层能力是通用的进程内存调试工具附加进程、数值扫描、指针追踪、反汇编查看、断点调试以及一套完整的 Lua 脚本环境。真正值得学的是利用这些能力去理解程序内存布局、定位关键变量、分析指针链然后把这些经验用在逆向工程、CTF 解题、游戏开发调试和漏洞研究上。这篇文章把这套能力拆成一门入门课先安装工具、写一个测试程序然后手动完成一次内存扫描再用 AI 编程工具辅助生成 Cheat Engine 的 Lua 脚本把“手动操作”变成“自动化脚本”。全程会说明每个步骤背后的原理、排查路径和常见坑。示例只围绕自己编写的本地程序和明确授权的实验环境展开不涉及在线游戏、反作弊规避或非法破解。1. 先理解 Cheat Engine 的定位从游戏修改器到内存调试工具1.1 Cheat Engine 的核心能力与使用场景Cheat Engine 是一款开源的内存扫描和调试工具。它最出名的用法是修改单机游戏内的数值例如把玩家血量从 100 改成 9999。但从工程视角看它做的事情是“进程附加、内存读取、数值定位、结果修改”。这套能力在调试自研程序、分析崩溃问题、学习逆向和参与 CTF 时同样有效。它的主要功能可以分成几个模块进程附加选择一个正在运行的进程读取其内存空间。数值扫描根据值的变化缩小范围找到存储该值的内存地址。内存查看与修改查看指定地址附近的数据直接写入新值。指针扫描解决程序重启后地址变化的问题找到“指向目标地址的指针链”。汇编与调试功能查看反汇编代码、设置断点、单步执行。Lua 脚本环境通过脚本控制上述操作实现批量扫描、自动修改和复杂逻辑。和 x64dbg、OllyDbg 这类调试器相比Cheat Engine 的上手门槛低很多。它不需要先理解寄存器、断点、调用栈也能完成第一次“找数值、改数值”的实验。这个特点恰好适合初学者建立内存分析的直觉。1.2 AI 编程在 CE 学习中解决什么问题Cheat Engine 的 Lua 脚本能力很强大但它的 API 文档并不算完善版本之间也有差异。新手想写一个“从目标地址读取整数并打印”的脚本往往要查很久资料。这时候 AI 编程工具就有了明确价值把“我要定时读取这个地址并打印”变成自然语言描述AI 生成对应的 Lua 脚本再放到 CE 的 Lua 控制台里运行。AI 编程工具不只是 Cursor 这类 AI 原生编辑器也包括 VS Code、PyCharm 里的 AI 助手插件。它们的共同点是能根据提示词生成代码、解释代码、补充注释和修改报错。对于 Cheat Engine 这种“API 细节多、示例分散”的场景AI 能大幅减少检索时间。但不能因此就不理解脚本在做什么。AI 生成的 Lua 脚本仍然需要人工检查 API 名称、地址类型、读写函数是否匹配当前 CE 版本。最好把 AI 当成一个“熟悉 CE 但偶尔会犯错的老同事”而不是“最终答案来源”。1.3 使用边界只在授权环境中做内存实验这里必须先把边界说清楚。内存扫描和修改的能力是一把双刃剑能用在学习与调试上也可能被用来做不正当的事。这篇内容里的所有操作只针对以下环境自己编写的测试程序或学习项目开源软件或明确允许二次调试的程序CTF 靶机、本地虚拟机中的实验环境有书面授权或合同允许的安全测试项目。不要把它用到在线游戏、反作弊系统、商业软件激活校验或其他未授权目标上。技术学习的前提是合规使用。把这句话放在前面后面所有操作才能有安全的落脚点。2. 准备环境安装 CE、选择 AI 编程工具并编写测试程序2.1 安装 Cheat Engine来源比版本更重要下载 Cheat Engine 时第一个问题是“从哪里下载”。这类内存调试工具经常被压缩包站点、网盘链接和来路不明的“老版下载”页面二次打包里面可能混入恶意程序。推荐的做法是只从官方网站或可信的开源仓库获取安装包不要为了追求“老版本”去未知站点下载压缩包。安装后还要注意杀毒软件提示。CE 因为具有读写其他进程内存的能力常被杀毒软件识别为风险工具或 HackTool。遇到误报时不要直接关闭安全软件先确认文件哈希和下载来源。如果来自官方渠道需要在测试环境运行或添加白名单如果来源不明宁可放弃安装。不同 CE 版本的 Lua API 有差异。本文示例使用常见函数例如readInteger、writeInteger、readPointer、getAddress但落地时要以你当前版本的 Lua 控制台帮助信息为准。不要假设某个函数在旧版本中一定存在。2.2 选择 AI 编程工具Cursor、VS Code 插件和 PyCharm 插件AI 编程工具的选型没有绝对标准。当前常见的方案有以下几类工具类型代表工具适合场景AI 原生编辑器Cursor集成对话、代码补全、多文件修改适合完整脚本开发通用编辑器插件VS Code AI 插件轻量接入不影响原有编辑习惯IDE 内置插件PyCharm、IntelliJ 的 AI 插件写 Python、Java 等工程代码时顺带生成脚本在线对话式 AI各类大模型对话服务快速生成片段再粘贴到 CE 中使用具体哪家免费、哪家收费、免费额度是多少随时可能调整以官方说明为准。对于本文这种“生成一个 Lua 脚本”的任务使用已经装好的 AI 插件或任意对话模型即可不需要专门追求最新工具。2.3 编写一个适合扫描的测试程序内存扫描需要一个“值会变化”的目标。这里推荐用 C 语言写一个简单的计数器程序因为 C 程序的int全局变量在内存中是连续、明确的 4 字节数据CE 扫描很容易命中。相比之下Python 的整数是对象内存结构复杂不适合第一次练习。创建一个memory_lab.c文件#include stdio.h #ifdef _WIN32 #include windows.h #define SLEEP_ONE Sleep(1000) #else #include unistd.h #define SLEEP_ONE sleep(1) #endif int counter 100; int max_counter 10000; int main() { while (1) { counter; if (counter max_counter) { counter 1; } printf(counter %d\n, counter); SLEEP_ONE; } return 0; }这段程序的核心是维护一个全局整数变量counter每秒递增一次到 10000 后回绕到 1。printf的作用是让程序持续产生输出方便确认运行状态也方便观察修改后效果。使用 gcc 或任意 C 编译器编译gcc memory_lab.c -o memory_labWindows 下如果使用 MinGW同样用这条命令Linux 下编译后直接运行。编译成功后先运行程序保持终端窗口可见以便观察counter的变化。为什么不用 Python因为 CE 扫描的核心是按内存中固定字节长度找数值Python 的int是可变长度对象地址和值的关系更加间接。C 的int更接近初学者对“变量在内存占据 4 字节”的理解。2.4 熟悉 CE 的 Lua 控制台入口Cheat Engine 的 Lua 脚本可以通过菜单打开。不同版本的位置略有差异常见入口是主界面菜单中的 Table 或 Cheat TableCheat Engine Lua Script 窗口Lua Engine 控制台窗口。打开后通常有一个输入框和一个输出区域。点 Execute 或按 F9 运行当前脚本。脚本中的print输出会显示在输出区域。后续的 AI 生成脚本都在这个窗口里执行。注意第一次打开 CE 时建议先做一次“附加进程、扫描数值、修改数值”的完整手动流程再进入 Lua 脚本阶段。跳过手动流程直接跑脚本容易在遇到异常时找不到原因。3. 建立扫描直觉手动定位测试程序中的计数器变量3.1 附加进程并执行第一次扫描在 CE 主界面左上角点“选择一个进程”按钮找到memory_lab进程并附加。附加成功后CE 会读取该进程的内存空间信息。此时测试程序还在运行counter的值大约在几百到上千之间。在 CE 的扫描区域进行设置Value Type4 Bytes整型Scan TypeExact Value精确数值Value当前程序输出中看到的 counter 数值点“First Scan”后CE 会列出所有内存中等于该值的 4 字节地址。因为进程中的临时数据和字符串缓冲区也可能包含相同数值结果通常不止一个而是几十到上百个。第一次扫描的作用是“候选集”。CE 不需要知道哪个地址是正确的它只需要一个起点然后在后续扫描中不断缩小区间。3.2 等待值变化执行第二次扫描回到程序窗口等待counter变化记下新值。再回到 CE把 Scan Type 保持 Exact ValueValue 改成新值点“Next Scan”。此时结果会大幅减少可能只剩几个地址甚至只剩一个。反复执行“等待变化、再次扫描”的过程能快速定位唯一地址。如果目标值变化太快可以在 CE 的选项里尝试“暂停进程”或使用“ValueChanged”这类扫描方式。但对于这个测试程序每秒一变并不需要暂停。定位到唯一地址后把它加入地址列表。此时你能看到该地址的当前值会随着程序运行不断变化。手动修改这一行的值为 12345程序输出会在一秒内变成 12345说明这个地址就是counter的存储位置。3.3 为什么地址不是固定的认识动态地址问题把程序关掉重新启动再次附加进程并扫描。你会发现刚才那个地址已经失效了需要重新按“初始值、变化后的值、再变化”流程扫描一遍。原因在于现代操作系统普遍使用地址空间布局随机化程序的全局地址、堆地址和栈地址在每次启动时都可能不同。Cheat Engine 的指针扫描功能正是为了解决这个问题。手动扫描能帮你理解现象但真正面对真实软件时需要掌握“基址 偏移”的指针链思想。3.4 手动扫描流程留下的三个结论手动扫描看起来简单但它解释了很多后续问题扫描本质是“按值缩小候选范围”而不是直接读出变量名。进程会包含大量相同数值的临时数据所以需要二次扫描。地址可能随程序重启而变化所以不能把硬编码地址当答案。理解这三点后才能明白为什么需要 Lua 脚本自动化手动反复扫描太慢了而脚本可以批量读取、批量比较、按条件打印结果。4. 用 AI 提示词生成 CE Lua 脚本跑通读写闭环4.1 设计一个可执行的 AI 提示词模板AI 编程工具生成脚本的效果很大程度取决于提示词质量。写提示词时不要只说“帮我写个 CE 脚本”要给出角色、场景、任务、约束和输出格式。推荐采用这样的结构角色你是一个熟练使用 Cheat Engine Lua API 的脚本开发者。 场景我已经附加了 memory_lab 进程已知 counter 的地址是 0x00310000类型是 4 字节有符号整数。 任务编写一个 CE Lua 脚本读取该地址的值并打印。 要求 1. 使用 Cheat Engine 内置 Lua API。 2. 检查地址是否有效无效时输出错误信息。 3. 打印格式为counter value 值把地址改成你在手动扫描中实际得到的地址即可。这段提示词包含足够上下文AI 生成脚本时不会凭空发挥。4.2 生成一个读取并打印地址值的脚本AI 生成的脚本可能长这样local address 0x00310000 local value readInteger(address) if value nil then print(读取失败地址可能无效) return end print(string.format(counter value %d, value))运行后CE 的 Lua 输出窗口会打印当前counter的数值。关键点有两个第一readInteger返回的是目标进程中的 4 字节整数不是 Lua 脚本所在进程的数据第二nil表示读取失败常见原因是地址错误、进程切换或权限不足。4.3 生成一个修改地址值的脚本在读取脚本的基础上再加一个写入操作local address 0x00310000 local target 8888 local oldValue readInteger(address) if oldValue nil then print(读取失败地址无效) return end writeInteger(address, target) local newValue readInteger(address) print(string.format(old %d, new %d, oldValue, newValue))运行完这个脚本后回到程序窗口会看到counter被改成了 8888随后继续从 8888 递增。这就是“内存读写”的最小闭环。4.4 用 AI 生成定时读取脚本引入定时器只读一次还不够直观。如果能每 200 毫秒读取一次就能看到地址值的变化过程。向 AI 提问请写一个 CE Lua 定时器脚本每隔 200 毫秒读取一次地址 0x00310000 的 4 字节整数值并打印出来。要求使用 createTimer脚本要能直接运行。AI 可能生成类似代码local address 0x00310000 function onTimer() local value readInteger(address) if value nil then print(定时读取失败地址无效) timer.destroy() return end print(value .. value) end local timer createTimer(nil) timer.Interval 200 timer.OnTimer onTimer timer.enabled true这段脚本在不同 CE 版本中可能需要对createTimer的属性和方法做小调整。运行时如果报attempt to call a nil value优先自查 API 名称是否被当前版本支持。不要直接照搬网络片段要在本机 CE 的 Lua 控制台里测试。注意createTimer的定时回调是在 CE 的界面线程中执行的不要在里面执行耗时过长的循环。如果需要大量遍历内存考虑分成多次调用或改用其他异步方案。4.5 用 AI 生成批量处理脚本从地址列表读取数据现在可以让 AI 处理更符合实际的问题批量读取多个地址的值。在提示词中给出一组地址要求输出每个地址的值local addresses { [1] 0x00310000, [2] 0x00310004, [3] 0x00310008 } for i, addr in ipairs(addresses) do local val readInteger(addr) if val nil then print(string.format([%d] addr0x%X, read failed, i, addr)) else print(string.format([%d] addr0x%X, value%d, i, addr, val)) end end这个脚本解决了一个常见痛点手动在地址列表里一个个看值很慢脚本可以统一打印并通过条件判断筛选出符合要求的值。4.6 AI 提示词常见失败与修正方向第一次让 AI 写 CE 脚本时经常会遇到这些失败失败现象常见原因修正方法AI 生成了文件读写、网络请求等代码不清楚 CE Lua 是受限环境在提示词中明确“只使用 Cheat Engine 内置 Lua API”使用了ReadProcessMemory等 WinAPIAI 误以为是普通 Lua要求“不调用外部库使用 CE 的 readInteger/writeInteger”硬编码了错误地址地址是示例未替换提示词中填入实际地址并标明地址来源函数版本不兼容CE 版本较旧打开当前版本的 Lua 帮助文档让 AI 改成兼容写法定时器脚本无法停止缺少定时器销毁逻辑在提示词中增加“运行后能停止”的要求AI 编程工具在 CE 这个垂直领域并不是“全知全能”它的价值是把 80% 的代码骨架补齐最后 20% 的兼容性调整仍然要靠你对当前环境的理解。5. 处理动态地址指针扫描与 Lua 指针链解析5.1 为什么需要指针扫描手动扫描得到的是“一次运行中的绝对地址”。程序重启后由于系统随机化加载地址同一个变量可能从0x00310000变成0x007A2B40。但如果程序内部使用一个“指向该变量的指针”并且这个指针本身存储在相对固定的模块地址附近那么问题就转化为“找到稳定的指针链”。指针链可以理解为一条路径静态基址 偏移1 - 地址A 地址A处的指针 偏移2 - 地址B 地址B处的指针 偏移3 - 最终变量地址只要静态基址是稳定的即使最终变量地址变化也能通过这条链计算出来。5.2 用 CE 的指针扫描功能找到指针链CE 提供了 Pointer Scan 功能。流程是找到当前变量的实际地址选择“指针扫描”指定扫描深度和偏移范围重启程序再次找到变量地址用新的地址验证候选指针链。指针扫描结果通常很多需要结合多个样本筛选出稳定路径。这个操作可以用 AI 辅助理解把 CE 找到的指针链贴给 AI让它解释每一层“地址 偏移”的含义。5.3 用 AI 生成“指针链解析脚本”假设你已经确认了一条指针链memory_lab.exe 0x0023A1B0 - 指针 指针 0x10 - 指针 指针 0x04 - 目标变量可以通过 Lua 脚本验证local base getAddress(memory_lab.exe0023A1B0) if base nil then print(模块地址获取失败) return end local ptr1 readPointer(base) local ptr2 readPointer(ptr1 0x10) local finalAddr ptr2 0x04 local value readInteger(finalAddr) print(string.format(base0x%X, base)) print(string.format(ptr10x%X, ptr1)) print(string.format(ptr20x%X, ptr2)) print(string.format(finalAddr0x%X, finalAddr)) print(string.format(value%d, value))如果每一层都能成功读取且最终值符合程序输出说明指针链有效。实际项目中指针链可能更长偏移也会更复杂但验证逻辑是一样的。5.4 让 AI 解释指针链背后的数据结构指针链不只是“地址计算技巧”它往往对应程序里的对象引用关系。比如对象指针 0x10 可能是一个子对象字段 子对象 0x04 可能是你关心的整数属性可以把指针链和 CE 反汇编窗口中的地址一起提供给 AI请它结合汇编指令解释这几层偏移可能对应什么样的结构体。AI 的回答不一定完全正确但能提供分析方向尤其是对刚接触结构体布局的初学者很有帮助。6. 常见问题与排查路径从扫描到脚本的故障定位6.1 扫描不到目标数值这是最普遍的初级问题。现象是“第一次扫描结果为空”或者“第二次扫描后结果全部消失”。排查顺序确认进程是否附加正确有没有附加到同名的其他进程。确认数值类型是否正确。C 语言int用 4 Bytesshort用 2 Bytesfloat用 Float 类型。确认目标值是否在变化。如果值变化过快可以暂停进程再扫描。确认扫描范围。默认范围通常覆盖全进程部分精简模式可能缩小范围。如果值是随机变化且初始值未知改用“Unknown initial value” “Changed/Unchanged”扫描方式。6.2 附加进程失败或权限不足CE 附加某些进程时可能报错原因是进程权限较高或 CE 未以管理员权限运行。处理方式Windows 下右键 CE 图标选择“以管理员身份运行”。确认目标进程不是系统保护进程不是反作弊保护的游戏进程。检查杀毒软件是否拦截了 CE 的进程附加行为。不要为了提高权限去关闭系统安全防护更不要在反作弊环境中进行附加操作。合规前提要始终保留。6.3 Lua 脚本报 attempt to call a nil value运行时提示找不到某个函数常见原因有三个CE 版本较旧Lua API 不存在。函数名拼写错误例如把readPointer写成readPointer之外的自造名。在当前脚本环境中没有初始化模块。排查方式在 CE Lua 控制台输入print(readInteger)看输出是不是function: ...。如果是nil说明当前版本没有这个函数需要找替代 API。查看 CE 安装目录中的 Lua 帮助文档确认当前版本的函数列表。6.4 修改值后程序立即崩溃写入成功但程序崩溃说明写入的数据类型或地址不符合程序预期。可能原因包括把只读内存段的内容改坏了。写入的是 4 字节整数但目标位置实际是 2 字节或浮点数。地址指向了已释放的内存或无效对象。在自研程序中崩溃反而是一种反馈。可以在测试程序的输出和退出状态中观察崩溃时机再辅助 CE 的异常调试功能定位是哪次写入触发的。不要把这个现象带到无关程序上去验证。6.5 AI 生成的脚本与 CE 版本不匹配AI 从训练数据中学习到的 CE 脚本可能来自不同版本生成的代码里有新版函数在本机旧版中不存在。这是 AI 编程最常见的坑。处理方式打开本机 CE 的 Lua 帮助页面把相关 API 说明贴回给 AI。如果确认某些函数缺失让 AI 只使用readInteger、writeInteger、readPointer、getAddress这四个基础函数重写。仍然无法解决时手动改脚本不再依赖 AI。6.6 常见问题速查表问题现象可能的根因优先检查项解决方向首次扫描结果为空类型错误或值错误Value Type、当前进程调整类型和值二次扫描结果消失值变化过快是否暂停进程使用未知初始值扫描附加进程失败权限不够是否管理员运行重新启动 CELua 函数报 nilAPI 不兼容print(readInteger)查版本帮助文档地址改变程序重启静态地址使用指针扫描修改值崩溃类型不匹配写入数据类型核对变量类型AI 代码无法运行CE 版本差异Lua API 支持情况补版本信息重写7. 最佳实践CE AI 编程的合规边界与学习路线7.1 合规使用边界本文所有内存分析和脚本实验都应该限制在自研程序、开源程序、CTF 环境或已获授权的目标中。使用 CE 修改在线游戏数据、绕过反作弊系统、破解软件授权不仅是技术行为还可能违反软件协议和法律。从技术学习角度看自研测试程序足够覆盖 90% 的入门知识点。程序越简单越容易观察内存变化和指针链学习效果反而更好。7.2 建议学习路线这套入门课的核心主线是“扫描定位地址、脚本化读写、指针链解析”。完整的学习路线可以按下面顺序推进掌握精确数值扫描、未知初始值扫描、变化/不变扫描。理解 4 Bytes、8 Bytes、Float、Double、String 等类型差异。手动定位至少三个变量分别写入新值并观察效果。用 AI 生成读取、写入、批量打印、定时读取脚本。理解动态地址练习 CE 指针扫描。用 Lua 脚本验证指针链。打开 CE 的反汇编窗口把目标变量与汇编指令关联起来。回到防御视角思考如何通过内存破坏触发漏洞以及如何检测异常写入。每一步都建议准备一个独立的测试程序比如自写一个管理角色属性的 C 程序再让 AI 帮你生成管理内存数据的 Lua 工具。7.3 用 AI 加速学习但不要跳过理解AI 编程工具发展很快可能你今天用的提示词模板过几个月就有更智能的新工具。但有一点不会变在 CE 这类垂直工具中AI 仍然需要人来确认 API、地址、进程环境是否正确。比较好的做法是让 AI 生成脚本后先用 CE 的 Lua 控制台做最小测试。把一个脚本拆成三个部分获取地址、读取/写入、输出结果分别测试。如果脚本报错把错误信息原样贴回给 AI并补充 CE 版本信息。最终由自己手动修改一次脚本确保真正理解了每一行。7.4 CE AI 编程的落地检查清单检查项说明是否选择了授权环境必须是自己程序、开源程序或
返回列表