# 全局地址与基址分析报告 —— 静态引用图视角 > **对象**:`D:\rxjh2025\client\YGOnline.exe`(14,752,768 字节,ImageBase `0x400000`,无重定位) > **方法**:capstone 逐指令线性反汇编 + MSVC RTTI 校验 + 引用形态分类 > **与前面几篇的区别**:前面是「拿已知地址去验证」;**这一篇反过来 —— 把 exe 里所有被绝对寻址引用的地址全挖出来,把已知的摘掉,剩下的按引用数排序 + 聚类 + 反推语义**。 > **生成**:2026-09-18 --- ## 一、结论速览 | 结论 | 内容 | |---|---| | **方法论升级** | 字节扫描会误报(把指令流字节当地址,例如扫出 `0x05050505`);改用 capstone 后 373 万条指令仅 **0.04%** 未解码,引用数变成「真实指令口径」 | | **全景** | 全 exe 共 **5978** 个被绝对寻址引用的目标(104,011 处引用)+ **1812** 个索引寻址基址 | | **★ 拿到类名** | 通过 RTTI 解出 **764 个真虚表**↔**762 个 C++ 类名**,其中 **203 个 `Inter*` 功能/控件类** | | **★ 助手类名** | 助手窗口 = **`.?AVInterAutoPlay@@`**,虚表 `0x010A20F8` | | **★ 范式通用** | 所有 `Inter*` 类共用 9 槽布局,**槽1 = 动作分派**;`0x3EE`/`0x3F4` 两个通用动作码在多个类的槽1 里都出现 → **你驱动助手的这套手法对其它窗口同样适用** | | **修正旧结论** | `InterInGameTotalShop` 虚表是 **`0x01079A68`**(不是 `0x01079A6C`)→ 因此 **`0x68B2B0` 是「槽1」不是「槽0」** | | **新识别的高价值地址** | **`0x01844360` = MAPID(当前地图ID)**(铁证:旁边就是 `MAPID : %d` 格式串) | | **确认的死值** | `仓库基址值 0x0182A2DC`、`商店基址值 0x03BC33BC` —— **两种寻址形态都 0 引用,且 ±0x80 内一个活跃地址都没有** | --- ## 二、方法:三代扫描器的差异(为什么引用数变了) | 代 | 做法 | 结果 | 问题 | |---|---|---|---| | 第 1 代(早期) | 只认 `[disp32]` 一种形态 | 大量地址被误判「0 引用」 | 漏了 `[reg*4+disp32]` 索引形态 | | 第 2 代(`verify_all2.py`) | 字节扫描 + 补 SIB 形态 | 8721 目标 / 105,342 引用 | **仍有误报**:在指令中段/数据里扫出假地址(如 `0x05050505`) | | **第 3 代(本次)** | **capstone 逐条反汇编**,只取真实解码出的内存操作数 | **5978 目标 / 104,011 引用**,未解码仅 0.04% | 口径更严,引用数比第 2 代略低(去掉误报) | 这一代还多了两个能力: 1. **读写区分** —— 用 capstone `op.access` 判断该地址是「只读」还是「运行时被赋值」。**有写入点的地址才可能是指针型基址**。 2. **引用形态分类** —— ``` 普通 mov ecx, dword ptr [0x183c520] ← 全局标量/指针 索引 mov ecx, dword ptr [eax*4+0x3be3e68] ← ★数组/对象表基址 指针槽 call dword ptr [0x76c080] ← ★函数指针(发包就是这么调的) ``` --- ## 三、全景统计 | 节区 | 被引用目标数 | 说明 | |---|---|---| | `.data` | **3515** | 全局变量(真正能当基址的地方) | | `.rdata` | 2425 | 虚表 / 跳转表 / 延迟导入槽 / 字符串 | | `.fptable` | 32 | 浮点常量表 | | `.text` | 6 | 代码内自引用 | | 索引寻址基址 | 数量 | |---|---| | 全部 | **1812** 个基址 / 6814 处索引访问 | exe 节区: ``` .text VA=0x00401000 VS=0x0C6D5B1 .rdata VA=0x0106F000 VS=0x0170356 .data VA=0x011E0000 VS=0x4A377A8 ← 注意:文件原始大小只有 0x1F800 .fptable VA=0x05C18000 VS=0x80 .rsrc VA=0x05C19000 VS=0x14320 ``` > `.data` 99.6% 在文件里没有初值 → 静态只能知道「代码碰过这个地址」,**值必须活体读**。 --- ## 四、★ RTTI 类名地图(本次最大的收获) exe 带完整 MSVC RTTI。结构关系: ``` vtable[-1] → _RTTICompleteObjectLocator(COL) +0x0C → _TypeDescriptor +8 → ".?AVInterAutoPlay@@" ← 类名直接可读 ``` | 项 | 数量 | |---|---| | TypeDescriptor(类型名) | **785** | | COL(完整对象定位器) | 861 | | **真虚表**(-4 处有 COL 支撑) | **764** | | 其中游戏/业务类 · 标准库类 | **762** · 2 | ### 4.1 助手的类名 = `InterAutoPlay` | 项 | 值 | 证据 | |---|---|---| | 助手窗口虚表 | `0x010A20F8` | 其 -4 处 `0x010A20F4 = 0x0118A238`(COL) | | COL → 类型名 | **`.?AVInterAutoPlay@@`** | COL+0x0C → TD `0x011F92F4` → 名字符串 | | 槽0(Init/构造) | `0x00A2FBF0` | 字节 dump 直接读出 | | **槽1(动作分派)** | **`0x00A3F3D0`** | 同上 —— **与你实机日志 `虚表=010A20F8 槽1=A3F3D0` 完全吻合** | | 构造函数 | `0x00A2DCC0` | 该函数里 `c7 00 F8 20 0A 01` = `mov dword ptr [eax], 0x010A20F8` | > 这条自洽链同时验证了三件事:**这套 RTTI 定位法可靠**、**虚表首地址没有偏移**、**你日志里的值是对的**。 ### 4.2 全部 `Inter*` 类(203 个) 槽0 = 构造/Init,**槽1 = ★动作分派(点控件的入口)**。 | # | 类名 | 虚表 | 槽0 (Init) | 槽1 (★分派) | |---|---|---|---|---| | 1 | `Inter2048Game` | `0x01075268` | `0x00617370` | **`0x00617DA0`** | | 2 | `InterAge` | `0x010A1A04` | `0x00A18680` | **`0x00A18A40`** | | 3 | `InterAttChangeSoulStone` | `0x010753BC` | `0x00619EC0` | **`0x0061B390`** | | 4 | `InterAttribute` | `0x010A1AD8` | `0x00A194E0` | **`0x00A1A6D0`** | | 5 | `InterAttributeJesukbu` | `0x010A1B60` | `0x00A1D980` | **`0x00A1E500`** | | 6 | `InterAttributeSoulStone` | `0x01075394` | `0x00619F00` | **`0x0061B570`** | | 7 | `InterAuction` | `0x010A1BE8` | `0x00A250C0` | **`0x00A26190`** | | 8 | `InterAuction` | `0x010A1C10` | `0x00763AC0` | **`0x00763AD0`** | | 9 | `InterAutoPlay` | `0x010A20F8` | `0x00A2FBF0` | **`0x00A3F3D0`** | | 10 | `InterAutosell` | `0x01075530` | `0x0061DEB0` | **`0x006254F0`** | | 11 | `InterByulho` | `0x010A2BEC` | `0x00A58CB0` | **`0x00A59C10`** | | 12 | `InterCallToGuild` | `0x010A2D1C` | `0x00A5B6A0` | **`0x00A5D8A0`** | | 13 | `InterCastleWar` | `0x01076108` | `0x00631960` | **`0x00636960`** | | 14 | `InterCenterMessage` | `0x01076EB0` | `0x00637F60` | **`0x00638450`** | | 15 | `InterChangeLooksPet` | `0x010A2DDC` | `0x00A61F10` | **`0x00A632C0`** | | 16 | `InterChat` | `0x010A30B4` | `0x00A69360` | **`0x00A930D0`** | | 17 | `InterCoatChange` | `0x010A4724` | `0x00A9CAF0` | **`0x00A9D430`** | | 18 | `InterConfirmBox` | `0x01077010` | `0x0063C1E0` | **`0x0063C360`** | | 19 | `InterCouple` | `0x010B0B34` | `0x00CA5CE0` | **`0x00CA5EF0`** | | 20 | `InterCoupleBreakUp` | `0x010B0B5C` | `0x00CA64B0` | **`0x00CA6AB0`** | | 21 | `InterCoupleGift` | `0x010B0B84` | `0x00CA8040` | **`0x00CA8B00`** | | 22 | `InterCouplePropose` | `0x010B0CB0` | `0x00CA98D0` | **`0x00CAA360`** | | 23 | `InterCoupleStatus` | `0x010B0D20` | `0x00CAB8C0` | **`0x00CABDF0`** | | 24 | `InterCreate` | `0x010A47C8` | `0x00A9E560` | **`0x00AA6070`** | | 25 | `InterDamhwarinCombo` | `0x010770B4` | `0x0063CC50` | **`0x0063D210`** | | 26 | `InterEmoticon` | `0x01077380` | `0x00641230` | **`0x006428D0`** | | 27 | `InterEnchantEquip` | `0x01080D54` | `0x00730EA0` | **`0x00738690`** | | 28 | `InterEnchantMuhoonEquip` | `0x01080D2C` | `0x00730EE0` | **`0x00738F90`** | | 29 | `InterEscape` | `0x010A5088` | `0x00AAD7C0` | **`0x00AAEAF0`** | | 30 | `InterEvent` | `0x010A51E4` | `0x00AAF500` | **`0x00AB0100`** | | 31 | `InterExcangeHeroWeapon` | `0x010775C8` | `0x00645380` | **`0x00646080`** | | 32 | `InterExchange` | `0x010A5270` | `0x00AB2210` | **`0x00AB44B0`** | | 33 | `InterExchangeAttributeAccessory` | `0x010777A8` | `0x00647540` | **`0x00647BC0`** | | 34 | `InterExchangeGroupEquipment` | `0x01077810` | `0x00648B50` | **`0x00649280`** | | 35 | `InterExit` | `0x010A5408` | `0x00AB6610` | **`0x00AB6780`** | | 36 | `InterFighterCombo` | `0x01077878` | `0x00649EC0` | **`0x0064A560`** | | 37 | `InterFireworksEvent` | `0x01080DCC` | `0x00730F20` | **`0x007390E0`** | | 38 | `InterGenderChange` | `0x01077A6C` | `0x0064BEC0` | **`0x0064C5C0`** | | 39 | `InterGibo` | `0x01079714` | `0x00670F30` | **`0x00672730`** | | 40 | `InterGifticon` | `0x01077A94` | `0x0064D130` | **`0x0064D310`** | | 41 | `InterGroup` | `0x0107993C` | `0x006742A0` | **`0x00674590`** | | 42 | `InterGuildNameChange` | `0x01077B18` | `0x0064E2D0` | **`0x0064FB50`** | | 43 | `InterGwisokbu` | `0x01080D7C` | `0x00730F60` | **`0x007391E0`** | | 44 | `InterHCoinExchange` | `0x01080D04` | `0x00730FA0` | **`0x007392C0`** | | 45 | `InterHairdressing` | `0x010A5574` | `0x00AB9080` | **`0x00ABAB90`** | | 46 | `InterHanbigwangQuest` | `0x01079964` | `0x00674F70` | **`0x00675490`** | | 47 | `InterHelp` | `0x010A5664` | `0x00ABBEB0` | **`0x00ABBF00`** | | 48 | `InterHonorRank3` | `0x01077D98` | `0x00650180` | **`0x0065B660`** | | 49 | `InterImage` | `0x010B1090` | `0x00CC3C50` | **`0x00CC3DB0`** | | 50 | `InterInGameTotalShop` | `0x01079A68` | `0x0067C180` | **`0x0068B2B0`** | | 51 | `InterIndunQuest` | `0x01079264` | `0x00662C30` | **`0x00667B80`** | | 52 | `InterInitiateAbility` | `0x010A568C` | `0x00ABE480` | **`0x00AC1350`** | | 53 | `InterInventory` | `0x010A5890` | `0x00AC67E0` | **`0x00AE3760`** | | 54 | `InterItemReg` | `0x010A5EB4` | `0x00AE62C0` | **`0x00AE63E0`** | | 55 | `InterItemRooting` | `0x010A5F44` | `0x00AE7040` | **`0x00AE77E0`** | | 56 | `InterJedanbu` | `0x010A5FCC` | `0x00AE7ED0` | **`0x00AE8050`** | | 57 | `InterJesukbu` | `0x010A5FF4` | `0x00AEA860` | **`0x00AED410`** | | 58 | `InterKeyboard` | `0x010A6078` | `0x00AF2300` | **`0x00AF33D0`** | | 59 | `InterKeyboardControl` | `0x0107B8C8` | `0x006968A0` | **`0x00698840`** | | 60 | `InterKeyboardNumOnly` | `0x010A6440` | `0x00AF3CF0` | **`0x00AF4390`** | | 61 | `InterLOGIN` | `0x010A6830` | `0x00AF8880` | **`0x00AFACE0`** | | 62 | `InterList` | `0x010B1130` | `0x00CC5AA0` | **`0x00CC65D0`** | | 63 | `InterLuckyBag` | `0x010A7428` | `0x00B033C0` | **`0x00B03480`** | | 64 | `InterLuckyBox` | `0x010A7450` | `0x00B036B0` | **`0x00B04440`** | | 65 | `InterMAIN` | `0x010A7D40` | `0x00B22380` | **`0x00B465B0`** | | 66 | `InterMacro` | `0x010A7590` | `0x00B06550` | **`0x00B06E20`** | | 67 | `InterMaeyuExchangeItem` | `0x0107B8F8` | `0x00699650` | **`0x00699D80`** | | 68 | `InterMail` | `0x010A75DC` | `0x00B08910` | **`0x00B10A30`** | | 69 | `InterMainGageBar` | `0x010A8A0C` | `0x00B54C60` | **`0x00B551B0`** | | 70 | `InterManufacture` | `0x010A8B7C` | `0x00B58970` | **`0x00B5CE70`** | | 71 | `InterMarbleEvolve` | `0x0107B960` | `0x0069A980` | **`0x0069BB70`** | | 72 | `InterMarriageAdmission` | `0x010A8E04` | `0x00B64840` | **`0x00B657E0`** | | 73 | `InterMarriageInvitation` | `0x010A8F18` | `0x00B680D0` | **`0x00B68D00`** | | 74 | `InterMarriageRing` | `0x010A9320` | `0x00B6BC40` | **`0x00B6BE60`** | | 75 | `InterMarriageWeding` | `0x010A9394` | `0x00B6C870` | **`0x00B6D310`** | | 76 | `InterMedicineMaking` | `0x010A97B8` | `0x00B78450` | **`0x00B79F00`** | | 77 | `InterMemberParty` | `0x010A9840` | `0x00B7BBA0` | **`0x00B7BC50`** | | 78 | `InterMessenger` | `0x010BA7B8` | `0x00D9D470` | **`0x00DA4DA0`** | | 79 | `InterMessengerAdd` | `0x010BA768` | `0x00D9D4B0` | **`0x00DA4EF0`** | | 80 | `InterMessengerChat` | `0x010BA790` | `0x00D9D4F0` | **`0x00DA4F90`** | | 81 | `InterMiniMap` | `0x010A9930` | `0x00B81320` | **`0x00B83F60`** | | 82 | `InterMinimapMove` | `0x0107BA1C` | `0x006A2690` | **`0x006A5660`** | | 83 | `InterMsgBox` | `0x010B1204` | `0x00CCABE0` | **`0x00CCBC60`** | | 84 | `InterMugong` | `0x010A9E24` | `0x00B8DC10` | **`0x00B93180`** | | 85 | `InterMugongHanbigwang` | `0x0107BB90` | `0x006ABBD0` | **`0x006B39D0`** | | 86 | `InterMugongLearn` | `0x010AA2F0` | `0x00B98A00` | **`0x00B98B10`** | | 87 | `InterMunpa` | `0x010AF928` | `0x00C64E80` | **`0x00C6B2E0`** | | 88 | `InterMunpaCloth` | `0x010AF57C` | `0x00C56C90` | **`0x00C578E0`** | | 89 | `InterMunpaWar` | `0x010AF810` | `0x00C5AE60` | **`0x00C5B070`** | | 90 | `InterMunpaWearSynthesis` | `0x010AF8AC` | `0x00C5E420` | **`0x00C5EA00`** | | 91 | `InterMyAging` | `0x010AA384` | `0x00B99D50` | **`0x00B9B6A0`** | | 92 | `InterMyParty` | `0x010AA44C` | `0x00BA2570` | **`0x00BA2800`** | | 93 | `InterNPCAging` | `0x010B030C` | `0x00C8C4E0` | **`0x00C8DEC0`** | | 94 | `InterNPCBloodBattle` | `0x0107C204` | `0x006C4440` | **`0x006C5690`** | | 95 | `InterNPCEnchant` | `0x010B03F8` | `0x00C90DE0` | **`0x00C92120`** | | 96 | `InterNPCItemSeal` | `0x010B0420` | `0x00C93420` | **`0x00C936C0`** | | 97 | `InterNPCKawibawibo` | `0x0107C3C8` | `0x006C6EA0` | **`0x006C7140`** | | 98 | `InterNPCKawibawiboInfo` | `0x0107C3F0` | `0x006C6EE0` | **`0x006C7730`** | | 99 | `InterNPCLock` | `0x010B04A0` | `0x00C94950` | **`0x00C95F30`** | | 100 | `InterNPCManufactureUnion` | `0x010B06A0` | `0x00C98290` | **`0x00C98450`** | | 101 | `InterNPCMunpa` | `0x010B073C` | `0x00C99F20` | **`0x00C9AF20`** | | 102 | `InterNPCNewAging` | `0x0107C860` | `0x006C9D40` | **`0x006CB420`** | | 103 | `InterNPCPetEnchant` | `0x010B07CC` | `0x00C9C420` | **`0x00C9D200`** | | 104 | `InterNPCPetYongmuldan` | `0x010B0820` | `0x00C9E6A0` | **`0x00C9F550`** | | 105 | `InterNPCReturneeRollBook` | `0x0107E798` | `0x00704EA0` | **`0x00705610`** | | 106 | `InterNPCRoastBungeoppang` | `0x0107CAB4` | `0x006CFA70` | **`0x006D0910`** | | 107 | `InterNPCSMS` | `0x010B04F0` | `0x00C94990` | **`0x00C96430`** | | 108 | `InterNPCStore` | `0x010B08EC` | `0x00CA0D10` | **`0x00CA3180`** | | 109 | `InterNPCTrans` | `0x010B098C` | `0x00CA3A40` | **`0x00CA4570`** | | 110 | `InterNPCUnLock` | `0x010B04C8` | `0x00C949D0` | **`0x00C967C0`** | | 111 | `InterNPCWarEx` | `0x0107CD94` | `0x006DBBE0` | **`0x006E25E0`** | | 112 | `InterNPCWarFilter` | `0x0107DD8C` | `0x006E7E70` | **`0x006E7FE0`** | | 113 | `InterNPCWarTwo` | `0x0107DFE0` | `0x006EE940` | **`0x006F2170`** | | 114 | `InterNPCWarp` | `0x010B0B0C` | `0x00CA4F00` | **`0x00CA55D0`** | | 115 | `InterNPCYGTalk` | `0x0107E218` | `0x006F45C0` | **`0x006F4830`** | | 116 | `InterNPC_ACCDisassemble` | `0x010AFEC4` | `0x00C82580` | **`0x00C82AD0`** | | 117 | `InterNPC_ACCUpgrade` | `0x010AFF60` | `0x00C83D10` | **`0x00C84B10`** | | 118 | `InterNPC_AttendanceBook` | `0x0107E308` | `0x006F5C20` | **`0x006F6690`** | | 119 | `InterNPC_COSTUME_Disassemble` | `0x0107E49C` | `0x006F7340` | **`0x006F78A0`** | | 120 | `InterNPC_COSTUME_Transference` | `0x0107E550` | `0x006F8670` | **`0x006F8FC0`** | | 121 | `InterNPC_COSTUME_Upgrade` | `0x0107E5EC` | `0x006F9F40` | **`0x006FAA30`** | | 122 | `InterNPC_EQUIPMENT_Upgrade` | `0x0107E668` | `0x006FBFF0` | **`0x006FC8A0`** | | 123 | `InterNPCcollate` | `0x010B0358` | `0x00C8F340` | **`0x00C8FD60`** | | 124 | `InterNameChange` | `0x010AA818` | `0x00BA3AA0` | **`0x00BA5080`** | | 125 | `InterNewBoard` | `0x0107C0B0` | `0x006C0690` | **`0x006C0980`** | | 126 | `InterNewSoulRevive` | `0x0107C144` | `0x006C2220` | **`0x006C22C0`** | | 127 | `InterNotice` | `0x010AA8C4` | `0x00BA53F0` | **`0x00BA5810`** | | 128 | `InterNpc` | `0x010AFDB8` | `0x00C77180` | **`0x00C7FCC0`** | | 129 | `InterNpcManufacture` | `0x010B0678` | `0x00C974D0` | **`0x00C97760`** | | 130 | `InterNpcMunpaRestore` | `0x0107C7D0` | `0x006C8790` | **`0x006C8F20`** | | 131 | `InterNpcRepair` | `0x0107C918` | `0x006CC440` | **`0x006CCC20`** | | 132 | `InterNpcWarToogi` | `0x0107DDB4` | `0x006EA370` | **`0x006EA760`** | | 133 | `InterNpc_GuildWar_Cancel` | `0x010B0184` | `0x00C87CE0` | **`0x00C87F30`** | | 134 | `InterNpc_GuildWar_Enter` | `0x010B01AC` | `0x00C88C20` | **`0x00C88DB0`** | | 135 | `InterNpc_GuildWar_ShowRank` | `0x010B00A8` | `0x00C867D0` | **`0x00C86B20`** | | 136 | `InterNpc_OrgWear_Requital` | `0x010B0220` | `0x00C8AB20` | **`0x00C8ACF0`** | | 137 | `InterNumber` | `0x010B1430` | `0x00CCCAB0` | **`0x00CCCCF0`** | | 138 | `InterOption` | `0x010AA950` | `0x00BAF570` | **`0x00BB11E0`** | | 139 | `InterPCStore` | `0x010AB608` | `0x00BCC7C0` | **`0x00BD2620`** | | 140 | `InterParty` | `0x010AADBC` | `0x00BBA4B0` | **`0x00BBE970`** | | 141 | `InterPartySearch` | `0x010AB318` | `0x00BC84D0` | **`0x00BC3750`** | | 142 | `InterPartySearchChat` | `0x010AB480` | `0x00BCA190` | **`0x00BCA8D0`** | | 143 | `InterPath` | `0x0107E6CC` | `0x006FF0F0` | **`0x00A4EEA0`** | | 144 | `InterPayStorage` | `0x0107CB28` | `0x006D1E70` | **`0x006D51D0`** | | 145 | `InterPcRoomBenefit` | `0x010AB5B4` | `0x00BCB620` | **`0x00BCBC60`** | | 146 | `InterPetMenuPopup` | `0x010AB8AC` | `0x00BD71E0` | **`0x00BD7290`** | | 147 | `InterPetNaming` | `0x010AB9A0` | `0x00BD7990` | **`0x00BD7F50`** | | 148 | `InterPetStore` | `0x010ABA00` | `0x00BD8550` | **`0x00BD8FC0`** | | 149 | `InterPkPropensityQuestNotice` | `0x010ABA8C` | `0x00BD9650` | **`0x00BD9980`** | | 150 | `InterPopup` | `0x010ABAB4` | `0x00BD9BB0` | **`0x00BD9C00`** | | 151 | `InterPopupMenu::NameSpace_PopupMenu` | `0x010B15BC` | `0x00CCF100` | **`0x00CCF400`** | | 152 | `InterPouch` | `0x010ABADC` | `0x00BDA150` | **`0x00BDA260`** | | 153 | `InterPouchClothes` | `0x0107E728` | `0x00704390` | **`0x007043D0`** | | 154 | `InterPouchEvent` | `0x0107E7C0` | `0x00705D30` | **`0x00705DD0`** | | 155 | `InterPremiumCashItem` | `0x010ABB74` | `0x00BDC710` | **`0x00BDD640`** | | 156 | `InterPremiumCharm` | `0x010ABD7C` | `0x00BE0080` | **`0x00BE0E40`** | | 157 | `InterPremiumSelect` | `0x010AC074` | `0x00BE57B0` | **`0x00BE5CE0`** | | 158 | `InterPremiumWin` | `0x010AC1EC` | `0x00BE7BD0` | **`0x00BE95F0`** | | 159 | `InterQuestEx` | `0x010AC340` | `0x00BF2F90` | **`0x00BFB320`** | | 160 | `InterRaid` | `0x0107E830` | `0x0070AF90` | **`0x0070E1E0`** | | 161 | `InterSTATIC` | `0x010B15EC` | `0x00CD3050` | **`0x00CD3780`** | | 162 | `InterSaJeMugongWnd` | `0x010802D8` | `0x007158A0` | **`0x00715E90`** | | 163 | `InterScenario` | `0x01080348` | `0x00718490` | **`0x00718EE0`** | | 164 | `InterSecretCode` | `0x010AD3B0` | `0x00C076F0` | **`0x00C08210`** | | 165 | `InterSelect` | `0x010AD534` | `0x00C0D790` | **`0x00C114A0`** | | 166 | `InterSendPackage` | `0x010804C0` | `0x0071B670` | **`0x00723070`** | | 167 | `InterSerialItem` | `0x01080CDC` | `0x00730FE0` | **`0x00739370`** | | 168 | `InterServerMove` | `0x01080BC4` | `0x0072C100` | **`0x0072CDD0`** | | 169 | `InterServerSelectForTournament` | `0x01081338` | `0x0073C3D0` | **`0x0073C760`** | | 170 | `InterSoulPetEvolve` | `0x01081460` | `0x0073D260` | **`0x0073ECF0`** | | 171 | `InterSoulPetReinforce` | `0x010814F4` | `0x0073FB00` | **`0x00741680`** | | 172 | `InterSoulPetSeal` | `0x010815E0` | `0x007426A0` | **`0x007431F0`** | | 173 | `InterSoulPetWareHouse` | `0x01081668` | `0x00743BA0` | **`0x00744AB0`** | | 174 | `InterSoulStone` | `0x010816D4` | `0x007453E0` | **`0x00746420`** | | 175 | `InterStatus` | `0x010AE084` | `0x00C1CDC0` | **`0x00C291E0`** | | 176 | `InterStatusReply` | `0x010AE4BC` | `0x00C32C00` | **`0x00C34220`** | | 177 | `InterTargetingUI` | `0x010817A8` | `0x00747660` | **`0x00748070`** | | 178 | `InterTextInput` | `0x010B1614` | `0x00CD4AF0` | **`0x00CD53C0`** | | 179 | `InterTextOutput` | `0x010B163C` | `0x00CD6DA0` | **`0x00CD75E0`** | | 180 | `InterTimer` | `0x01081964` | `0x0074A4F0` | **`0x0074A7F0`** | | 181 | `InterToolTipBox` | `0x0108198C` | `0x0074AF20` | **`0x0074AF70`** | | 182 | `InterTotalShopPreview` | `0x01081A20` | `0x0074CDA0` | **`0x0074E650`** | | 183 | `InterUI_AllFunction` | `0x01081D24` | `0x007573D0` | **`0x00757CF0`** | | 184 | `InterUI_CharacterInfo` | `0x01082554` | `0x00758DA0` | **`0x00759710`** | | 185 | `InterUI_Community` | `0x01082B04` | `0x0075A2C0` | **`0x0075ACD0`** | | 186 | `InterUI_Manufacture` | `0x010831E0` | `0x0075B7B0` | **`0x0075BBD0`** | | 187 | `InterUI_Option` | `0x010835F4` | `0x0075C840` | **`0x0075CF30`** | | 188 | `InterUI_Quest` | `0x01083AA8` | `0x0075D790` | **`0x0075DBB0`** | | 189 | `InterVIPCashMallReward` | `0x01083C98` | `0x0075EC80` | **`0x0075F480`** | | 190 | `InterValentineRank` | `0x01080DA4` | `0x00731020` | **`0x007394D0`** | | 191 | `InterWar` | `0x010AE588` | `0x00C35C20` | **`0x00C37180`** | | 192 | `InterWarStateMap` | `0x01083DFC` | `0x00761830` | **`0x00761A70`** | | 193 | `InterWarpToGuard` | `0x01083D60` | `0x007600A0` | **`0x00760170`** | | 194 | `InterWarpToGuild` | `0x010AE5E4` | `0x00C38730` | **`0x00C38C80`** | | 195 | `InterWarpToParty` | `0x010AE63C` | `0x00C39800` | **`0x00C39F60`** | | 196 | `InterWeb` | `0x010AE688` | `0x00C3C260` | **`0x00C3ED70`** | | 197 | `InterWebFlash` | `0x010841C4` | `0x00763A80` | **`0x00764300`** | | 198 | `InterWebFlash` | `0x010841EC` | `0x00763AC0` | **`0x00763AD0`** | | 199 | `InterWebPreview` | `0x010AEAFC` | `0x00C41E40` | **`0x00C43510`** | | 200 | `InterWebShop` | `0x010AEDE0` | `0x00C46AE0` | **`0x00C46C50`** | | 201 | `InterWindow` | `0x010B1664` | `0x00CD9E20` | **`0x00CDABE0`** | | 202 | `InternalContextBase::details::Concurrency` | `0x01111D80` | `0x00F909E0` | **`0x00F90A0E`** | | 203 | `InternalContextBase::details::Concurrency` | `0x01111DA8` | `0x00F909E4` | **`0x00F90A2A`** | > 完整含槽2~槽8 的清单:`_g4_inter.tsv`(制表符分隔,可直接导入表格软件) --- ## 五、★ 9 槽布局与「通用调用范式」 ### 5.1 槽位指纹:哪些槽是每类专属,哪些是共用基类 统计全部 `Inter*` 类各槽取值分布: | 槽 | 主要取值 | 占同类比例 | 判定 | |---|---|---|---| | **槽0** | 每类都不同 | — | 各类自己的 Init/构造 | | **槽1** | 每类都不同 | — | ★**各类自己的动作分派** | | 槽2 | `0x00567450` | 98% | 基类共用(`mov eax,1; ret`) | | 槽3 | `0x00568CA0` | 94% | 基类共用 | | 槽4 | `0x00568C90` | 98% | 基类共用 | | 槽5 | `0x00568CB0` | 98% | 基类共用 | | 槽6 | `0x00A58370` | 98% | 基类桩(`xor al,al; ret` → 返回 false) | | 槽7 | `0x00A58350` | 97% | 基类桩(`ret 0x10` → 4 参数空实现) | | 槽8 | `0x00A58360` | 97% | 基类桩(`mov al,1; ret 0x10` → 返回 true) | **结论:槽 2~8 全是共用基类桩函数,没有任何按功能定制的逻辑。真正有意义的只有槽0 和槽1。** ### 5.2 ★ 槽1 的函数形态:助手那套机制是通用的 把几个类的槽1 反汇编前几条摆一起看: ``` InterAutoPlay 槽1 0xA3F3D0 push ebp; mov ebp,esp; sub esp,0x20; push esi mov [ebp-4], ecx ; this mov eax,[ebp+8] ; ← 动作码(第一个参数) mov [ebp-8], eax cmp [ebp-8], 8 / jg ... ; 分派 InterInventory 槽1 0xAE3760 ← 背包 push ebp; mov ebp,esp; sub esp,0x40 mov [ebp-8], ecx mov eax,[ebp+8] ; ← 同一个参数位 mov [ebp-0xc], eax cmp [ebp-0xc], 0x3EE ; jg ... ; ★ 0x3EE! InterStatus 槽1 0xC291E0 ← 状态/属性 push ebp; mov ebp,esp; mov eax,0x82a4; call __chkstk mov eax,[0x11f4380]; xor eax,ebp ; GS 栈保护 mov [ebp-0x80a8], ecx mov eax,[ebp+8] cmp [ebp-0x80b8], 0x3EE ; jg ... ; ★ 0x3EE! ``` 三点一致: 1. **第一个参数(`[ebp+8]`)= 动作码**,槽1 就是「按动作码分派」的方法; 2. **`0x3EE` 这个魔法动作码**在 `InterInventory`、`InterStatus` 里都出现; 3. 助手(`InterAutoPlay`)里是 `0x3EE` + **`0x3F4`** 两个,其中 `0x3F4` 分支把 `(控件ID, lParam)` 转给 `0xA3F700` ——**这就是你点控件的通路**。 ### 5.3 由此得到的推论(★ 待活体验证) 你现在的调用是: ``` 控件对象 → [+4] 取父窗口 → [窗口] 取虚表 → call [虚表+4](槽1) push 0x3F4(msg) push [控件+0x364](命令ID) push 0(lParam) ``` 既然**父窗口的槽1 在各类里都是同一个「动作码分派」协议**,那么这套流程理论上**对背包、状态、NPC、组队等任意 `Inter*` 窗口都成立** —— 区别只在于「控件对象的偏移」和「该窗口认的命令ID」。 > ⚠ 这是本报告**唯一没有活体验证的结论**,因为它是从「多个类槽1 形态一致 + 同一个魔法动作码」推出来的,不是直接读到的。 > 要证实,只需按第七节的方法对任意另一个窗口(比如背包)复现一次。 --- ## 六、★ 修正两条旧结论(含我自己上次的错) ### 6.1 `InterInGameTotalShop` 的虚表首地址是 `0x01079A68` 字节级证据: ``` 0x01079A64 : 0x011842E8 (.rdata) ← 这一格是 COL 指针 0x01079A68 : 0x0067C180 (.text) ← 槽0 0x01079A6C : 0x0068B2B0 (.text) ← 槽1 0x01079A70 : 0x00567450 (.text) ← 槽2(基类共用) ``` `0x011842E8` 作为 COL 的解: ``` +0x00 = 00000000 (signature) +0x0C = 0x011F66D4 → TD → ".?AVInterInGameTotalShop@@" ← 类名对上了 ``` 构造函数也印证:`0x00679D04` 与 `0x0067B21D` 处都是 `c7 00 68 9A 07 01`(`mov [eax], 0x01079A68`)。 而**立即数 `0x01079A6C` 在整个 `.text` 里出现 0 次** —— 没有任何一处把 `0x01079A6C` 当虚表头写入。 ### 6.2 因此 `0x68B2B0` 是「槽1」,不是「槽0」 | 版本 | 说法 | 对错 | |---|---|---| | 早期报告 | 虚表 `0x01079A6C`,槽0 = `0x68B2B0` | ❌ 虚表地址偏了 4 字节 | | 我上次的「修正」 | 「0x68B2B0 是槽0 不是槽1」 | ❌ **反了** | | **本次(RTTI 校验)** | **虚表 `0x01079A68`,槽0 = `0x67C180`,槽1 = `0x68B2B0`** | ✅ | 而且**这次的结果反而更符合助手那边的规律**: | 类 | 虚表 | 槽0 | 槽1 | |---|---|---|---| | InterAutoPlay(助手) | `0x010A20F8` | `0xA2FBF0` | **`0xA3F3D0`** | | InterInGameTotalShop | `0x01079A68` | `0x67C180` | **`0x68B2B0`** | | InterGroup(组队) | `0x0107993C` | `0x6742A0` | `0x674590` | | InterInventory(背包) | `0x010A5890` | `0xAC67E0` | `0xAE3760` | | InterNpc | `0x010AFDB8` | `0xC77180` | `0xC7FCC0` | | InterStatus(状态) | `0x010AE084` | `0xC1CDC0` | `0xC291E0` | — **每个类的「分派槽」都规规矩矩待在槽1**,`0x68B2B0` 归位。 --- ## 七、未知高引用地址的语义判定 把已知的摘掉后,按引用数排序,逐个看「谁在用它、怎么用、旁边的字符串是什么」。 ### 7.1 分类结果 #### ⛔ A 类:CRT / 运行时,**不要当基址** | 地址 | 引用 | 判定 | 铁证 | |---|---|---|---| | `0x011F4380` | **6581** | **`__security_cookie`(GS 栈保护 cookie)** | 每个受保护函数序言:`mov eax,[0x11f4380]; xor eax,ebp; mov [ebp-4],eax`;退出时 `xor esi,[0x11f4380]` 校验。6581 处 = 6581 个受保护函数 | | `0x011F423C` | 572 | CRT 函数指针槽 | 570 处是 `call dword ptr [0x11f423c]`,写入点 `mov [0x11f423c], edx` | | `0x011F4244` | 148 | 同上 | 146 处 `call` | | `0x011F4238` / `0x011F4248` | 64 / 52 | 同上(同区块) | 都在 `.data` 最头部 0x11F42xx | | `0x05C0DABC` | 646 | 第三方库全局状态 | 引用者全部落在 `0xE5xxxx~0xF9xxxx`(CRT/WebView2 区) | | `0x0106F904` 等 `0x106Fxxx` | 934 / 827 / 293… | **延迟导入跳转槽**(`.rdata` 起始) | 全是被 `call` 且成片排列 | > **记住一句话**:`.data` 开头 `0x11F42xx~0x11F44xx` 这一段是 CRT 的地盘,`0x11E0000` 往后才慢慢进入游戏数据。 #### 🎮 B 类:图形/D3D,半可用 | 地址 | 引用 | 判定 | 证据 | |---|---|---|---| | `0x017EF52C` | 4623 | **D3DX 设备/纹理工厂接口指针** | 引用点:`mov ecx,[0x17ef52c]; push ecx; call 0x40a4be`,压参 `0xc8`(200) / `0x64`(100) / `0x15`;旁边字符串 `BALLOON - D3DXCreateTexture()` | | `0x017EF528` | 192 | 浮点常量槽(D3D 相关) | 全被 `movss / addss / mulss / subss` 使用 | | `0x017EF7B0` / `0x017EF7B4` | 998 / 653 | 同区块配置指针 | 引用点伴 `Taiwan` / `%s` 字符串 | #### ✅ C 类:游戏逻辑,**可以当基址用** | 地址 | 引用 | 判定 | 证据 / 用法 | |---|---|---|---| | **`0x01844360`** | **1406** | ★★ **`MAPID` 当前地图ID** | 引用点用两个格式串打印它:`TYPE\t\t: %d` 和 **`MAPID\t\t: %d`**;并与 `0x9c41`(40001) / `0xa029`(41001) 比较 → 地图ID判断 | | `0x0183C520` | 5460 | 全局单例管理器指针 | 被 735 个函数当 `ecx`(this) 用;写入点 `mov [0x183c520], edx` 在 `0x826BD6`;同区块有 NPC基址值 | | `0x0183C528` | 916 | 同上区块(兄弟字段) | 有写入点 `mov [0x183c528], 0` | | `0x0183C518` | 747 | 同上区块(兄弟字段) | 引用点伴 `Login Interface` / `interselect create` 字符串 | | `0x0183C510` | 374 | 同上区块(兄弟字段) | | | `0x018274C8` | 1018 | 对象指针(内含数组) | `mov eax,[0x18274c8]; cmp [edx+ecx*4+0x53c],0` → 结构内 `+0x53C` 有数组 | | `0x01861388` | 775 | 数值累加器 | `add edx,[0x1861388]` / `add ecx,[0x1861388]` 共 296 次 | | `0x03BF28C8` | 983 | ★ **人物区块,与 `人物基址值 0x3BF28CC` 差 4 字节** | 两者是一对(见第八节) | | `0x017F1818` | 934 | 对象指针 | 282 处集中在函数 `0xD53A20`(伴 `%I64d` 格式串) | | `0x03B9DCDC` | 458 | 背包区块字段 | 与 `背包基址值 0x3B9DCE0` 差 4 字节 | | `0x03970A20` | 270 | 血量区块字段(213 处 `cmp`) | 与 `当前血量值 0x3970A70` 同区块 | | `0x018219D0` | 396 | 对象指针 | 引用者伴 `ACA3000.mdl` / `NPC1::OM_RESTORE` / `BALLOON` 字符串 | | `0x03BBB490` | 268 | 索引/ID(有 `cmp ..., -1`) | | | `0x03B947E8` | 314 | 对象指针 | | | `0x01702B10` | 284 | 对象指针 | | | `0x03BA7C28` | 278 | **字节标志位** | 275 处 `movzx edx, byte ptr [0x3ba7c28]` → 布尔开关 | | `0x03BA7E48` | 154 | **数值字段(119 处 `imul ...,0x88`)** | 乘 0x88(=136) → 结构体步长 | ### 7.2 有意思的细节 - `0x03970A70`(你工程里的 `#当前血量值`):本口径下只有 **14** 处直接引用 —— 结构上「当前血」主要是从**人物对象 `+0x5F4`** 读的(见 `E2TXT常量基址对照表`),这个全局只是个镜像/缓存。 - `0x0182B5E8`(仓库邻居A):**277 处引用里有 244 处是写** —— 写入型的全局通常是「当前选中的对象指针」,符合「仓库当前项」的语义。 - `0x0182AEC4`:243 处引用里 **205 处是 `cmp`**,且和 `0x1844360`(MAPID) 一样在与 `0x9c41` 比较 → 同类「ID 判定」变量。 --- ## 八、已知基址的邻居字段族(±0x80) 同一个 4 字节块里相邻的全局,往往是**同一个对象/管理器的兄弟字段**。下面按区块列出「同区块活跃地址」(括号内为引用数,`/i` 表示索引寻址)。 | 基址 | 名称 | 同区块活跃地址 | 邻居明细 | |---|---|---|---| | `0x011E0084` | 地图基址值 | 7 | 11E0044(11) 11E0064(8/i1) 11E0080(52) 11E0090(1/i1) 11E0094(1/i1) 11E0098(1/i1) 11E00A8(1/i1) | | `0x017EF378` | 发包Call_ECX / NPC选项 | 12 | 17EF368(2) 17EF36C(8) 17EF370(1) 17EF380(6) 17EF384(5) 17EF390(273) 17EF39C(1) 17EF3A0(1) 17EF3A4(36) 17EF3D8(3) 17EF3DC(3) 17EF3F4(3) | | `0x0182A2DC` | 仓库基址值 | 0 | **(空 —— 见 8.2)** | | `0x03BC33BC` | 商店基址值 | 0 | **(空 —— 见 8.2)** | | `0x0182AEB0` | 仓库邻居B | 22 | 182AE90(3) 182AE94(4) 182AE98(13) 182AE9C(3) 182AE9D(6) 182AE9E(8) 182AEA0(10) 182AEA4(10) 182AEA8(16) 182AEAC(4) 182AEB8(7) 182AEBC(4) 182AEC4(243) 182AEC8(8) | | `0x0182B5E8` | 仓库邻居A | 10 | 182B5B8(1) 182B5BC(2) 182B5C0(6) 182B5C4(6) 182B5E0(1) 182B5EC(7) 182B5F4(6) 182B5F8(4) 182B5FC(6) 182B600(4) | | `0x0183C51C` | 选中对象基址 | 26 | 183C4D0(2) 183C4D4(3) 183C4D8(4) 183C4DC(11) 183C4E0(5) 183C4F0(2) 183C4F4(2) 183C4F8(6) 183C500(37) 183C504(11) 183C508(9) 183C50C(9) 183C510(374) 183C514(29) …另 12 个至 183C598 | | `0x0183C52C` | NPC基址值 / 助手链路头 | 27 | 同上区块(0x183C4D0~0x183C598,共 28 个活跃地址) | | `0x0184437C` | 副本道具基址 | 30 | 1844360(1406=MAPID) 1844364(24) 1844368(8) 184436C(1) 1844370(4) 1844374(2) 1844378(39) 1844380(8) 1844384(8) 1844388(8) 184438C(6/i6) 184439C(65) 18443A0(3) …至 18443F0 | | `0x03970A70` | 当前血量值 | 51 | 39709F0~3970AE4 共 52 个活跃地址,含 3970A20(270) 3970A24(187) 3970A25(117) 3970AD4(100) 3970AD8(92) 3970A9C(56) | | `0x03B9DCE0` | 背包基址值 / 背包列表 | 34 | 3B9DC88(16) 3B9DC8C(11/i11) 3B9DC94(22) 3B9DC95(6) 3B9DC96(19) 3B9DC97(7) 3B9DC98(11) 3B9DC9C(23) … 3B9DCDC(458) 3B9DCE4(38) 3B9DCE8(55) 3B9DCF0(40) 3B9DCF4(66) 3B9DCF8(144) 3B9DCFC(49) 3B9DD00(67) | | `0x03B9DCEC` | 凝神珠背包基址值 | 34 | 同上(与背包同区块,差 0xC) | | `0x03BA387C` | 状态栏基址值 / BUFF遍历 | 17 | 3BA3848(1) 3BA384C(45) 3BA3850(42) 3BA3854(13) 3BA3855(7) 3BA3856(4) 3BA3857(7) 3BA3858(4) 3BA3860(4) 3BA3864(3) 3BA3868(1/i1) 3BA3869(1/i1) 3BA3870(71) 3BA3874(3) 3BA3878(3) | | `0x03BA4A08` | 技能栏基址 | 10 | 3BA4A10(17) 3BA4A14(14) 3BA4A18(8) 3BA4A1C(1) 3BA4A34(8) 3BA4A38(1) 3BA4A50(6) 3BA4A54(1) 3BA4A6C(2) 3BA4A70(1) | | `0x03BA4C3C` | 状态列表基址 | 18 | 3BA4BCC(1) 3BA4BD0(2) 3BA4BEC(2) 3BA4C04(1) 3BA4C08(2) 3BA4C20(1) 3BA4C24(2) 3BA4C40(214) 3BA4C44(122) 3BA4C48(174) 3BA4C4C(14/i14) 3BA4C58(37) 3BA4C5C(171) 3BA4C60(113) | | `0x03BC21F8` | 商店邻居A | 21 | 3BC21D8(2) 3BC21DC(14) 3BC21E0(11) 3BC21E4(2) 3BC21E8(1) 3BC21EC(1) 3BC21F0(1) 3BC21F4(1) 3BC21F6(1) 3BC21FC(3) 3BC2200(3) 3BC2204(3) 3BC2208(3) … | | `0x03BE3E68` | 怪物基址值 | 31 | 3BE3DE8~3BE3E64 共 31 个(等间隔 4 字节,是数组的头部登记区) | | `0x03BF28CC` | 人物/坐标基址值 | 18 | 3BF28C8(**983**) 3BF28D8(14) 3BF28DC(5) 3BF28EC(2) 3BF28FC(1) 3BF2900(8) 3BF2908(33) 3BF290C(19) 3BF2910(26) 3BF2914(28) 3BF2918(19) 3BF291C(23) 3BF2920(20) 3BF2924(17) … | | `0x03BF2900` | 周围数量基址 | 18 | 同上区块(0x3BF28C8~0x3BF2938,人物与周围数据共用一块) | | `0x05BFEE78` | 周围列表基址 | 0 | (自身是纯索引数组基址,15 处 `[ecx*4+0x5bfee78]`;附近无其它活跃地址) | ### 8.1 三条最有价值的区块 **① `0x0183C500~0x0183C540`:全局管理器块(含 NPC基址值 与 助手链路头)** ``` 183C51C 选中对象基址 1941 183C520 ★未知(单例管理器) 5460 183C528 ★未知 916 183C52C NPC基址值/助手链路头 10793 ← 全 exe 引用最多 183C518 ★未知 747 183C510 ★未知 374 ``` 这是**整个客户端最热的一块内存**。助手窗口挂在 `[0x183C52C]+0x414`,说明 `0x183C52C` 指向的不是「NPC 数组」,而是一个**全局主控对象**;同排的 `0x183C520/518/528/510` 极可能是同族的其它管理器(各自被数百~数千个函数当 `this` 用)。 **② `0x03970A20~0x03970AD8`:血量/数值块** `当前血量值 0x3970A70` 其实是这个块里的一个字段。真正的热字段是 `3970A20(270)`、`3970A24(187)`、`3970A25(117)`、`3970AD4(100)`、`3970AD8(92)`。 其中 `3970A24/A25` 用的是 `movzx/movsx byte ptr` → **字节级标志/百分比**;`3970A1C` 有 25 处 `imul ...,0x7e` → **步长 0x7E 的表索引**。 **③ `0x03BA4C40~0x03BA4C60`:状态/攻击列表块** `状态列表基址 0x3BA4C3C(57)` 与 `攻击列表候选3 0x3BA4C40(214)` 相邻 4 字节;再往后 `3BA4C44(122) 3BA4C48(174) 3BA4C4C(14/i14) 3BA4C58(37) 3BA4C5C(171) 3BA4C60(113)` 都活跃。 **这一整排就是「列表管理器」的字段组** —— 攻击列表大概率就在其中,候选3 `0x3BA4C40` 仍是首选。 ### 8.2 ★ 两个「真死值」的确认 | 地址 | 名称 | 普通引用 | 索引引用 | ±0x80 内活跃地址 | 判定 | |---|---|---|---|---|---| | `0x0182A2DC` | 仓库基址值 | 0 | 0 | **0 个** | ★ **死值**(同区块一片空白,附近无任何活跃全局) | | `0x03BC33BC` | 商店基址值 | 0 | 0 | **0 个** | ★ **死值**(同上) | 这是比「0 引用」更强的判据:**不仅自己没人用,周围 ±0x80 一个被引用的地址都没有** → 说明这块 `.data` 区域整体废弃。 而它们的候选邻居:`0x0182B5E8`(277) / `0x0182AEB0`(76) / `0x03BC21F8`(88),**每个都带着一整个活跃区块**。 ### 8.3 顺带确认的一对 `人物基址值 0x03BF28CC`(3000) 与 **`0x03BF28C8`(983)** 只差 4 字节 —— 之前一直只知前者。同区块还有 `3BF2908~3BF2938` 一排活跃字段(周围数量/周围数据)。 也就是说 `0x3BF28C8` 很可能是**人物对象指针的「上一个/前一个」登记槽**(例如「当前/上一个目标」这对惯用结构),值得活体读一次确认。 --- ## 九、函数指针槽与索引表基址 ### 9.1 函数指针槽(被 `call/jmp [disp32]` 调用)Top 15 | 地址 | call/jmp 次数 | 节区 | 判定 | |---|---|---|---| | `0x0106F904` | 934 | .rdata | 延迟导入跳转槽 | | `0x0106F1C0` | 827 | .rdata | 同上 | | `0x011F423C` | 570 | .data | CRT 函数指针槽 | | `0x0106F318` | 293 | .rdata | 延迟导入 | | `0x0106F6E8` | 188 | .rdata | 同上 | | `0x0106F220` | 166 | .rdata | 同上 | | `0x011F4244` | 146 | .data | CRT | | `0x0106F6E0` | 144 | .rdata | 延迟导入 | | `0x0076C080` | — | .text | ★ **你的发包入口**(`call [0x76c080]`,静态从 NPC选项CALL 特征推出、与工程常量同址) | > 结论:**除了 `0x76C080` 这个发包入口,其余全是 CRT 基础设施**,不是游戏功能。 ### 9.2 索引寻址基址 Top 15(`[reg*scale + disp32]`) | 基址 | 索引访问 | 已知名 | 用法样本 | |---|---|---|---| | `0x03BE3E68` | **1942** | 怪物基址值 | `mov ecx, [eax*4+0x3be3e68]` —— **100% 索引形态,证明它就是「全局对象数组基址」** | | `0x01070030` | 915 | ★未知 | `addsd xmm0, qword ptr [ecx*8+0x1070030]` → 双精度常量表 | | `0x03BA6528` | 369 | ★未知 | `cmp dword ptr [edx*4+0x3ba6528], 0` → 状态/列表判定表 | | `0x05C17380` | 173 | ★未知 | `mov ecx, [ecx*4+0x5c17380]` | | `0x01841DB0` | 94 | ★未知 | `cmp dword ptr [eax*4+0x1841db0], 0` | | `0x03BA652C` | 54 | ★未知 | 与上表相邻 | | `0x0183CC58` | 38 | ★未知 | `mov eax, [edx*4+0x183cc58]` | | `0x039742D8` | 36 | ★未知 | `movzx eax, word ptr [edx*4+0x39742d8]` → **16 位表** | | `0x03970D98` | 31 | ★未知 | `mov [ecx*4+0x3970d98], edx` → 写入型数组 | | `0x05BFEE78` | 15 | 周围列表基址 | `mov [ecx*4+0x5bfee78], edx` | > ★ 注意 `0x0397xxxx` 这一片出现大量索引基址(`3970ae6/3970b30/3970c60/3970cf8/3970d98/3970f40/39742d8/39741b8/39741bc/3974678/39747a8/3977d04`) > —— 说明**人物/角色数据的表结构集中在 `0x0397xxxx` 段**,这是下一步挖字段的好去处。 --- ## 十、可用性判定与行动建议 ### 10.1 可以直接拿来当基址的(游戏区 · 高引用 · 有写入点) | 地址 | 引用 | 建议名字 | 用途推测 | |---|---|---|---| | `0x01844360` | 1406 | **MAPID / 当前地图ID** | 地图判断(读书/进图/挂机路线) | | `0x0183C520` | 5460 | 全局主控/管理器 | 单例,被 735 个函数当 this | | `0x0183C518` | 747 | 登录/界面状态 | 伴 `Login Interface` 串 | | `0x018274C8` | 1018 | 背包相关对象 | 结构内 `+0x53C` 有数组 | | `0x03BF28C8` | 983 | 人物区块(与人物基址值配对) | 待活体确认 | | `0x03B9DCDC` | 458 | 背包区块字段 | 背包基址值 -4 | | `0x03970A20` | 270 | 血量/数值标志 | 213 处 `cmp` | | `0x03BA7C28` | 278 | 布尔开关(字节) | `movzx byte` | ### 10.2 绝对不要当基址的 ``` 0x011F4380 __security_cookie(GS 栈保护)—— 引用数最高但是 CRT 的 0x011F4238 / 23C / 244 / 248 CRT 函数指针槽 0x0106Fxxx 全段 延迟导入跳转槽(.rdata 起始) 0x05C0xxxx / 0x5C16xxxx 第三方库(WebView2/CRT)全局状态 ``` ### 10.3 两条明确的改法 1. **仓库/商店**:`0x0182A2DC` / `0x03BC33BC` 已双重确认死值(自身 0 引用 + 周围 0 活跃地址)→ 换 `0x0182B5E8` / `0x03BC21F8`。 2. **攻击列表**:用 `0x03BA4C40`(214 引用,且整排 `3BA4C44~3BA4C60` 都活跃)。 ### 10.4 下一步(按性价比) | # | 事项 | 为什么 | |---|---|---| | 1 | 活体验证 §5.3 的**通用调用范式** | 若成立,等于一次拿到 200+ 个窗口的操作入口 | | 2 | 挖 `0x0183C520` 的对象结构 | 5460 引用、735 个函数用它 → 大概率是「游戏主控」,能派生出大量字段 | | 3 | 挖 `0x0397xxxx` 的表结构 | 十多个索引基址集中在这里,是人物/属性数据的表区 | | 4 | 活体确认 `0x03BF28C8` vs `0x03BF28CC` | 一对 4 字节邻居,关系明确后能加一个可用基址 | --- ## 十一、脚本与原始输出 | 脚本 | 作用 | 原始输出 | |---|---|---| | `scan_all_globals.py` | 第 2 代字节扫描(含 SIB),用于对比 | `_g_scan.txt` `_g_data.txt` `_g_vt.txt` | | **`scan_all_globals2.py`** | **第 3 代 capstone 权威扫描** | `_g2_scan.txt` `_g2_data.txt` `_g2_hits.txt` `_g2_vt.txt` | | `analyze_stage2.py` | RTTI 虚表映射 + 邻居 + 引用函数归属 | `_g3_rtti.txt` `_g3_vtgame.tsv` | | `analyze_inter.py` | Inter* 类虚表结构 / 槽位指纹 / 构造点 | `_g4_inter.txt` `_g4_inter.tsv` | | `verify_vptr.py` | 定点核对 vptr 立即数(修正旧结论) | `_g5_verify.txt` | | `verify_slot1.py` | 各类槽1 形态对比 | `_g6_slot1.txt` | | `ctx_disasm.py` | 未知地址的上下文反汇编 | `_g7_ctx.txt` | | `read_strs.py` | 读关键点的字符串/格式串 | `_g8_str.txt` | | `merge_forms.py` | 合并普通/索引两种形态重算 | `_g9_merged.txt` | | `probe_rtti.py` | RTTI 探针 | `_rtti_probe.txt` | --- *配套:《基址全量复验报告》(70 项逐一验证)·《E2TXT常量基址对照表》·《基址使用对比清单》·《基址活体验证清单》* *分析对象:`D:\rxjh2025\client\YGOnline.exe` · 本次全部引用数均为 capstone 逐指令口径*