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

资讯详情

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

CE自动汇编实战:从特征码扫描到一键生成CT表全流程

CE自动汇编实战:从特征码扫描到一键生成CT表全流程 1. 为什么我推荐先学自动汇编而不是直接手写CT表做游戏修改的人大概率都听过Cheat EngineCE这个名字。网上流传的版本很多7.4中文版是这两年用得比较顺手的版本界面友好、功能稳定最重要的是自带的自动汇编模块已经相当成熟。很多人一上来就想直接手写CT表脚本结果被复杂的Lua接口和地址偏移劝退。我的建议恰恰相反先用自动汇编把流程跑通再回头研究脚本结构你会发现自己其实已经掌握了CT表的核心逻辑。自动汇编能做什么简单说它能把“修改游戏内存”这件事从“每次手动找地址、改数值”变成“写一段逻辑让CE帮你完成”。比如你想做一个无敌修改自动汇编可以用一条mov [rax1C], 0直接把当前角色的血量写死你想做无限子弹它可以hook游戏自己的弹药扣减函数让扣减指令永远不生效。这些操作在手动模式下要反复扫描、定位、测试而在自动汇编里只需要几行代码。这篇文章的目标读者是那些已经会用CE做最基础的数值扫描、但面对脚本生成一头雾水的朋友。当然如果你已经会写简单的汇编指令那这篇文章能帮你把零散的知识串成一条完整的实操链路。我会从游戏进程附加、特征码定位、自动汇编脚本生成到保存为CT表完整过一遍最后把我在实操中踩过的坑和排查思路一并交代清楚。提示本文所有操作在CE 7.4中文版下完成示例游戏为早期单机版本的红警2尤里的复仇1.0。不同游戏的地址和指令会变但思路完全通用。2. 下载安装与基础设置别跳过这一步2.1 版本选择与安装注意事项CE 7.4中文版是汉化组基于官方版做的本地化版本安装包通常在几十兆左右。这里要特别提醒一句安装时一定要看清楚捆绑选项这类工具被捆绑推广组件是常态直接选择“自定义安装”把多余的勾选全部去掉只保留Cheat Engine主程序。安装路径建议用默认的C:\Program Files\Cheat Engine 7.4因为后面自动汇编和Lua脚本经常要引用安装目录下的文件不要为了省空间把它装到带中文名的目录有些版本的Lua加载器对中文路径支持不好。装完之后第一件事是检查数据库文件。CE的autorun目录里有很多存档脚本7.4中文版一般自带Mono、Lua等基础组件。如果你下载的是精简包建议去官方论坛补一个完整版因为后面做自动汇编时CE的自动汇编器需要调用assembler.dll和lua5.1.dll缺了这两个文件脚本根本编译不过去。2.2 附加进程前的三项关键配置打开CE主界面后先不要急着附加进程有三个设置项建议提前调好否则后续操作会频繁遇到“地址无效”或者“脚本编译失败”的干扰。第一编辑器模式。点击“选项”-“设置”在“调试选项”里勾选“使用VEH调试器”和“读取/写入时断点”。CE 7.4默认调试器的兼容性一般在Win10和Win11上经常出现附加后游戏崩溃的问题VEH模式能显著降低这种概率。第二符号加载。在“选项”-“设置”-“符号”里把“自动加载数据库文件”和“自动加载符号信息”都打开。这样进程附加成功后CE会自动解析游戏的导出符号对后续定位函数入口非常有帮助。第三键盘快捷键。在“热键”选项卡里把“暂停游戏进程”、“切换新启发式扫描”等常用操作设置成快捷键。尤其是“暂停”功能做自动汇编调试时经常需要冻结游戏用快捷键比鼠标点菜单快得多。注意设置里有一项“分配大地址空间”默认是关闭的。如果目标游戏启用了LAALarge Address Aware比如红警2的game.exe是2GB内存制CE可能会提示“目标进程已启用大地址空间建议同步开启”。这时候建议在CE设置里也开启同一选项避免后续hook时基址判断出错。3. 核心原理先行自动汇编、CT表、地址偏移三者关系3.1 自动汇编在CE里的真实身份很多教程把自动汇编说得神乎其神拆开看其实不复杂。CE的自动汇编模块本质是一个“可编译的汇编脚本解释器”。你写的是x86汇编指令CE会调用自己内置的汇编器把它们编译成机器码然后通过调试器接口注入到目标进程里。自动汇编脚本以[ENABLE]开头以[DISABLE]结尾。被[ENABLE]包裹的代码负责“启用修改”在注入时执行一次被[DISABLE]包裹的代码负责“恢复原样”。中间还可以用aobscan指令做特征码定位用registersymbol注册符号名用label声明标签。这些语法看着简单但组合起来就能实现“自动找地址、自动注入、自动还原”的完整流程。3.2 CT表的结构不是只能存地址的壳子CT表Cheat Table是CE的存档文件后缀是.CT本质是XML格式。里面可以保存地址列表、值类型、描述文本还能嵌入Lua脚本和自动汇编脚本。换句话说CT表不只是“记录一组地址”的静态文件它其实是一个带逻辑的修改器脚本包。自动汇编生成CT表就是把上面说的[ENABLE]/[DISABLE]脚本整体打包进CT表的“脚本”字段。这样下次打开CT表点一下“启用”勾选框CE就会重新执行注入逻辑不需要你手动去扫描地址。理解了这层关系就能明白为什么用CE做修改器核心不是“找地址”而是“写脚本”。3.3 特征码扫描摆脱硬编码地址的关键做游戏修改最怕的是地址变化。今天找到的地址重启游戏可能就变了。自动汇编给出的解决方案是特征码扫描AOB Scan。特征码不是固定地址而是一段固定的二进制序列。游戏程序在内存中的映像虽然是随机基址的但关键函数内部的指令字节序列是稳定的尤其是那些靠近“立即数比较”或“函数调用”位置的字节。自动汇编的aobscan指令就是让你一段段搜找到匹配位置后CE会把该位置偏移后的地址自动设置成标签脚本里通过标签引用无需关心具体基址。举个例子在红警2里找“钱数扣减”的指令可以搜索89 86 40 05 00 00这类字节序列一旦命中就能通过偏移算到扣钱的那条mov指令位置。重启游戏后基址会变但这段字节序列不会变所以脚本依然有效。4. 实战启动用红警2演示“自动汇编生成CT表”完整流程4.1 附加进程与基址确认这里我用红警2的game.exe进程演示。打开CE点击左上角的“选择进程”按钮小电脑图标在进程列表里找到game.exe选中后点击“打开”。进程附加成功后CE底部状态栏会显示进程名和PID。这里有一个非常关键的确认动作打开“内存查看”窗口快捷键CtrlM主界面底部的“可执行模块”列表里应该能看到game.exe后面的基址。不同版本的红警2基址不一样但有经验的修改者都会在这一步确认模块是否存在如果显示“无法读取模块列表”说明附加权限不足需要以管理员身份重新运行CE。实操心得很多新手在这一步容易翻车附加进程后直接开始扫描结果发现“数值类型不对”或“地址不存在”。原因多半是选错进程——CE默认会显示所有进程有些游戏有双进程启动器launcher和主程序必须选真正包含游戏逻辑的那个。红警2的启动器是gamemd.exe尤里的复仇或game.exe原版选错的话一切白搭。判断标准很简单附加后看CE左下角是否能列出模块能看到模块说明选对了。4.2 找到关键地址并分析访问指令红警2的“金钱”功能是典型测试目标因为它的数值变更频繁非常适合用来做指令扫描练习。步骤是第一步切换到游戏界面记下当前金钱数比如5000。在CE的“值”输入框里填5000点“首次扫描”。第二步回到游戏造一个单位让金钱减少比如变成4800。回CE填4800点“再次扫描”。第三步重复两三次直到地址列表里只剩一个或少量候选地址。拿到候选地址后不急着改数值先记录地址值然后右键选择“找出是什么改写了这个地址”快捷键F6。CE会提示你需要一个调试器确认后它会附加调试器并等待对该地址的写入操作。第四步回到游戏再造一个单位。此时CE会立刻断下并显示一条反汇编指令比如mov [eax1C], edx这句指令的含义是把edx里的值写入到eax寄存器指向的对象偏移1C处。也就是说金钱数值是存放在某个对象结构里的每次扣钱时游戏会重新计算新值并写入这个偏移位置。看到这条指令后点击“更多信息”里的“复制指令”按钮它会自动把指令的完整地址和字节序列复制出来。这里复制到的特征码就是后续自动汇编脚本的核心。提示有时候扫出来的指令不止一条因为游戏可能同时从多个地方修改这个地址比如作弊器、AI脚本、UI显示。不要慌优先选命中次数最多、且指令语义明确的一般是那条mov [regoffset], reg或sub [regoffset], reg。选中后右键“反汇编”确认指令上下文是修改指令而非比较指令再继续。4.3 用自动汇编模板自动生成代码拿到指令地址后CE提供了一个偷懒神器——自动汇编面板。点击CE主界面的“自动汇编”按钮或菜单里“工具”-“自动汇编”在弹出的编辑框里先手动输入[ENABLE]然后点菜单栏的“模板”-“AOB注入”-“AE自动汇编注入”。CE会弹出一个窗口要求你填写“指令字节数”默认是10这个数值表示从当前指令位置往下要覆盖的长度。重点来了填入的字节数必须大于你实际要改写指令的长度。比如当前指令是mov [eax1C], edx机器码是89 50 1C占3个字节那至少要填4否则CE会提示“指令长度不足”。这里有个技巧如果你不确定指令长度可以先点窗口里的“反汇编”按钮让CE自己解析出完整指令字节然后填入长度1即可。填完后点“确定”CE会自动生成框架代码里面已经包含aobscan定位、label声明、注入点和原始字节保存。生成后的脚本长这样[ENABLE] aobscanmodule(INJECT_1,game.exe,89 50 1C 8B 45 F8) alloc(newmem,2048,INJECT_1) label(returnhere) label(originalcode) label(exit) newmem: // 这里填你要修改的逻辑 originalcode: mov [eax1C], edx jmp returnhere INJECT_1: jmp newmem nop nop nop returnhere: /[ENABLE]aobscanmodule后面的三个参数分别是符号名、模块名、特征码字节序列。alloc指令为注入代码分配内存空间。newmem是我们自定义逻辑的执行位置originalcode里的内容是原始指令的备份returnhere是跳回位置。4.4 编写修改逻辑3个实战案例框架生成后核心工作就是往newmem里填逻辑。这里分享三个我在实操中常用的修改思路覆盖了最简单到中等难度的场景。场景一金钱锁死。如果你希望金钱固定不变只需要在原始指令执行前跳转不执行原始指令直接跳到returnhere。改法如下newmem: jmp returnhere originalcode: mov [eax1C], edx jmp returnhere这样游戏每次执行到扣钱指令时直接跳过数值永远不会变。注意这里不是修改写入值而是让写入指令不执行等同“锁钱”。场景二扣钱变加钱。你想让游戏扣钱变成加钱那就要在原始指令前把数值取反。先执行neg edx再执行原始写入。脚本如下newmem: neg edx originalcode: mov [eax1C], edx jmp returnhere场景三金钱数量倍增。如果说扣钱指令传入的edx是本次扣减量想让它变成“只扣一半”可以写newmem: sar edx, 1 // 算术右移一位相当于除以2 jns skip // 如果结果非负跳过修正 add edx, 1 // 负数除2时向上取整避免留1块钱尾巴 skip: originalcode: mov [eax1C], edx jmp returnhere最后把脚本复制的[DISABLE]段保留原样它会自动还原被改写的指令。到这里自动汇编脚本已经完整。4.5 一键生成CT表并验证脚本写好后点击自动汇编窗口左上角的“文件”-“分配到当前CT表”或者直接CtrlA再点击“执行”按钮。如果一切正常CE会把这个脚本注册成一个“脚本项”出现在主界面的地址列表里。此时回到游戏你会发现金钱已经锁住或按新逻辑变化。验证通过后点击CE菜单“文件”-“保存为”-“Cheat Table”输入文件名保存为.CT文件。下次打开CE直接加载这个CT表勾选前面的方框就能启用修改不用再走一遍扫描流程。实操心得保存CT表时建议把脚本项名称改成容易识别的比如“金钱锁死v1”。CE默认的名字是“脚本”以后表多了根本分不清哪个是哪个。另外CT表文件里除了脚本还可以附带描述文本双击脚本项在“描述”栏里写上“适用版本尤里的复仇1.0”方便分享给朋友时避免版本不匹配。5. 常见错误与排查技巧实录这块建议直接收藏5.1 错误一aobscan全部结果为零这是最让人崩溃的错误。脚本执行后CE提示“aobscan未找到任何匹配”一行红字脚本无法启用。排查思路有三层。第一层确认特征码是否正确。很多人是从“复制指令”里直接拷贝的字节序列但CE复制出来的字节序列末尾可能带有“00”是汇编指令的填充字节不是实际代码。检查特征码时右键“复制”选“复制特征码AA/字节”得到的是干净字节。第二层确认模块名对不对。aobscanmodule后面的模块名必须和CE“内存查看”窗口里显示的模块名完全一致大小写都不能错。红警2的进程模块是game.exe有些汉化版是gamemd.exe你写错了当然搜不到。第三层确认游戏版本。红警2有两个常用版本——原版和尤里的复仇两者的金钱指令特征码完全不同。如果你分享CT表给朋友他用的版本和你不一样aobscan必然失败。所以脚本里要写清适用版本或者多写几个aobscan做fallback。最稳妥的办法是先用CE自身的“内存扫描”功能手动搜索特征码。打开内存查看器按CtrlB调出“搜索字节序列”窗口粘贴特征码如果手动搜索也搜不到那就说明特征码有问题需要回4.2重新提取如果手动能搜到但自动汇编搜不到说明模块名或脚本执行时机不对。5.2 错误二无法读取进程内存 / 注入失败这类报错大多是权限问题。CE没有以管理员权限运行时附加到游戏进程后可能无法读取部分内存区域自动汇编注入时会直接报错。解决办法右键CE图标选择“以管理员身份运行”。注意有些游戏本身也以管理员权限运行如果CE和游戏权限不一致CE能附加进程但无法注入。这一点在Win10/11上尤其常见。还有一种情况游戏启用了反调试或完整性校验。目前主流的单机游戏很少做这种防护但红警2的联网模式TUNER可能有反作弊检测。做修改测试时建议用单机模式或者关闭对战平台否则CE附加进程后游戏可能直接退出。5.3 错误三启用脚本后游戏崩溃、黑屏或卡死这是自动汇编注入最常见的副作用通常有三个原因。原因一注入代码长度不足。前文提到的alloc分配的长度不够导致注入代码覆盖了后面的关键指令。解决方法是把alloc(newmem,2048,INJECT_1)里的2048改大比如改成4096给注入代码留足空间。原因二跳转位置写错。看看returnhere是不是在原始指令的最后确认跳回来之前没有跳错位置。有个技巧在jmp returnhere前加一条nop长度凑够减小跳转错位概率。原因三修改逻辑有bug。比如在newmem里用了没有初始化值的寄存器或者对edx做了非法操作。调试这种问题建议先把原始逻辑原样放进去确认行为正常了再逐步加修改逻辑——这是排查汇编bug的唯一稳妥方法。5.4 错误四CT表加载后脚本项显示红叉CT表加载后脚本项前面有个红叉说明自动汇编脚本执行失败。最常见的原因有两个。第一个是脚本里引用的AOB特征码在当前游戏版本找不到也就是5.1说的版本不匹配。解决思路是直接在CE主界面的地址列表里双击“脚本”项重新打开自动汇编窗口点击“执行”按钮CE会再次运行aobscan弹出具体报错行号。第二个原因是脚本名和已注册符号冲突。你脚本里用了registersymbol(test)而CT表里另一个脚本已经注册了同名符号。解决方法是给符号名加前缀比如registersymbol(my_test_1)避免命名冲突。5.5 错误五自动汇编窗口的“分配到当前CT表”是灰色不可点这个情况较少见但一旦遇到很让人暴躁。原因是CT表当前处于“停用”或“待保存”状态此时需要先点击脚本编辑框外的任意位置让CE认为你有修改操作然后再点“分配到当前CT表”。还有一种情况你打开了多个CE窗口CT表绑定在另一个窗口。这时只需要把当前自动汇编脚本的“分配到”目标切换成目标CT表即可。CE 7.4中文版在“文件”菜单下有一个“分配到CT表”子菜单可以选择具体目标。6. 实用技巧补充脚本调试心得与CT表管理经验自动汇编脚本调试说到底是一个“最小化修改、逐层验证”的过程。我个人的习惯是每次有一个新思路先复制一份原脚本在副本上验证。验证通过再合并回主脚本避免把原来的稳定版搞坏。另外CT表的管理很有学问。如果脚本多了建议用“分组”功能。在地址列表里右键选择“新建组目录”把不同功能的脚本分别放进去。比如“金钱相关”、“单位属性”、“建造加速”这样分享给别人的时候一目了然。CT表里还可以嵌入自定义Lua脚本实现“启动时自动执行某段代码”或“热键切换修改开关”。比如写一个简单的Lua键盘事件按F1开启无敌、按F2关闭这个能大幅提升使用体验。Lua脚本的入口在CE菜单“控制”-“执行Lua脚本”后续熟练了可以深入研究。还有一个小细节CT表版本兼容问题。CE 7.4生成的CT表在CE 6.8及以下版本打开时可能提示“未知脚本类型”无法正常加载。所以如果你要在老设备上用建议在CE 6.8里重新保存一份或者把自动汇编脚本直接复制出来贴到旧版CE的自动汇编窗口里。7. 写在最后几个值得长期使用的习惯自动汇编和CT表本质上是一套“思路 工具”的组合。工具只是把思路落地的载体。我这个项目做下来最大的感触是别怕汇编指令它没有想象中那么难把mov、jmp、call、push、pop这几个核心指令吃透就能覆盖九成以上的修改场景。我个人习惯在电脑里维护一个“特征码笔记”每找到一个游戏的关键特征码就记下来附带游戏版本、CE版本、日期。时间长了这个笔记能帮你省下大量重复调试时间。另外分享CT表时建议附上“适用版本”和“使用说明”这能减少很多“我的怎么不生效”的提问。最后再分享一个实战小技巧自动汇编脚本里aobscan的特征码不一定非得是当前指令的完整字节你可以取当前指令前2到3条指令的字节组合这样定位到的位置会更稳定因为函数入口前的字节变更频率远低于函数内部的指令。但对于刚上手的场景先用完整指令的特征码跑通后续再优化也不迟。希望这篇文章能帮你跨过CE自动汇编的门槛不再被“脚本难写”“CT表不会生成”这类问题卡住。操作一遍之后你会发现所谓CT表生成不过就是把你的修改逻辑用CE的语言讲清楚而已。
返回列表