简介这是一份面向游戏修改入门者的 Cheat Engine 中文实操教程以「傻瓜式」讲解降低学习门槛适合零基础玩家、逆向初学者以及想了解内存修改原理的技术爱好者。资源包内共 1 个 doc 文档约 3.86MB内容按关卡递进组织涵盖基本操作、精确数值扫描、未知初始数值、浮点数、寻找代码与指针等核心模块并配有图示辅助理解。教程从附加进程、首次扫描与再次扫描的筛选思路讲起逐步延伸到血条类未知数值的模糊搜索、单双精度浮点数的识别技巧以及通过替换改写代码实现无限弹药、无敌效果等实战场景最后讲解基址与动态地址的定位方法。目前已有 522 人学习浏览适合希望系统掌握 CE 搜索与修改流程、对照练习查漏补缺的读者参考。1. CE傻瓜教程从零上手 Cheat Engine 的完整路径很多人第一次听到 Cheat Engine简称 CE以为它是个“游戏作弊器”下载完打开一看满屏十六进制和汇编指令直接劝退。但如果你把它理解成一个内存扫描与调试工具事情就清晰多了它能读取进程内存、按数值搜索地址、监控内存写入、反汇编关键指令这些能力在逆向工程、软件调试、安全研究里都是硬通货。所谓“CE傻瓜教程”核心不是教你一键改数值而是带你走通一条从“找到地址”到“理解数据流”的完整链路。适合谁刚接触逆向的新手、想调试自己程序却不会用调试器的开发者、以及需要分析内存结构但不想一上来就啃汇编的从业者。这一章先把地图画出来后面几章逐步落地。2. 环境准备与第一次内存扫描把“找数字”这件事跑通2.1 安装 CE 与选择目标进程Cheat Engine 官方版本自带一个教程程序Tutorial这是最安全的练手目标不需要拿真实游戏开刀。安装时注意两点一是安装路径不要带中文和空格二是安装过程中会捆绑一些推广组件取消勾选即可。安装完成后打开 CE你会看到左上角有一个闪烁的电脑图标点击它会列出当前所有进程。找到教程程序通常叫Tutorial-i386.exe或Tutorial-x86_64.exe选中并点击“Open”。提示如果进程列表里找不到目标先确认目标程序已经启动并且位数与 CE 版本匹配。32 位 CE 只能附加 32 位进程64 位 CE 可以附加 32 位和 64 位进程。2.2 第一次扫描精确数值搜索教程第一关是“找到当前血量值”。假设界面上显示血量是 100操作步骤如下1. 在 CE 的 Value 输入框里输入 100 2. Scan Type 选择 Exact Value 3. Value Type 选择 4 Bytes 4. 点击 First Scan扫描完成后左侧结果列表会显示所有值为 100 的内存地址。数量可能从几十到几千不等这很正常。接下来回到教程程序点击“Hit me”按钮让血量减少比如变成 95。然后回到 CE在 Value 框输入 95点击“Next Scan”。重复这个过程直到左侧只剩下一两个地址。第一次扫描100 → 结果 N 个 第二次扫描95 → 结果 M 个M N 第三次扫描90 → 结果 1~2 个双击剩下的地址它会出现在下方的地址列表里。双击地址列表中的数值可以修改成任意数字教程程序的血量会同步变化。这一步跑通你就完成了 CE 最核心的闭环搜索 → 过滤 → 修改。2.3 理解“数值类型”与“扫描类型”的匹配逻辑新手最容易翻车的地方是数值类型选错。CE 支持 Byte、2 Bytes、4 Bytes、8 Bytes、Float、Double、String 等类型。选错了扫描结果要么为空要么搜出一堆无关地址。数值类型典型场景占用字节Byte小范围整数0-25514 Bytes大多数整数型血量、金币4Float游戏坐标、进度条4Double高精度浮点数据8String名字、文本变长判断方法如果数值是整数且范围不大优先试 4 Bytes如果数值带小数试 Float如果怎么搜都搜不到勾选“Unknown initial value”做未知初始值扫描再通过“Increased value / Decreased value”逐步过滤。注意扫描类型里的“Exact Value”适合已知具体数值“Unknown initial value”适合不知道数值但知道变化趋势的场景。后者扫描速度慢但对付加密数值很有效。3. 从地址到指针解决“重启后地址失效”的玄学问题3.1 为什么每次重启地址都变用上一章的方法找到血量地址后你会发现一个血泪经验重启程序之前找到的地址失效了。原因是现代操作系统启用了 ASLR地址空间布局随机化每次程序加载到内存的基址都不同动态分配的内存地址自然也跟着变。CE 的地址列表里保存的是绝对地址重启后这个地址可能已经被其他数据占用。解决思路是找到一条从稳定基址到目标地址的固定路径也就是指针链。CE 提供了“Pointer Scan”功能但新手直接上手容易扫出成千上万条结果。更稳妥的做法是先找到“谁在访问这个地址”。3.2 用“Find out what accesses this address”定位代码在地址列表里右键目标地址选择“Find out what accesses this address”。CE 会附加一个调试器监控该地址的读写操作。回到教程程序触发一次血量变化CE 会列出访问该地址的汇编指令。示例输出 mov eax, [ebx 0x10] ; 读取血量这条指令告诉你血量地址 ebx 寄存器的值 0x10。接下来需要找到 ebx 的来源。在调试器里查看寄存器状态或者用“Find out what accesses this address”继续追踪 ebx 的赋值指令。常见做法是向上翻看反汇编窗口找到类似mov ebx, [eax 0x0C]的指令这样就能拼出一条指针链[[eax 0x0C] 0x10]。3.3 手动验证指针链的稳定性拿到候选指针链后不要急着写脚本。先在 CE 里手动添加指针点击“Add Address Manually”勾选“Pointer”填入基址和偏移。基址通常是一个模块名加偏移的形式比如Tutorial-i386.exe000A1B2C。Pointer 配置示例 Base Address: Tutorial-i386.exe000A1B2C Offset 1: 0x0C Offset 2: 0x10添加后地址列表会显示解析后的最终地址和当前值。重启教程程序如果这个指针仍然能正确指向血量说明链路稳定。如果失效说明中间某一级偏移不对需要回到反汇编里重新确认。提示指针链的层级不是越多越好。常见做法是控制在 2-4 级层级太深容易因为中间对象销毁而失效。验证时至少重启目标程序三次确认每次都能正确解析。4. 自动汇编与脚本把重复操作变成一键执行4.1 CE 的 Auto Assembler 能做什么手动改数值只能爽一时真正提升效率的是把操作写成脚本。CE 内置的 Auto Assembler 允许你注入汇编代码、修改指令、创建快捷键。比如教程里的“速度修改”关卡可以通过修改浮点数实现但更优雅的方式是直接改写移动速度的计算指令。一个典型的 Auto Assembler 脚本结构如下[ENABLE] // 代码注入区启用时执行 alloc(newmem, 2048) label(returnhere) label(originalcode) newmem: mov [esi0x10], #100 // 强制血量设为 100 jmp returnhere originalcode: mov eax, [esi0x10] Tutorial-i386.exe12345: jmp newmem nop returnhere: [DISABLE] // 代码恢复区禁用时执行 Tutorial-i386.exe12345: db 8B 46 10 // 恢复原始指令 unregistersymbol(originalcode) dealloc(newmem)4.2 脚本参数与注入点选择alloc用于在目标进程里申请一块内存存放自定义代码大小一般给 1024 或 2048 字节。label定义跳转标签jmp实现流程跳转。注入点选择很关键要选在目标指令的起始位置并且确保跳转后能正确返回。常见错误是注入点选在指令中间导致程序崩溃。判断方法在反汇编窗口里每条指令的地址是连续的选中一条指令时CE 会高亮它的字节长度。注入点必须是某条完整指令的第一个字节。正确注入点 004A1B2C - 8B 46 10 - mov eax,[esi10] ; 从指令开头注入 错误注入点 004A1B2E - 46 10 - inc eax ; 从指令中间注入必崩4.3 用 Lua 脚本做条件判断与自动化Auto Assembler 适合改指令Lua 脚本适合做逻辑控制。CE 内置 Lua 引擎可以写循环、条件判断、读写内存。比如实现“血量低于 30 自动补满”-- Lua 脚本示例自动补血 local healthAddr getAddress(Tutorial-i386.exe000A1B2C) local healthValue readInteger(healthAddr) if healthValue 30 then writeInteger(healthAddr, 100) print(血量已补满) endgetAddress返回模块基址加偏移的绝对地址readInteger和writeInteger分别读写 4 字节整数。这段脚本可以挂在 CE 的定时器里每隔 100 毫秒执行一次。实际使用时要注意频繁读写内存会增加 CPU 占用间隔不要低于 50 毫秒。注意Lua 脚本里的地址最好用模块名加偏移的方式获取不要硬编码绝对地址。硬编码的地址在重启后会失效这是新手最常见的翻车点之一。5. 避坑与排查CE 使用中五个高频翻车现场5.1 扫描结果为零数值类型或扫描范围不对现象输入数值后点击 First Scan结果列表为空。原因数值类型选错比如把 Float 当 4 Bytes 搜或者目标数值是加密存储的。解决先确认数值类型整数试 4 Bytes小数试 Float。如果仍然为零改用“Unknown initial value”扫描再通过数值变化趋势过滤。部分程序会把数值乘以 2 或加固定偏移后存储这时需要先找到显示值与实际值的换算关系。5.2 修改数值后程序崩溃写入了只读内存或错误地址现象双击地址修改数值目标程序直接闪退。原因修改的地址是代码段或只读数据段或者地址虽然显示正确但实际是其他变量的别名。解决在地址列表里右键地址查看“Memory View”里的区域权限。如果显示R-X或R--说明不可写。正确做法是找到访问该地址的指令通过代码注入的方式间接修改而不是直接写内存。5.3 指针扫描结果过多不会过滤无效链路现象Pointer Scan 扫出几万条结果不知道选哪条。原因没有限制扫描深度和偏移范围导致大量噪声。解决扫描时设置 Max Level 为 3-4Max Offset 为 4096 以内。扫描完成后重启目标程序用“Rescan Memory”功能过滤掉失效的指针。重复两到三次剩下的基本就是稳定链路。5.4 脚本启用后游戏卡顿注入代码效率低现象Auto Assembler 脚本启用后目标程序帧率明显下降。原因注入的代码在每帧都被执行且内部有复杂逻辑或内存分配。解决尽量把逻辑放在条件分支里避免每帧都执行。比如只在血量变化时触发写入而不是每帧都写。另外alloc申请的内存不要频繁申请和释放一次申请够用即可。5.5 重启后脚本失效基址或偏移未更新现象昨天写好的脚本今天打开游戏发现无效。原因游戏更新后模块基址或数据结构偏移发生变化。解决脚本里所有地址都用模块名偏移的形式不要硬编码绝对地址。如果游戏更新导致偏移变化需要重新用“Find out what accesses this address”定位新的偏移。这是逆向工作的常态没有一劳永逸的后悔药。6. 进阶技巧用 CE 做内存结构分析与数据验证6.1 用“Dissect data structures”还原对象布局当你找到血量地址后附近的内存往往存放着同一对象的其他属性比如魔法值、攻击力、坐标。CE 的“Dissect data structures”功能可以帮你把这些字段可视化。在地址列表右键目标地址选择“Dissect data structures”CE 会打开一个窗口按 4 字节一组展示内存内容。示例某角色对象内存布局 偏移 0x00: 血量 (4 Bytes) 偏移 0x04: 魔法值 (4 Bytes) 偏移 0x08: 攻击力 (4 Bytes) 偏移 0x0C: 防御力 (4 Bytes) 偏移 0x10: X 坐标 (Float) 偏移 0x14: Y 坐标 (Float)通过观察数值变化可以推断出每个偏移对应的属性。比如在游戏里移动角色看哪个偏移的浮点数在变化就能定位坐标字段。这个方法的精度取决于你对目标程序行为的观察常见做法是结合“Find out what accesses this address”交叉验证。6.2 用“Memory View”查看内存区域与权限Memory View 是 CE 的底层内存浏览器可以查看每个内存区域的起始地址、大小、权限和类型。对于排查“为什么这个地址不能写”非常有用。打开 Memory View 后按 CtrlG 输入地址可以直接跳转。区域权限列会显示R--、RW-、R-X等标记。权限标记含义是否可写R--只读否RW-读写是R-X只读可执行否RWX读写可执行是但少见如果目标地址落在R-X区域说明它在代码段直接写入会触发保护机制。正确做法是找到修改该数据的指令通过代码注入实现间接修改。6.3 用“Code Filter”批量筛选关键指令当“Find out what accesses this address”列出大量指令时可以用 Code Filter 功能过滤。比如只显示mov指令或者只显示写入操作。在反汇编窗口右键选择“Code Filter”输入过滤条件。过滤条件示例 mov [esi10], eax ; 只显示写入血量的指令这样可以快速定位到真正修改血量的代码而不是被读取指令干扰。过滤后再结合断点功能可以精确捕获每次血量变化的调用栈。6.4 数据验证用已知值反推加密算法有些程序会把数值加密后存储比如血量显示 100内存里实际是 200 或 1000。这时可以用 CE 的“Value between”扫描类型或者手动构造几个不同数值观察内存变化规律。显示值 → 内存值 100 → 200 95 → 190 90 → 180从这组数据可以看出内存值 显示值 × 2。找到规律后就可以用 CE 的“Calculate new value”功能在扫描时自动换算。更复杂的加密可能需要写 Lua 脚本做实时转换但核心思路是一样的先观察再建模最后自动化。我自己的习惯是每拿到一个新目标先花十分钟只做观察不急着改数值。观察数值变化规律、观察内存区域权限、观察访问指令的类型这三步做完后面写脚本基本不会翻车。CE 这个工具的上限不在于你背了多少快捷键而在于你愿不愿意把“找地址”这件事当成一次小型逆向分析来做。希望帮到你。本文还有配套的精品资源点击获取