尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Cheat Engine + AI编程:内存扫描到自动化脚本实战指南

Cheat Engine + AI编程:内存扫描到自动化脚本实战指南 很多同学第一次接触 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 EngineCheat Engine 官网是cheatengine.org这里可以提供最新版本的安装包。这里有一个很重要的建议不要为了追求“老版本”去第三方网站下载所谓的“精简版”“压缩包绿色版”。老版本往往存在兼容性问题而且非官方渠道下载的压缩包有可能被捆绑了恶意程序完全不值得冒险。官网下载的版本可能会被杀毒软件误报这是因为 CE 本身具备读取和写入其他进程内存的能力属于安全软件高度敏感的行为。建议在确认安装包来源可靠的情况下将 CE 加入杀毒软件的白名单或者使用虚拟机、隔离环境进行学习。安装时注意几点安装路径不要包含中文和空格避免部分脚本解析异常。安装时建议看清是否捆绑了其他组件如果不需要就取消勾选。如果是 Windows 系统建议以管理员身份运行 CE否则后续附加进程时可能权限不足。2.2 准备一个本地测试程序为了学内存扫描不能上来就附加一个大型游戏那样内存数据量大新手容易懵。更好的方式是自己写一个行为简单、输出清晰的小程序用于观察内存变化。我会选择 C 语言来写这个测试程序因为 C 程序的变量在内存中的布局很直观也可以让读者对地址和数据类型的理解更加扎实。需要准备一个 C 编译器Windows 下可以用 MinGW-w64Linux 下直接用 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-w64gcc demo_score.c -o demo_score.exeLinux 下使用 gccgcc demo_score.c -o demo_score编译成功后先运行这个程序。你会看到类似下面的输出[Round 1] score 1 [Round 2] score 3 [Round 3] score 6 [Round 4] score 10按CtrlC可以终止程序。接下来我们要一边运行这个程序一边用 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 Scan15大量结果Next Scan21结果减少Next Scan28结果继续减少Next Scan36结果接近唯一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, [ebx0x10] 0x004015A6 cmp eax, 0x64 0x004015A9 jle 0x004015B2 0x004015AB xor eax, eax 0x004015AD ret看不懂这些指令时可以发给 AI提示词可以这样写请解释下面这段 x86 汇编指令的作用逐行说明每条指令对寄存器和内存的影响以及整体逻辑可能是什么场景 mov eax, [ebx0x10] cmp eax, 0x64 jle 0x004015B2 xor eax, eax retAI 会告诉你这段代码从[ebx0x10]地址处读取一个 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 中都能长期复用。
返回列表