实证时间: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 前后一致 → 只读,不改写 |
.aut 是内挂配置的读取源,加载时机 = 登录进入游戏时(不是打开面板时)。ZZTEST001 后,关掉面板再打开仍显示 11111111111 —— 面板状态来自进程内存,不会回读文件。页基址公式(文件与内存通用):
页基址 = 4(文件头) + 2952 × 槽号 + 0x5C4(1476) × 页号
| 面板元素 | 页内偏移 | 长度 | 格式 | 实测值 |
|---|---|---|---|---|
| 每秒重複對話 输入框 | 0x098 | 2 B | uint16 小端 | 55 → 37 00;999 → E7 03 |
| 13 个勾选框(含「選擇全部」) | 0x09C + i(i=0..12) | 13 B | 每字节 0/1 | 全 01 |
| 13 行对话内容 | 0x0A9 + 78 × i | 13 × 78 B | BIG5 + 00 结尾 | Z01-NXE7HQ … |
00(已逐条校验全零)。999 点「儲存」后,文件 0x098 = E7、0x099 = 03,即 0x03E7 = 999。反向用工具写 888 → 78 03、写 3 → 03 00,回读一致。0x09A / 0x09B 恒 00<br>(单凭这点分不清是 uint16 还是 uint32 的高位恒零,但取值域 3~999 只用到 2 字节,按 uint16 写入文件层回读一致)。
--dry 也照样拦。| 偏移 | 长度 | 含义 |
|---|---|---|
0x000 | 2 | 页标记,01 01 = 该页有效 |
0x006 | 4 | 版本标记,实测 16 43 01 01(0x4316 稳定,前面 +0x5 会在 00/80 抖) |
0x00C / 0x010 | 4 / 4 | float,随游戏状态变(0.81→0.84、0.55→0.35),疑似 HP%/MP% 运行时值 |
0x01C ~ 0x06F | 12 × 8 | 浮点/整数对(步长 8) |
0x074 + i | 35 B | 功能开关,每字节一个(0=关 1=开)。本次实测开着 [24,25,30,31,32,33,34] |
0x4A8 ~ 0x550 | 196 | 第二组设置(0x4BA 处还有一份版本标记) |
0x56C + i×2 | 29 × 2 | 参数表,每项取首字节,99 = 空/未设 |
0x5A6 ~ 0x5C3 | 30 | 尾部保留 |
工具:D:/AI空间/rxjh/tools/rxjh_aut.py,Python 3。
操作顺序必须是:先把游戏完全关掉 → 改文件 → 重开游戏。
游戏在跑时改,下一次面板操作就会冲掉;工具会检测到游戏进程并拦下,--force才放行。
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 出结构化数据
python rxjh_aut.py set orzo --page 0 --item "0=/邀請 TD26871020" --item "1=第二句"
python rxjh_aut.py set orzo --page 0 --count 55 # 合法 3~999
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)
任何 set 加 --dry 只打印差异不写盘;写盘默认自动生成 .bak 备份。
工具: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
槽s 页p = base + 2952s + 0x5C4p,base 上次实测 0x4C1026DC(PID 38424,仅作快速尝试,locate() 会重新找)。kernelbase.CreateFileA 的 hook 导致进程当场消失)。.aut 是它落盘的副本;只在「儲存」这类写盘时机同步。ybopt2_<账号>.cfg 不是内挂配置,是游戏本体的称号设置(180 B UTF-8 XML)。.aut 只有 2 处代码引用路径串(VA 0x010E3918 → 引用点 0x00A81DE6、0x00A88389),前面都是 sprintf(buf, "%s\client\%s.aut", ...) 的压栈;读和写共用同一个路径构造函数。大小 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 版)