热血江湖助手 · 分析资料站← 报告总目录助手主页
分区:13_内挂配置逆向源文件:内挂_對話設定_字段映射_20261018.md篇幅:7.4 KB收录:2026-10-19 17:10

内挂「對話設定」面板 —— 字段映射与读写实证

实证时间:2026-10-18 23:50 ~ 23:57
对象:当前运行角色 orzo(YGOnline.exe),配置档 D:/rxjh2025/client/orzo.aut
结论一句话:.aut 就是内挂配置的存储本体,登录时读取;改文件 → 重开游戏 = 改内挂设置。

一、实验过程与结果

步骤操作结果
1把 0x0A9 起的 13 条对话改成 Z01-NXE7HQ / Z02-DTSMDRJ … Z13-6QKJG5写入成功,回读 13 条逐字节正确
2关闭游戏(正常退出,不点面板),复查文件MD5 858acbaf… 完全没变 → 退出不写盘、不覆盖
3重开游戏(PID 10152,23:55:45 启动),登录 orzo,打开内挂「對話設定」13 行一字不差全部显示,同屏「每秒重複對話」框显示 55
4读取过程是否改写文件文件 MD5 8cfc8bfe0cd11890eddc2cb55550836d 前后一致 → 只读,不改写

由此确定的三件事

  1. .aut 是内挂配置的读取源,加载时机 = 登录进入游戏时(不是打开面板时)。
  1. 正常退出游戏不写回文件,所以「关游戏 → 改文件 → 重开」是干净可靠的操作路径。
  2. 只有面板操作会写文件(点「儲存」或面板内改动触发),写盘方向是单向的「内存 → 文件」。

二、页内字段映射(「對話設定」直接对应的三块)

页基址公式(文件与内存通用):

页基址 = 4(文件头) + 2952 × 槽号 + 0x5C4(1476) × 页号
面板元素页内偏移长度格式实测值
每秒重複對話 输入框0x0982 Buint16 小端55 → 37 00;999 → E7 03
13 个勾选框(含「選擇全部」)0x09C + i(i=0..12)13 B每字节 0/1全 01
13 行对话内容0x0A9 + 78 × i13 × 78 BBIG5 + 00 结尾Z01-NXE7HQ …

反向用工具写 888 → 78 03、写 3 → 03 00,回读一致。0x09A / 0x09B 恒 00<br>(单凭这点分不清是 uint16 还是 uint32 的高位恒零,但取值域 3~999 只用到 2 字节,按 uint16 写入文件层回读一致)。

页内其它字段(同一结构,本次未动)

偏移长度含义
0x0002页标记,01 01 = 该页有效
0x0064版本标记,实测 16 43 01 01(0x4316 稳定,前面 +0x5 会在 00/80 抖)
0x00C / 0x0104 / 4float,随游戏状态变(0.81→0.84、0.55→0.35),疑似 HP%/MP% 运行时值
0x01C ~ 0x06F12 × 8浮点/整数对(步长 8)
0x074 + i35 B功能开关,每字节一个(0=关 1=开)。本次实测开着 [24,25,30,31,32,33,34]
0x4A8 ~ 0x550196第二组设置(0x4BA 处还有一份版本标记)
0x56C + i×229 × 2参数表,每项取首字节,99 = 空/未设
0x5A6 ~ 0x5C330尾部保留

三、怎么改(命令行)

工具:D:/AI空间/rxjh/tools/rxjh_aut.py,Python 3。

操作顺序必须是:先把游戏完全关掉 → 改文件 → 重开游戏。
游戏在跑时改,下一次面板操作就会冲掉;工具会检测到游戏进程并拦下,--force 才放行。

1. 看当前配置

cd D:/AI空间/rxjh/tools
python rxjh_aut.py pages  orzo        # 8 个槽/页概览(重复次数、开关数、对话条数)
python rxjh_aut.py fields orzo        # 页内字段对照表
python rxjh_aut.py dump   orzo --slot 0              # 槽0 两页全量逐项;加 --json 出结构化数据

2. 改 13 条对话内容

python rxjh_aut.py set orzo --page 0 --item "0=/邀請 TD26871020" --item "1=第二句"

3. 改每秒重复次数

python rxjh_aut.py set orzo --page 0 --count 55      # 合法 3~999

4. 勾选 / 取消某一条

python rxjh_aut.py set orzo --page 0 --switch 24=1   # 注意:--switch 是功能开关 0x074,不是对话勾选

对话勾选位目前由写文本自动同步(有内容=1,清空=0);单独置位可走 Python:

import sys; sys.path.insert(0, r'D:/AI空间/rxjh/tools')
import rxjh_aut as A
f = A.AutFile(r'D:/rxjh2025/client/orzo.aut')
pg = f.slot(0).page(0)
pg.buf[pg.base + A.P_FLAGS + 3] = 0      # 取消第 4 条的勾选
f.save(backup=True)

5. 先看改什么再落盘

任何 set 加 --dry 只打印差异不写盘;写盘默认自动生成 .bak 备份。


四、内存级(CE Lua,游戏运行中直接改)

工具:D:/AI空间/rxjh/tools/rxjh_cfg.lua(本次已按新字段更新)

dofile('D:/AI空间/rxjh/tools/rxjh_cfg.lua')
cfg.locate()                 -- 自动 AOB 定位配置基址(重启后地址会变)
cfg.show(0, 0)               -- 打槽0页0:重复次数 / 勾选 / 13 条对话
cfg.set_count(0, 0, 55)      -- 改每秒重复次数(uint16,3~999 已校验)
cfg.snap()                   -- 快照整个结构,用于 diff

五、踩过的坑

  1. 面板里改了不等于文件里改了 —— 面板状态在进程内存,.aut 是它落盘的副本;只在「儲存」这类写盘时机同步。
  2. 关面板再打开不会重读文件 —— 别用这招验证文件改动,必须重启游戏。
  3. ybopt2_<账号>.cfg 不是内挂配置,是游戏本体的称号设置(180 B UTF-8 XML)。
  4. .aut 只有 2 处代码引用路径串(VA 0x010E3918 → 引用点 0x00A81DE6、0x00A88389),前面都是 sprintf(buf, "%s\client\%s.aut", ...) 的压栈;读和写共用同一个路径构造函数。
  5. 写盘时游戏若正在写同一文件,可能读到半截 —— 但实测游戏只在面板操作时写,正常顺序操作没有竞争。

六、当前 orzo 文件状态(2026-10-18 23:57)

大小 11812 B    MD5 8cfc8bfe0cd11890eddc2cb55550836d    mtime 23:54:56
槽0页0   标记 01 01   版本 16 43   每秒重复 55   对话 13 条全勾选
        功能开关 [24,25,30,31,32,33,34]   参数表 29 项全 0
槽0页1 / 槽1~3 全部为空
备份:orzo.aut.bak(用户原始 55 版)、orzo.aut.user_235035(13 条 1/2/3 版)
本页由 Markdown 报告自动转排;如需原始 md,可在原会话工作区取用。