|
|
Day 11 -- 自动汇编:用脚本批量改造游戏世界
Cheat Engine 从入门到住院 · Day 11
Day 7 我们用 Auto Assembler 做了一次简单的代码注入——把扣血改成加血。但那只是 Auto Assembler 的冰山一角。
Auto Assembler(以下简称 AA)是 CE 内置的脚本引擎,它不仅能注入汇编代码,还能定义符号、管理内存、注册快捷键,甚至调用 Lua 函数。
今天我们从"写一条指令"升级到"写一个完整的修改脚本"。
━━━━━━━━━━━━━━━━━━━━
本文你将学到
Auto Assembler 的完整语法
编写多功能修改脚本
Cheat Table 的组织和管理
AOB(特征码)扫描的使用
脚本的调试技巧
阅读时间:15 分钟 | 实操时间:30 分钟 | 难度:进阶
━━━━━━━━━━━━━━━━━━━━
Auto Assembler 完整语法
内存管理
- alloc(名称, 大小) // 分配内存
- alloc(名称, 大小, "模块名") // 在指定模块附近分配(确保地址在跳转范围内)
- dealloc(名称) // 释放内存
复制代码
标签和符号
- label(名称) // 声明标签(用于跳转目标)
- registersymbol(名称) // 注册符号到 CE 符号表(其他脚本可引用)
- unregistersymbol(名称) // 取消注册符号
复制代码 的强大之处在于:你在脚本中分配了一块内存存储某个值,注册成符号后,可以在 CE 的地址列表中直接引用这个符号名,或者在其他脚本中使用。
数据定义
- db 90 90 90 // 定义字节数据
- dw 1234 // 定义 2 字节数据(word)
- dd 12345678 // 定义 4 字节数据(dword)
- dq 0 // 定义 8 字节数据(qword)
- dd (float)3.14 // 定义浮点数
- dq (double)3.14159 // 定义双精度浮点数
复制代码
AOB 注入(特征码注入)
- aobscan(标签, 89 43 ?? 8B 53) // 搜索特征码
- aobscanmodule(标签, 模块名, 89 43 ?? 8B 53) // 在指定模块中搜索
复制代码 是通配符,匹配任意字节。
━━━━━━━━━━━━━━━━━━━━
AOB 扫描:告别硬编码地址
之前我们的注入点都是写死的地址,比如- "Tutorial-x86_64.exe"+2A123
复制代码 。但游戏更新后,这个偏移量很可能会变。
AOB(Array of Bytes,字节数组)扫描是更稳定的定位方式。它搜索的不是地址,而是代码的机器码特征。
比如扣血指令对应的机器码是:
即使游戏更新导致地址变了,只要这条指令的机器码没变,AOB 扫描就能找到它。
AOB 脚本示例
- [ENABLE]
- aobscanmodule(INJECT, Tutorial-x86_64.exe, 29 83 EC 00 00 00)
- alloc(newmem, $1000, INJECT)
- label(code)
- label(return)
- newmem:
- add [rbx+000000EC], 2 // 自定义逻辑
- jmp return
- INJECT:
- jmp newmem
- nop
- return:
- registersymbol(INJECT)
- [DISABLE]
- INJECT:
- db 29 83 EC 00 00 00 // 恢复原始字节
- unregistersymbol(INJECT)
- dealloc(newmem)
复制代码
注意部分用恢复原始字节,这样禁用脚本时代码完全还原。
制作 AOB 特征码
在反汇编视图中找到目标指令
记下该指令及其前后几条指令的机器码
把可能因地址变化而改变的字节替换为(通配符)
测试特征码是否唯一(在模块中搜索应该只有 1 个结果)
好的特征码应该:
足够长(至少 10 字节)以确保唯一性
包含足够的固定字节
通配符不要太多
━━━━━━━━━━━━━━━━━━━━
编写多功能 Cheat Table
一个完善的 Cheat Table(CT 文件)通常包含多个脚本,组织在树形结构中:
- [+] 无敌模式
- - 不掉血
- - 不掉蓝
- - 不掉耐久
- [+] 资源修改
- - 金币锁定
- - 经验倍率
- [+] 属性修改
- - 攻击力
- - 防御力
- - 移动速度
复制代码
创建脚本条目
在 CE 地址列表的空白处:
右键 → "Add new item" 或按 Ctrl+Alt+A
选择 "Auto Assembler Script"
编写你的 ENABLE / DISABLE 脚本
每个脚本条目左边有一个复选框,勾选启用,取消禁用。
使用 Header 组织结构
右键 → Add new item → Header,可以创建分组标题。然后把脚本拖拽到 Header 下面进行分组。
保存 Cheat Table
菜单 File → Save As,保存为文件。
CT 文件可以分享给其他人使用——他们只需要用 CE 打开这个文件,然后附加到对应的游戏进程就行。
━━━━━━━━━━━━━━━━━━━━
实用脚本模式
模式一:数值倍率
- newmem:
- push rax
- mov eax, [rbx+18] // 读取当前伤害
- shl eax, 1 // 左移1位 = 乘以2
- mov [rbx+18], eax // 写回
- pop rax
- jmp return
复制代码
模式二:条件开关
配合做开关:
- alloc(godmode, 4)
- registersymbol(godmode)
- godmode:
- dd 1 // 1=开启, 0=关闭
- newmem:
- push rax
- mov eax, [godmode]
- cmp eax, 1
- pop rax
- jne originalcode // 如果关闭,走原始代码
- jmp exit // 如果开启,跳过扣血
- originalcode:
- sub [rbx+18], ecx
- exit:
- jmp return
复制代码
然后在 CE 地址列表中添加符号的地址,就可以通过改值来控制开关。
模式三:热键绑定
在 CT 文件中,你可以为每个脚本条目设置热键(右键 → Set Hotkeys)。比如按 F1 启用无敌,按 F2 禁用。
━━━━━━━━━━━━━━━━━━━━
脚本调试技巧
检查 AOB 是否唯一
在 Auto Assembler 中,点 File → Assign to current cheat table,CE 会尝试执行脚本。如果 AOB 找不到或找到多个,会报错。
用 int 3 设断点
在你的代码中插入(软件断点),执行到这里时 CE 的调试器会暂停,你可以检查寄存器状态。调试完记得删掉。
检查寄存器
在反汇编视图中,对指令右键 → Set Breakpoint,执行到断点时可以看到所有寄存器的值。这对确认你的条件判断是否正确非常有用。
常见错误
Access Violation:通常是地址计算错误,或者读写了不该读写的内存
脚本执行后游戏立即崩溃:可能是 JMP 的目标地址算错了,或者没有正确保存/恢复寄存器
AOB not found:特征码不对,或者游戏版本更新导致代码变了
━━━━━━━━━━━━━━━━━━━━
常见问题
Q:AA 脚本和直接在反汇编视图中改指令有什么区别?
A:直接改指令是临时的,关掉 CE 就没了,而且没有 DISABLE 机制,不方便还原。AA 脚本可以保存到 CT 文件,有 ENABLE/DISABLE 开关,可以随时启用和禁用,也可以分享给别人。
Q:AOB 特征码会不会在游戏更新后失效?
A:会的,如果代码被修改了。但比硬编码地址稳定得多——地址几乎每次更新都变,而代码通常只在功能改动时才变。
Q:我可以在一个脚本中同时修改多个注入点吗?
A:可以。一个脚本可以包含多个 AOB 扫描和多个注入点。但建议按功能拆分成独立脚本,方便单独开关。
━━━━━━━━━━━━━━━━━━━━
小结
今天我们深入学习了 Auto Assembler:
完整的 AA 语法:内存管理、符号注册、数据定义
AOB 特征码扫描:比硬编码地址更稳定的定位方式
Cheat Table 的组织和管理:脚本分组、热键、保存分享
实用脚本模式:数值倍率、条件开关、热键绑定
调试技巧:断点、寄存器检查、常见错误排查
你已经具备了制作一个完整"修改器"的能力。
明天 Day 12 是系列的最后一天。我们将学习 CE 的 Lua 脚本引擎,把 AA 的汇编能力和 Lua 的编程灵活性结合起来,做一些更复杂的修改。
同时也会做一个完整的系列回顾——从入门走到今天,你已经掌握了多少技能。
准备好出院了吗? |
|