═══════════════════════════════════════════════════════════════ 仓库四基址特征分析(找基址用·2026-09-24) ═══════════════════════════════════════════════════════════════ 分析对象(四基址相邻 +4,这是第一特征): 0x03C0CC4C = 62966860 个人仓库·物品容器 0x03C0CC50 = 62966864 综合仓库·物品容器 0x03C0CC54 = 62966868 个人仓库·金币容器 0x03C0CC58 = 62966872 综合仓库·金币容器 活体验证(本次实测): 个人物品容器=0x4AA8B0B0 格1=高級金剛石 编号800000023 综合物品容器=0x4AA9BAE8 个人金币容器=0x4AA994E0 格1=Money 编号2000000000 金额(长整数)=11,110,998 综合金币容器=0x4AA9E0F0 格1=Money 编号2000000000 金额(长整数)=26,897,989 ── 四个容器头 vtable 全部 = 0x010FAE94;格内物品 vtable = 0x010FA7B0 (物品和Money共用物品vtable,区分靠编号2000000000) ─────────────────────────────────────────────────────────────── 一、结构特征(认出"哪个是哪个") ─────────────────────────────────────────────────────────────── 1. 相邻+4:四指针连排 4C/50/54/58。找到任何一个,其余三个 = ±4/±8/±12。 同一静态页里不会搞混,但注意和背包簇(0x3BEF5C4~F0)是两个不同区域, 相距约 0x11D000,别拿背包簇附近的地址当仓库。 2. 物品容器 vs 金币容器(活体判定): · 金币容器格1必是 Money 物品:编号(+0x54)=2000000000,名称(+0x64)="Money" · 金额必须读长整数(8字节):低4位@+0xD4C,高4位@+0xD50 · 物品容器格1编号是真实物品ID(如800000023) 代码里判定Money的方式:cmp [对象+8], 0x77359400(=2000000000) 3. 个人仓库 vs 综合仓库(代码里的类型ID,抓包/看调用也能对上): · 容器类型ID:个人仓库 = 8,综合仓库 = 9 · 调用形态:push 8 → mov ecx,[个人物品];push 9 → mov ecx,[综合物品] · UI里打开哪个仓库页,对应指针才会被写入/刷新数据 ─────────────────────────────────────────────────────────────── 二、代码特征码(AOB扫描·版本更新后重定位用) ─────────────────────────────────────────────────────────────── ★特征A【容器创建·主特征】最稳定,一条扫出物品双容器: 6A 3C 68 10 39 23 01 8B 0D ?? ?? ?? ?? E8 含义:push 60(格数) ; push 0x01233910(容器类) ; mov ecx,[??] ; call 创建 · 0x3C 前只有这一种格数写法,命中约2处 · 命中处 +9 开始的4字节 = 0x03C0CC4C(个人物品) · 第二处命中 +9 的4字节 = 0x03C0CC50(综合物品) · 若新版改了类指针0x01233910,用放宽版:6A 3C 68 ?? ?? ?? ?? 8B 0D ?? ?? ?? ?? E8 参考原字节(旧版): 个人: 6A 3C 68 10 39 23 01 8B 0D 4C CC C0 03 E8 F7 6A 09 00 (位于0x00CE8328附近) 综合: 6A 3C 68 10 39 23 01 8B 0D 50 CC C0 03 E8 7F 65 09 00 (位于0x00CE8843附近) ★特征B【金币容器定位】直接扫金币指针字节(+X代码段,命中很少): 54 CC C0 03 → 命中即引用 0x03C0CC54(个人金币) 58 CC C0 03 → 命中即引用 0x03C0CC58(综合金币) 四容器同函数四选二的分发形态(0x00CE9FC8附近): 8B 15 [54CC C003] 89 95 .. A1 [4CCC C003] 89 85 .. EB 18 8B 0D [58CC C003] 89 8D .. 8B 15 [50CC C003] 89 95 .. 即:个人页=物品4C+金币54 一组,综合页=物品50+金币58 一组。 ── 记忆口诀:4C物品↔54金币(个人),50物品↔58金币(综合)。 ★特征C【类型ID调用】确认个人/综合身份: 83 3D ?? ?? ?? ?? 00 75 ?? E9 ?? ?? ?? ?? 6A 08 6A 00 8B 0D ?? ?? ?? ?? E8 → 6A 08 (push 8) 后取的指针 = 个人仓库(旧版位于0x00D8B32F附近) 紧随其后 6A 09 (push 9) 取的指针 = 综合仓库 ★特征D【Money判定】版本无关常量,永不变: 81 79 08 00 94 35 77 (cmp [ecx+8], 0x77359400 = 2000000000) 仓库遍历代码用这个区分金币格和物品格,扫描 +X 段命中极准。 ★特征E【格子遍历】0x53C 格子表偏移: 83 BC 90 3C 05 00 00 00 (cmp dword [eax*4+0x53C], 0 判空格子) 在仓库指针引用后20字节内必出现,可交叉确认找对了容器。 ★特征F【vtable过滤】静态区扫描时的旧版值(新版会漂移,仅当参照): 容器头 vtable = 0x010FAE94,物品/Money vtable = 0x010FA7B0 做法:扫静态区 0x3C0C800~0x3C0D400,凡指向对象头vtable=0x010FAE94 的静态地址就是容器指针,再看格1内容定身份。 ★特征G【金币容器创建+类型ID全表】(CE桥恢复后补全实测): 四容器的类型ID写在容器对象+0x1734,编号连排: 个人物品 = 8 综合物品 = 9 个人金币 = 10(0x0A) 综合金币 = 11(0x0B) 写入指令(+X段扫描,几乎必中且含义唯一): 个人金币: C7 82 34 17 00 00 0A 00 00 00 (旧版位于0x00CE8421附近) 综合金币: C7 82 34 17 00 00 0B 00 00 00 (旧版位于0x00CE899A附近) 金币容器创建形态与物品容器同款但只有1格(push 1): A3 [54CC C003] ... A1 [54CC C003] 89 50 3C 6A 01 8D 8D AC FE FF FF 51 8B 0D [54CC C003] E8 ★Money对象创建常量(最硬的特征,2000000000不可能变): 6A 00 6A 00 6A 00 6A 00 6A 00 6A 00 68 00 94 35 77 (push 0x77359400 = Money编号,旧版位于0x00CE84CD/0x00CE8A49附近) ★特征H【邻域全零·最简单粗暴的找法】(实测0x3C0CC00~0x3C0CD7C): 四指针孤悬在一大片全零静态区中间:前面 0x3C0CC00~0x3C0CC4B 全 0, 后面 0x3C0CC5C~0x3C0CD7C 全 0,四指针连排后紧跟一个 0。 即特征 = 「连续4个非零堆指针(0x40000000~0x7FFFFFFF范围),其余全零」, 在 0x3C0C000~0x3C0D000 范围扫一遍就能肉眼锁定。 ★特征I【页签分发判定值】四选二函数(0x00CE9FBD / 0x00CEA593 附近): 个人侧: 83 39 03 75 19 8B 15 [54CC C003] ... A1 [4CCC C003] (cmp [ecx],3 → 金币54+物品4C) 综合侧: 83 38 05 75 1A A1 [58CC C003] ... 8B 0D [50CC C003] (cmp [eax],5 → 金币58+物品50) ── 再次确认配对:4C物品↔54金币(个人),50物品↔58金币(综合)。 ─────────────────────────────────────────────────────────────── 三、枢纽:容器分发函数(整个背包/仓库家族的"总开关") ─────────────────────────────────────────────────────────────── 两个跳转表分发函数同时引用四仓库+普通背包+活动背包: 0x00D59614 附近:FF 24 85 F0 96 D5 00(跳转表),分支里依次取 [0x03C0CC4C] / [0x03C0CC50] / [0x03BEF5E8] / [0x03BEF5D0] / [0x0188C61C] 0x00D5BC7B 附近:同类第二份(跳转表 20 BD D5 00) 0x00CE82B3~0x00CE9xxx:仓库数据同步大函数(创建+填格+金币刷新全在这) 含义:新版只要定位到这个分发函数,一个函数里能掏出全部容器基址。 ─────────────────────────────────────────────────────────────── 四、版本更新后重定位流程(照抄即可) ─────────────────────────────────────────────────────────────── 1. CE附加游戏,AOB扫描(+X 代码段): 6A 3C 68 ?? ?? ?? ?? 8B 0D ?? ?? ?? ?? E8 2. 每处命中 +9 读4字节(小端)= 个人/综合仓库·物品 的静态地址(两个)。 3. 物品地址 +8 = 个人金币,+12 = 综合金币(结构相邻,新版本大概率保持)。 4. 活体验证:进游戏开个人仓库,格子地址 = [物品基址 + 0x53C + 4×(格-1)]; 金币容器格1编号应=2000000000,金额与UI金币数一致(读长整数)。 5. 不放心就跑特征C核对类型ID 8/9、特征G核对10/11,跑特征D确认Money判定没变。 6. Python一键复测脚本:D:\ce_mcp\sig_仓库四基址_0924.py (需CE桥在线,自动验证四容器结构并重扫全部交叉引用) ─────────────────────────────────────────────────────────────── 五、备注 ─────────────────────────────────────────────────────────────── · CE桥恢复后已补全金币容器数据:54命中22处、58命中22处,创建代码 (0x00CE8421 / 0x00CE899A)与类型ID 10/11全部抓到,特征G为新增。 · 类型ID小结(容器对象+0x1734):个人物品=8 / 综合物品=9 / 个人金币=10 / 综合金币=11。 · 附带发现:0x277EE6B0 附近有两个相邻getter thunk (B8 54CC C003 E9 / B8 58CC C003 E9),位于高地址模块,不稳定仅作参考。 · 所有偏移(+0x53C/+0x54/+0x64/+0xD4C/+0xD50)与基址常量表 D:\AI空间\rxjh\基址常量_版本3_2026-09-24.txt 一致。