① 控件对象内存结构(头区 0x00~0x4F)
| 偏移 | 类型 | 含义 | 实测值 / 备注 |
| +0x00 | dword | vtable 指针(区分控件族) | 0x010B0E7C 常规控件 · 0x010BA280 编辑框 · 0x010B9E34 系统对象 |
| +0x04 | dword | 父窗口对象指针 | 主窗口 0x233611C0、页签栏 0x4E69C238(每次启动会变) |
| +0x08 | dword | 未知(恒见 0x22) | 疑为窗口类标记 |
| +0x0C | dword | 创建序号(连续递增) | 0x109A 起;同一控件在数组中的稳定键 |
| +0x10 | dword | 类型码 | 0x13=常规控件 · 0x0E=编辑框 · 0x0D/0x11=少见 |
| +0x14 | dword | 常量 -1 | 0xFFFFFFFF,不是"不可用"标志(曾误判,已纠正) |
| +0x28 | dword | X 坐标(相对父窗口) | 复选框三列网格 X 步进 45px |
| +0x2C | dword | Y 坐标 | 复选框行距 20~50px |
| +0x30 | dword | 宽 W | 13=复选框 · 24=按钮 · 18=设定按钮 · 46=大按钮 · 8/16=滚动条/编辑框 |
| +0x34 | dword | 高 H | 同上配对(13x13 / 24x25 / 18x34 / 46x44) |
| +0x40 | dword | 页面激活/组内可见标志 | 1=当前页可见;切页时整组翻转(序号2成员 0→1、序号5成员 1→0 实测 31 个对象) |
| +0x44 | dword | 恒 0 | — |
| +0x48 | dword | 组内序号(=所属页签页号) | 0~5;页签栏自身编号 1~6 也带 2/5 双份 |
| +0x4C | dword | 组 ID | 助手主窗口复选框共用 0x109E;其它窗口 0x11A4/0x12DE/0x1320… |
② 状态位 — 本次逆向核心成果
| 偏移 | 含义 | 验证证据 |
| +0x360 |
复选框勾选状态:0=未勾,1=已勾。 对"设定…"按钮=已配置状态;对大按钮=已设定状态。 不随页面切换变化,与 +0x40 完全独立。 |
四魂复选框 88/89/90/155 勾选后 0→1;切页 diff 中 8 个状态位纹丝不动 |
| +0x40 |
当前页激活标志:控件所属页被打开=1,否则 0。 组内序号(+0x48)=页号。 |
14:15 diff:31 对象按"序号2全 0→1、序号5全 1→0"规律翻转 |
当前勾选快照(14:15):+0x360=1 共 8 个 —— 88 戀人之魂、89 刺客之魂、90 商人之魂、155 東嶺之魂(四个 13×13 复选框)+ 91 撿取道具種類、113 赤蛇鬥關、156 解除異常武功(18×34 设定钮)+ 118 環龍之魂(46×44)。57 自動撿取=0。
程序化勾选方案(待实测):内存_写整数型(句柄, 控件对象+十六到十("360"), 1),建议拿槽92(编号57 自動撿取)做写入实验;写入只改状态位,是否触发助手内部逻辑/写回 .aut 需验证,必要时配合 vt[1] CALL 路径。
③ 扩展区结构(0x320~0x3CF)— 常规控件
| 偏移 | 含义 | 实测值 / 备注 |
| +0x320 / +0x324 | float = 1.0 ×2 | 0x3F800000,缩放系数 |
| +0x328 | 类型相关小值 | 复选框 0x9D、多行编辑框 0x70、滚动条 0x9D、小编辑框 0x08 |
| +0x32C / +0x32B | 布局计数 | 如 0x25/0x26(页签内行号类) |
| +0x334 | 计数 A | 常见 9~10 |
| +0x338 | 计数 B | 0x3C/0x4D 等(编辑框行高类);速度框=0x64(100,最大值?) |
| +0x33D~+0x33F | 颜色/渐变常量 | BE000000 / BEFFFFFF / DCFFFFFF |
| +0x345 | 第二父指针 | 编辑框族指向页签栏 0x4E69C238 |
| +0x346 / +0x347 | 成对值(同值×2) | 疑为资源句柄/缓存对 |
| +0x350 / +0x358 | 可互换指针对 | 0x00642A3C(静态地址)与 0 的位置互换 = 选中态表现之一 |
| +0x364 | 功能号 | 与 .aut/.scs 存档功能号一致;过滤条件 ≥0 且 <3000 |
| +0x368 | BIG5 悬停提示文本(变长,0 截断) | 如「勾選後,將自動撿取地上掉落的道具」;编辑框族此位置=长度计数(见④) |
| +0x3A0 | 第二段 BIG5 文本(提示续/扩展) | 较长提示溢出部分 |
④ 编辑框族专用结构(vtable 0x010BA280)
编辑框的 +0x360 段布局与常规控件完全不同:+0x368 不是文本!
| 偏移 | 含义 | 实测值 |
| +0x360 | 共享编辑组件指针 | 多行框=滚动条族统一 0x1ADEF714;小单行框另有 +0x32F=0x1ADEF654(两址相邻 0xC0,为共享编辑组件对) |
| +0x364 | 恒 1(非功能号) | — |
| +0x368 | 文本字节长度类计数 | 槽49 输入文本 44→95;槽48 文本变短 130→110 |
| +0x36C | 恒定(Y 相关?) | 等于控件 Y 坐标 |
| +0x380 | 第二计数(滚动/光标位置) | 槽49 新增文本 0→46;滚动条拖动 60→40 |
结论:文字本体不在对象 0x320~0x3CF 区间内,存在堆缓冲区。已验证"99/101"不在已转储区间(唯一 3939 命中=槽183 提示文案「3~999秒」误报)。读取文字需顺 +0x330 指针定点转储缓冲区,或弹窗打开时全量转储 diff 新控件后追踪其专属指针。
⑤ 功能号 ↔ 控件名对照表(实解)
| 功能号 | 控件 | 类型 |
| 1~6 | 页签按钮(攻擊/設定/恢復/輔助/回城/其他) | 19×35 按钮 |
| 13 | 是否攻擊 | 复选框 |
| 18/19 | 墨魂箱·體力恢復藥設定 | 复选框/设定 |
| 20/21 | 墨魂箱·內功恢復藥設定 | 复选框/设定 |
| 28 | 輔助武功 | 复选框 |
| 40/41 | 墨魂箱回城符組(开/关) | 11×11 复选框 |
| 44 | 回城自動關閉遊戲 | 复选框 |
| 45 | 神獸自動補飼料 | 复选框 |
| 47 | 自動開寶箱 | 复选框 |
| 49 | 啟動內掛丸 | 24×25 按钮 |
| 50 | 停止內掛丸 | 24×25 按钮 |
| 51 | 設定內掛丸 | 24×25 按钮 |
| 52 | 關閉內掛丸 | 24×25 按钮 |
| 功能号 | 控件 | 类型 |
| 55 | 反覆聊天 | 复选框 |
| 57 | 自動撿取道具 | 复选框(勾选实验目标) |
| 59 | 設定反覆聊天訊息 | 18×34 设定钮 |
| 84 | 重複對話時間(3~999秒)= .aut +0x9C | 编辑框 |
| 88 | 啟動戀人之魂 | 13×13 复选框 |
| 89 | 啟動刺客之魂 | 13×13 复选框 |
| 90 | 啟動商人之魂 | 13×13 复选框 |
| 91 | 設定撿取道具種類 | 18×34 设定钮 |
| 99 | 反覆聊天訊息文本 | 编辑框 |
| 113 | 赤蛇鬥關設定 | 18×34 设定钮 |
| 118 | 環龍之魂(已設定) | 46×44 大按钮 |
| 152~156 | 東嶺之魂/解除異常狀態武功等 | 复选框/设定钮 |
| 11/87 等 | 墨魂箱回城符組合相关 | 复选框 |
墨魂的箱子弹窗内另有滑条值:體力/內功恢復 59%×2、速度 4、回城页道具數 101 —— 均未在已转储区间发现,待弹窗打开状态全量转储后定位。
⑥ 类型识别特征
| 特征 | 值 | 类型 |
| 尺寸(W×H) | 13×13 | 复选框本体 |
24×25 | 功能按钮(啟動/停止/設定/關閉) |
18×34 | 「設定…」子弹窗按钮 |
46×44 | 魂类大按钮 |
8×161 / 16×116 | 滚动条 / 多行编辑框 |
| vtable(+0x00) | 0x010B0E7C | 常规控件 |
0x010BA280 | 编辑框 |
0x010B9E34 | 系统对象(编号1061/1246/2239) |
| 网格布局 | 复选框三列网格:X 步进 45px、Y 步进 20~50px |
⑦ 关键全局地址与 CALL 链(2026-09-19 游戏更新后新版)
| 项目 | 地址 | 备注 |
| 全局大列表基址 | 模块基址 + 58939224 (0x3835758) | 活体验证 158~1000 槽有效;旧 0x03BE80D0 已作废 |
| 背包全局 | 0x03BEF5D0 | 特征码命中;旧 bag+0x4A3F0 换算式失效 |
| 小助手 CALL 入口 | 0xA82880(模块偏移 0x682880) | 旧 0xA3F700 已作废;stdcall 自清参 |
| 按钮分发器 | 按钮对象+4 → 父UI → vtable 0x010E7070 → vt[1]=0xB39430 | executeCodeEx(0,false,addr) 路径可用;pushad/push0/push功能号/call/popad |
| 控件数组 | 大列表 1000 槽,每槽 4 字节对象指针 | 过滤:编号≥0 且 <3000;-827994200=字符串资源「道具吗?」;F00DBAAD=哨兵 |
| ECX 取值 | [obj+4] 一层解引用 | 两层 [[obj+4]] 拿到 .rdata vtable 必崩 |
2026-09-24 活体核验(同进程):全局大列表 1000/1000 槽全为合法堆指针(首偏移 vtable 如 0x10F1EE4×92、0x10FB388×53…),表给基址正确;背包全局 0x03BEF5D0 → P=0x497F45B8。aob_scan 默认 protection=+X-C-W 只扫代码段,扫数据/名字须传 protection="-X"(否则 0 命中)。
⑧ 存档文件格式(client 目录,定长结构体直接写盘,无加密)
| 文件 | 大小 | 结构 |
| .aut | 11812 B |
账号配置。头 dword=106;float 参数区;+0x9C=喊话间隔(字节);0x60~0xA8 布尔开关区;0xA9 起宏表 78B/条×13(BIG5 文本+4 偏移,=对话设定 13 个编辑框) |
| .scs | 403 B |
角色配置。0x00 起 15B BIG5 角色名 + 0x0F 魔数 28 04;0x11 起 12B/条记录:[00][功能号2B大端][00][参数2B][数值4B LE] |
| .mhslot | 292 B |
角色拾取配置。头 dword=2;+0x0C/+0x24 物品ID;+0x60 起 16B/条(槽号 + float 0.0090857 + 8B UID) |
| ybopt2_tokenXXX.cfg | — |
账号↔角色权威映射(<N_角色名> 标签 BIG5 内嵌)。token006=親親徒弟2 · 008=親親徒弟1 · 009=一明天一 · 010=沒有男朋友 · 011=TM加速器 · 012=一至尊一美美一 · 013=一至尊霸王花一 |
写入注意:① 宏文本必须 BIG5 可编码(繁体);② 助手退出时整文件覆盖写回——改文件要趁该账号配置未运行时;③ .scs/.mhslot 文件名是 BIG5→Unicode 私用区乱码,按名 exists 会 False,需扫目录枚举。
⑨ 转储与解析方法论(可复用流程)
| 环节 | 要点 |
| 性能优化转储 | 每控件仅 2 次整块读:内存_读字节集(句柄, 对象, 80) 取 0x00~0x4F;内存_读字节集(句柄, 对象+800, 176) 取 0x320~0x3CF。跳过全零段 0x50~0x31F。 |
| 日志格式 | ---- 槽N 对象=X 编号=Y ---- + 每行 +偏移 32个hex(16 字节、16 对齐) |
| 解析关键坑 | 每行只有 16 字节且 16 对齐:+0x364/+0x368 藏在 +360 行内偏移 4/8;0x00~0x4F 必须拼 +00/+10/+20/+30/+40 五行;+0x360 在拼接块第 64 字节 |
| diff 定位法 | 单一变量操作(只勾一个框/只改一个数字)→ 前后两份转储逐槽逐段比对 → 变化字节即状态位。误报排除:悬停提示文案里可能含数字(如 3~999) |
| 易语言工具链 | 字节集转HEX 需自建子程序(补零);无 0x 字面量 → 十六到十("320");存盘用 写到文件(路径, 到字节集(文本)) |
⑩ 待验证事项(下一步)
| 优先 | 事项 | 方法 |
| 高 | +0x360 程序化勾选写入闭环 | 写槽92(编号57)=1 → 转储验证 → 看游戏界面是否勾上、.aut 是否落盘 |
| 高 | 编辑框文本本体定位 | 墨魂箱子窗口保持打开 → 全量转储 → diff 新控件 → 顺 +0x330 指针定点读缓冲区(预期看到 "101"/"59"/"4") |
| 中 | +0x14 定性复核 | 现为"常量 -1",观察是否存在 0 的情况 |
| 中 | 滑条百分率存储位置 | 59/4/59 三值联合指纹搜索(成对 0x3B + 夹 4) |
| 低 | +0x350/+0x358 指针对互换语义 | 0x00642A3C 静态地址内容分析 |
⑪ 墨魂之箱子 / 凝神珠背包(2026-09-24 活体补充)
用户更正:凝神珠背包里装的"箱子"即 墨魂之箱子。其时间制记录以指纹 80 3A 09 00(=604800=7天秒数)标记;过期的箱子指纹为 0/负数,不在指纹列表,仅活跃(未过期)箱能被扫到——与"读箱子"逻辑一致。
| 项目 | 值 / 偏移 | 说明 |
| 活跃箱定位 | aob_scan 80 3A 09 00 | 数据区扫描(须 protection="-X",默认只扫代码会 0 命中);命中处=箱记录基址 |
| 到期时间 | 命中 +0x20 起 5×WORD | 年/月/日/时/分;即 读箱子 的 基址=命中+32 取法 |
| 当前实况 | 活跃箱=11 个 | 2026-09-24 同进程实测;过期箱数无指纹,需另行推算 |
| 名字存储 | 不在内存 | 物品名经 item-ID 查表解析,背包对象内不存名字串(aob_scan "墨魂" 全 protection 均 0 命中);"槽名字"实为「墨魂之箱子 + 到期」 |
| 箱子对象位置 | 游戏侧数据 | 墨魂之箱子 对象 不在 本表 1000 槽 UI 控件大列表中(实测:11 个指纹均不落在大列表对象体内/首偏移),属游戏背包容器,须经 背包全局 0x03BEF5D0 走游戏侧路径 |
背包管理器内部布局已变:本进程 P=0x497F45B8,其 +0x00=0x10FAE94 / +0x04=0x3A309D30 / +0x38=0x49695EC8 / +0x3C=0x49695ECC;而 +0x08=31、+0x0C=985 为计数类小整数,不再是 E2TXT 的 +0/+8/+0xC 三容器指针写法,凝神珠容器具体槽偏移待进一步钉死。
遍历建议:活跃箱直接用"读箱子"式指纹扫描 + 读到期即可(过期箱不在列表,符合预期);要数全部格位(含过期)须先钉死凝神珠容器槽数组偏移,再枚举其对象指针。