# 基址清单对比 —— 「验证清单」vs「工程实际在用」 > **A 方**:`基址活体验证清单.md` —— 我准备用 CE 逐条读值的地址(7 组) > **B 方**:`旧版本更新.代码`(E2TXT 反编译)—— **工程里真正被引用的地址** > **判定**:**A 已完整覆盖 B,一个不缺**。核心 9 个游戏基址地址完全一致,零冲突。 > **生成**:2026-09-18(v2 · 以清单当前内容重新对表) --- ## 一、结论速览 | 问题 | 答案 | |---|---| | 我实际用到的基址,和你清单里的一样吗? | **一样。** 工程 16 个地址 **全部**在清单里,地址一个不差 | | 有没有冲突? | **没有。** 16 个交集地址完全一致 | | 有没有「我用到了、你清单没有」的? | **没有了。** 上一版发现的 4 个缺项已补进清单第 7 组 | | 清单为什么比我用的多? | 清单**有意做超集**:多出的 13 个是备用特征变量、候选地址、运行时期望值 | **数量对账** | 项 | 数量 | |---|---| | 清单地址 | 29 | | 工程地址 | 16 | | ✅ 两边都有 | **16** | | 📋 只在清单(你没用到) | 13 | | 🆕 只在工程(清单缺) | **0** | --- ## 二、逐条总表(29 条,一条不漏) 判定列说明:**✅ 一致** = 两边同址;**📋 备用** = 清单有、工程未接;**🆕** = 工程有、清单缺。 | # | 地址 | 清单里的名字 | 静态引用 | 工程在用? | 工程里的名字 | 判定 | |---|---|---|---|---|---|---| | 1 | `0x0183C52C` | NPC基址值 / 助手链路头 | 10268 | ✅ 是 | `#NPC基址值` ×9 | ✅ 一致 | | 2 | `0x010A20F8` | 助手窗口虚表(期望值) | 运行时 | — | — | 📋 备用 | | 3 | `0x00A3F3D0` | 助手分派槽 #1(期望值) | 运行时 | — | — | 📋 备用 | | 4 | `0x03BE3E68` | 怪物基址值 | 1487 | ✅ 是 | `#怪物基址值` ×15 | ✅ 一致 | | 5 | `0x03BF28CC` | 人物基址值 / 坐标基址值 | 2503 | ✅ 是 | `#坐标基址值` ×5;`#人物基址值` ×6 | ✅ 一致 | | 6 | `0x03B9DCE0` | 背包基址值 / 背包列表基址 | 3417 | ✅ 是 | `#背包基址值` ×41 | ✅ 一致 | | 7 | `0x03B9DCEC` | 凝神珠背包基址值 | 78 | ✅ 是 | `#凝神珠背包基址值` ×3 | ✅ 一致 | | 8 | `0x03BA387C` | 状态栏基址值 / BUFF遍历基址 | 897 | ✅ 是 | `#状态栏基址值` ×2 | ✅ 一致 | | 9 | `0x011E0084` | 地图基址值 | 3 | ✅ 是 | `#地图基址值` ×9 | ✅ 一致 | | 10 | `0x0182A2DC` | 仓库基址值(现用) | 0 | ✅ 是 | `#仓库基址值` ×1 | ✅ 一致 | | 11 | `0x0182B5E8` | 仓库邻居 A ⭐ | 244 | — | — | 📋 备用 | | 12 | `0x0182AEB0` | 仓库邻居 B | 70 | — | — | 📋 备用 | | 13 | `0x03BC33BC` | 商店基址值(现用) | 0 | ✅ 是 | `#商店基址值` ×3 | ✅ 一致 | | 14 | `0x03BC21F8` | 商店邻居 A ⭐ | 76 | — | — | 📋 备用 | | 15 | `0x01801170` | 道具遍历基址 | 0 | — | — | 📋 备用 | | 16 | `0x03BA4C40` | 攻击列表候选 3 ⭐ | 204 | — | — | 📋 备用 | | 17 | `0x03BA4C3C` | 状态列表基址 | 53 | — | — | 📋 备用 | | 18 | `0x03970A70` | 血量基址 | 74 | ✅ 是 | `#当前血量值` ×74;`#当前血量` ×2 | ✅ 一致 | | 19 | `0x03BF2900` | 周围数量基址 | 8 | — | — | 📋 备用 | | 20 | `0x05BFEE78` | 周围列表基址 | 14 | — | — | 📋 备用 | | 21 | `0x03BA4A08` | 技能栏基址 | 403 | — | — | 📋 备用 | | 22 | `0x0183C51C` | 选中对象基址 | 1786 | — | — | 📋 备用 | | 23 | `0x017EF378` | NPC选项基址 | 1005 | ✅ 是 | `#发包Call_ECX值` ×1 | ✅ 一致 | | 24 | `0x0184437C` | 副本道具基址 | 114 | — | — | 📋 备用 | | 25 | `0x00400000` | 模块基址确认项 | — | ✅ 是 | 内联 `十六到十("400000")` ×1 | ✅ 一致 | | 26 | `0x0076C080` | 发包 call 地址值 | 代码地址 | ✅ 是 | `#发包call地址值` ×1 | ✅ 一致 | | 27 | `0x0076C2A1` | 封包 Eax 基址 | 代码地址 | ✅ 是 | `#封包Eax基址` ×1 | ✅ 一致 | | 28 | `0x01844380` | 是否进入角色选择界面 | 1 | ✅ 是 | 内联 `十六到十("01844380")` ×1 | ✅ 一致 | | 29 | `0x01200000` | 虚表校验上界 | 边界 | ✅ 是 | 内联 `十六到十("1200000")` ×1 | ✅ 一致 | > 另有 4 个地址**不算基址**,已从统计里剔除 —— 它们是第 4 组表内附注的「取址点」 > (即代码里执行 `读出基址` 那条指令自身的地址,属 `.text` 代码地址): > `0x00668951` · `0x009E73CE` · `0x00ADEACB` · `0x00CE3CD0`。 > 同理,第 1 组表内出现的 `+0x414` / `0x36C8` 等是小偏移,不计入。 --- ## 三、✅ 两边都有(16 个,地址完全一致) | # | 地址 | 清单里叫什么 | 工程里叫什么 | 备忘 | |---|---|---|---|---| | 1 | `0x00400000` | 模块基址确认项 | 内联 `十六到十("400000")` ×1 | 无重定位模块基址;工程用它做虚表合法性下界校验 | | 2 | `0x0076C080` | 发包 call 地址值 | `#发包call地址值` ×1 | ★ 静态从「NPC选项CALL基址」特征推出的目标,与工程写死的常量撞在同址 | | 3 | `0x0076C2A1` | 封包 Eax 基址 | `#封包Eax基址` ×1 | 工程里叫「基址」但**其实不是基址**,是 `.text` 里的发包取址点 | | 4 | `0x011E0084` | 地图基址值 | `#地图基址值` ×9 | | | 5 | `0x01200000` | 虚表校验上界 | 内联 `十六到十("1200000")` ×1 | 虚表合法性**上界**,与 `0x400000` 配成一对 | | 6 | `0x017EF378` | NPC选项基址 | `#发包Call_ECX值` ×1 | ★ 同一地址两套命名 —— 「基址更新·NPC选项基址」与「工程·发包Call_ECX值」互证 | | 7 | `0x0182A2DC` | 仓库基址值(现用) | `#仓库基址值` ×1 | ⚠ 两边同为 **0 引用** —— 说明**工程和清单一同错**,要改一起改 | | 8 | `0x0183C52C` | NPC基址值 / 助手链路头 | `#NPC基址值` ×9 | | | 9 | `0x01844380` | 是否进入角色选择界面 | 内联 `十六到十("01844380")` ×1 | ★ 与清单里的 `0x0184437C` 只差 4 字节(见第五节) | | 10 | `0x03970A70` | 血量基址 | `#当前血量值` ×74;`#当前血量` ×2 | | | 11 | `0x03B9DCE0` | 背包基址值 / 背包列表基址 | `#背包基址值` ×41 | | | 12 | `0x03B9DCEC` | 凝神珠背包基址值 | `#凝神珠背包基址值` ×3 | | | 13 | `0x03BA387C` | 状态栏基址值 / BUFF遍历基址 | `#状态栏基址值` ×2 | | | 14 | `0x03BC33BC` | 商店基址值(现用) | `#商店基址值` ×3 | ⚠ 同上,0 引用 | | 15 | `0x03BE3E68` | 怪物基址值 | `#怪物基址值` ×15 | | | 16 | `0x03BF28CC` | 人物基址值 / 坐标基址值 | `#坐标基址值` ×5;`#人物基址值` ×6 | | --- ## 四、🆕 只在工程里(清单缺项)—— 本版为空 **0 个。** 上一版列出的 4 个缺项已全部补进清单「第 7 组」: | 地址 | 工程里的名字 | 类型 | |---|---|---| | `0x0076C080` | `#发包call地址值` | **代码地址**(发包入口函数) | | `0x0076C2A1` | `#封包Eax基址` | **代码地址**(发包取址点 `lea eax,[ebp-0x401c]`) | | `0x01844380` | 内联 `十六到十("01844380")` | 全局变量(是否进入角色选择界面) | | `0x01200000` | 内联 `十六到十("1200000")` | 边界常量(虚表校验上界) | > 也就是说:**「我用到的基址」已 100% 被清单覆盖**,可以直接照清单开 CE 一次跑完。 --- ## 五、📋 只在清单里(你没用到)—— 13 个 ### 5.1 运行时期望值(2 个,不是读值目标) | 地址 | 清单里叫什么 | 工程里的情况 | |---|---|---| | `0x010A20F8` | 助手窗口虚表 | 工程不写死,靠 `[NPC基址值]+0x414` 链式取 → **链路一致** | | `0x00A3F3D0` | 助手分派槽 #1 | 同上,靠虚表 `+4` 取 → **一致** | > 这两个是**验证用的期望值**(第 1 组读出来应该等于它们),工程本来就不该写死。 ### 5.2 「基址更新」特征读出的备用全局变量(7 个) 来自 `辅助配置汇总.csv` 的 34 条 FindData 特征 —— 是**「常量失效时用特征重新找」的备用路线**, 当前工程还没接。 | 地址 | 清单里叫什么 | 静态引用 | 状态 | |---|---|---|---| | `0x03BF2900` | 周围数量基址 | 8 | 备用 | | `0x05BFEE78` | 周围列表基址 | 14 | 备用 | | `0x03BA4C3C` | 状态列表基址 | 53 | 备用 | | `0x03BA4A08` | 技能栏基址 | 403 | 备用 | | `0x0183C51C` | 选中对象基址 | 1786 | 备用 | | `0x0184437C` | 副本道具基址 | 114 | 备用 | | `0x01801170` | 道具遍历基址 | **0** | 备用 + 待复核 | ### 5.3 仓库/商店的邻居候选(3 个,非在用) | 地址 | 用途 | 静态引用数 | |---|---|---| | `0x0182B5E8` | 仓库邻居 A(疑为仓库真值,出现在 `add eax,0x182b5e8`) | **244** | | `0x0182AEB0` | 仓库邻居 B | 70 | | `0x03BC21F8` | 商店邻居 A(疑为商店真值) | **76** | ### 5.4 攻击列表候选(1 个) | 地址 | 清单里叫什么 | 与谁相邻 | |---|---|---| | `0x03BA4C40` | 攻击列表候选 3 | 与状态列表基址 `0x03BA4C3C` **相邻 4 字节**,204 引用 | --- ## 六、★ 地址相邻关系(顺手挖出的规律) 对表时发现几条「相邻 4 字节 / 小块偏移」的成对地址,说明它们是**同一区块里的兄弟字段**: | 地址对 | 相距 | 含义推断 | |---|---|---| | `0x0184437C`(清单·副本道具基址) ↔ `0x01844380`(工程在用·是否进入角色选择界面) | **+4** | 同一区块的兄弟字段 | | `0x03BA4C3C`(清单·状态列表基址) ↔ `0x03BA4C40`(清单·攻击列表候选3) | **+4** | 同一区块的兄弟字段 | | `0x0183C51C`(清单·选中对象基址) ↔ `0x0183C52C`(两边都在用·NPC基址值) | **+0x10** | 同一区块的兄弟字段 | | `0x03B9DCE0`(两边在用·背包基址值) ↔ `0x03B9DCEC`(两边在用·凝神珠背包基址值) | **+0xC** | 同一区块的兄弟字段 | > ⚠ 第 1 条很实用:`0x0184437C` 和 `0x01844380` **只差 4 字节**。 > 哪天「是否进入角色选择界面」读不到值,顺手试 `-4`;反之副本道具读不到就试 `+4`。 --- ## 七、待办(按优先级) | # | 事项 | 依据 | |---|---|---| | 1 | ★ **`助手_发命令` 第 9007 行补 `, 整数型`** | 类型丢失 → 通用型传参 → ④ 点控件必失败 | | 2 | 核对 `仓库基址值` → 试 `0x0182B5E8`(244 引用) | 现用值两边同为 0 引用 | | 3 | 核对 `商店基址值` → 试 `0x03BC21F8`(76 引用) | 同上 | | 4 | 活体确认 `地图基址值` | 静态仅 3 引用,全表最低 | | 5 | 试 `0x01844380` / `0x0184437C` 互换 | 相邻 4 字节,可能都有效 | | 6 | 攻击列表改用候选3 `0x03BA4C40` | 与状态列表相邻,204 引用 | --- ## 八、附:工程实际用到的 16 个绝对地址(原始清单) | 地址 | 来源(常量名 × 引用次数) | |---|---| | `0x00400000` | 内联 `十六到十("400000")` ×1 | | `0x0076C080` | `#发包call地址值` ×1 | | `0x0076C2A1` | `#封包Eax基址` ×1 | | `0x011E0084` | `#地图基址值` ×9 | | `0x01200000` | 内联 `十六到十("1200000")` ×1 | | `0x017EF378` | `#发包Call_ECX值` ×1 | | `0x0182A2DC` | `#仓库基址值` ×1 | | `0x0183C52C` | `#NPC基址值` ×9 | | `0x01844380` | 内联 `十六到十("01844380")` ×1 | | `0x03970A70` | `#当前血量值` ×74;`#当前血量` ×2 | | `0x03B9DCE0` | `#背包基址值` ×41 | | `0x03B9DCEC` | `#凝神珠背包基址值` ×3 | | `0x03BA387C` | `#状态栏基址值` ×2 | | `0x03BC33BC` | `#商店基址值` ×3 | | `0x03BE3E68` | `#怪物基址值` ×15 | | `0x03BF28CC` | `#坐标基址值` ×5;`#人物基址值` ×6 | ### 两个不算数的 | 名字 | 情况 | |---|---| | `#角色金钱基址值` | **只在注释行**出现(`窗口程序集:6786`),且 `常量.e.txt` **未定义** → 不影响编译 | | `#角色金钱值` | 同上 | > 另确认:`自动登录.代码`(另一个 E2TXT dump)的常量表**没有任何基址**, > 是纯登录/启动自动化工具,不读游戏内存。所以「你用到的基址」就是上面这 16 个。 --- *配套:《基址全量复验报告》`03_内存逆向与基址/19_基址全量复验报告.html` · 《E2TXT常量基址对照表》`20_E2TXT常量基址对照表.html` · 《基址活体验证清单》`03_内存逆向与基址/基址活体验证清单.md`* *抽取脚本:`scan_used_bases.py` + `gen_cmp_md.py` · 原始输出:`_used_bases.txt`*