冒险岛079

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1|回复: 0

Day 11 -- 自动汇编:用脚本批量改造游戏世界

[复制链接]

701

主题

13

回帖

2235

积分

管理员

积分
2235
发表于 4 小时前 | 显示全部楼层 |阅读模式
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 完整语法

    内存管理
    1. alloc(名称, 大小)              // 分配内存
    2. alloc(名称, 大小, "模块名")     // 在指定模块附近分配(确保地址在跳转范围内)
    3. dealloc(名称)                  // 释放内存
    复制代码

    标签和符号
    1. label(名称)                    // 声明标签(用于跳转目标)
    2. registersymbol(名称)           // 注册符号到 CE 符号表(其他脚本可引用)
    3. unregistersymbol(名称)         // 取消注册符号
    复制代码
    1. registersymbol
    复制代码
    的强大之处在于:你在脚本中分配了一块内存存储某个值,注册成符号后,可以在 CE 的地址列表中直接引用这个符号名,或者在其他脚本中使用。

    数据定义
    1. db 90 90 90              // 定义字节数据
    2. dw 1234                  // 定义 2 字节数据(word)
    3. dd 12345678              // 定义 4 字节数据(dword)
    4. dq 0                     // 定义 8 字节数据(qword)
    5. dd (float)3.14           // 定义浮点数
    6. dq (double)3.14159       // 定义双精度浮点数
    复制代码

    AOB 注入(特征码注入)
    1. aobscan(标签, 89 43 ?? 8B 53)   // 搜索特征码
    2. aobscanmodule(标签, 模块名, 89 43 ?? 8B 53)  // 在指定模块中搜索
    复制代码
    1. ??
    复制代码
    是通配符,匹配任意字节。

    ━━━━━━━━━━━━━━━━━━━━

    AOB 扫描:告别硬编码地址

    之前我们的注入点都是写死的地址,比如
    1. "Tutorial-x86_64.exe"+2A123
    复制代码
    。但游戏更新后,这个偏移量很可能会变。

    AOB(Array of Bytes,字节数组)扫描是更稳定的定位方式。它搜索的不是地址,而是代码的机器码特征

    比如扣血指令
    1. sub [rbx+000000EC], eax
    复制代码
    对应的机器码是:
    1. 29 83 EC 00 00 00
    复制代码

    即使游戏更新导致地址变了,只要这条指令的机器码没变,AOB 扫描就能找到它。

    AOB 脚本示例
    1. [ENABLE]
    2. aobscanmodule(INJECT, Tutorial-x86_64.exe, 29 83 EC 00 00 00)
    3. alloc(newmem, $1000, INJECT)
    4. label(code)
    5. label(return)
    6. newmem:
    7.   add [rbx+000000EC], 2    // 自定义逻辑
    8.   jmp return
    9. INJECT:
    10.   jmp newmem
    11.   nop
    12. return:
    13. registersymbol(INJECT)
    14. [DISABLE]
    15. INJECT:
    16.   db 29 83 EC 00 00 00     // 恢复原始字节
    17. unregistersymbol(INJECT)
    18. dealloc(newmem)
    复制代码

    注意
    1. [DISABLE]
    复制代码
    部分用
    1. db
    复制代码
    恢复原始字节,这样禁用脚本时代码完全还原。

    制作 AOB 特征码

  • 在反汇编视图中找到目标指令
  • 记下该指令及其前后几条指令的机器码
  • 把可能因地址变化而改变的字节替换为
    1. ??
    复制代码
    (通配符)
  • 测试特征码是否唯一(在模块中搜索应该只有 1 个结果)

    好的特征码应该:
  • 足够长(至少 10 字节)以确保唯一性
  • 包含足够的固定字节
  • 通配符不要太多

    ━━━━━━━━━━━━━━━━━━━━

    编写多功能 Cheat Table

    一个完善的 Cheat Table(CT 文件)通常包含多个脚本,组织在树形结构中:
    1. [+] 无敌模式
    2.     - 不掉血
    3.     - 不掉蓝
    4.     - 不掉耐久
    5. [+] 资源修改
    6.     - 金币锁定
    7.     - 经验倍率
    8. [+] 属性修改
    9.     - 攻击力
    10.     - 防御力
    11.     - 移动速度
    复制代码

    创建脚本条目

    在 CE 地址列表的空白处:

  • 右键 → "Add new item" 或按 Ctrl+Alt+A
  • 选择 "Auto Assembler Script"
  • 编写你的 ENABLE / DISABLE 脚本

    每个脚本条目左边有一个复选框,勾选启用,取消禁用。

    使用 Header 组织结构

    右键 → Add new item → Header,可以创建分组标题。然后把脚本拖拽到 Header 下面进行分组。

    保存 Cheat Table

    菜单 File → Save As,保存为
    1. .CT
    复制代码
    文件。

    CT 文件可以分享给其他人使用——他们只需要用 CE 打开这个文件,然后附加到对应的游戏进程就行。

    ━━━━━━━━━━━━━━━━━━━━

    实用脚本模式

    模式一:数值倍率
    1. newmem:
    2.   push rax
    3.   mov eax, [rbx+18]      // 读取当前伤害
    4.   shl eax, 1              // 左移1位 = 乘以2
    5.   mov [rbx+18], eax       // 写回
    6.   pop rax
    7.   jmp return
    复制代码

    模式二:条件开关

    配合
    1. registersymbol
    复制代码
    做开关:
    1. alloc(godmode, 4)
    2. registersymbol(godmode)
    3. godmode:
    4.   dd 1                    // 1=开启, 0=关闭
    5. newmem:
    6.   push rax
    7.   mov eax, [godmode]
    8.   cmp eax, 1
    9.   pop rax
    10.   jne originalcode        // 如果关闭,走原始代码
    11.   jmp exit                // 如果开启,跳过扣血
    12. originalcode:
    13.   sub [rbx+18], ecx
    14. exit:
    15.   jmp return
    复制代码

    然后在 CE 地址列表中添加
    1. godmode
    复制代码
    符号的地址,就可以通过改值来控制开关。

    模式三:热键绑定

    在 CT 文件中,你可以为每个脚本条目设置热键(右键 → Set Hotkeys)。比如按 F1 启用无敌,按 F2 禁用。

    ━━━━━━━━━━━━━━━━━━━━

    脚本调试技巧

    检查 AOB 是否唯一

    在 Auto Assembler 中,点 File → Assign to current cheat table,CE 会尝试执行脚本。如果 AOB 找不到或找到多个,会报错。

    用 int 3 设断点

    在你的代码中插入
    1. 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 的编程灵活性结合起来,做一些更复杂的修改。

    同时也会做一个完整的系列回顾——从入门走到今天,你已经掌握了多少技能。

    准备好出院了吗?
  • 您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    果子博客
    扫码关注微信公众号

    Archiver|手机版|小黑屋|风叶林

    GMT+8, 2026-3-29 20:43 , Processed in 0.235125 second(s), 19 queries .

    Powered by 风叶林

    © 2001-2026 Discuz! Team.

    快速回复 返回顶部 返回列表