# 热血江湖 rxjh2025(YGOnline.exe)机制分析报告 > 整合来源: > - 桌面 `C:\Users\Administrator\Desktop\国服19.0的一些call分析\` 下 **25 个找 call 方法文件**(特征字节 + 汇编 + 基址) > - `D:\rxjh2025\client\YGOnline.exe` 的 **静态 PE 画像**(实测) > - 用户贴出的 **rxjh2025 运行时 dump 数据**(打开/关闭 NPC 功能 call、玩家对象公式、功能编号表) > > 用途:仅作逆向分析参考,非外挂/作弊用途。**游戏本身不可开挂,须以原始状态加载 OD,照视频一步一步来**(用户原话)。 --- ## 0. TL;DR(结论先行) 1. **YGOnline.exe 受保护**(目录含 `XIGNCODE\xm.exe`)。静态扫描 25 个方法文件里的 **31 个特征字节 → 0 命中**,12 个关键全局基址的 4 字节 LE 在文件中 **出现 0 次**,`.text` 熵 **6.427**(接近 8,属强混淆/虚拟化)。→ **所有 call 现场仅存在于运行时,静态无法直接定位。** 2. **好消息:数据段全局基址布局与国服 19.0 完全一致,且 ASLR 已关闭**(DllCharacteristics=0x8100,无 0x40 位)。因此 **`0x2E…/0x11A…/0x1267B54` 这些"数据全局基址"是绝对稳定地址,可直接复用**,无需按模块加载基址重算。 3. **结论性方法**:在 YGOnline.exe 进程内用 OD 运行时,以"全局数据基址"为锚点反查引用点,再追踪到 `E8` call 目标,即可定位各机制 call。这正是用户"原始状态加载 OD、照视频跟"的做法。 4. **已实证的 2025 代码 call**(可直接用,绝对地址): - 打开 NPC 功能:`007E4F50`(thiscall,ecx=玩家对象,push 功能编号/1/0) - 关闭 NPC 对话:`004FD750`(thiscall,ecx=[0x2E5AC64]) 5. **19.0 方法库里的代码 call 地址(00859F50、00731BA0、0055B8D0…)属于另一构建,2025 中地址不同**,但调用约定/参数结构/ecx 来源可照搬,定位时按第 6 节流程在 2025 里重找。 --- ## 1. 方法论:为什么不能静态扫、怎么动态找 ### 1.1 为什么静态扫描失败 `YGOnline.exe` 不是普通编译产物。静态文件里: - 没有任何 19.0 方法文件描述的 call 现场字节(31 个特征全 0 命中); - 连全局基址的 4 字节值都不在文件里出现(被运行时重定位/填充); - 代码段熵 6.427,远超正常编译代码(~5.0–5.3),说明指令被虚拟化/混淆。 → 用 `find_signature` 在文件里搜 call,必然空手而归。这是**预期结果**,不是漏扫。 ### 1.2 正确的定位路径(运行时锚定法) 数据全局基址(如 `0x1267B54`、`0x2E79C3C`)是**真实存在于进程内存**的稳定地址。它们由引擎在运行时写入,且因 ASLR 关闭而**绝对不变**。定位 call 的标准套路: ``` ① 进程内用 OD 搜索全局基址的引用特征,例如: 玩家根 0x1267B54 -> mov eax, dword ptr ds:[0x1267B54] = A1 54 7B 26 01 角色基 0x2E79C3C -> mov ecx, dword ptr ds:[0x2E79C3C] = 8B 0D 3C 9C E7 02 ② 在该引用点附近找 thiscall 调用骨架(ecx 赋值 + push 参数 + E8 xx) ③ 下断点 / 单步,确认参数与效果,即得目标 call 的绝对地址 ``` 这正是用户"原始状态加载 OD,照着视频一步一步来"的本质:**用数据基址做锚,运行时挖 call**。 --- ## 2. YGOnline.exe 静态 PE 画像(实测证据) | 项目 | 值 | 含义 | |---|---|---| | 文件大小 | 14.1 MB | — | | Machine | 0x14C | i386(32 位) | | ImageBase | **0x400000** | 固定加载基址 | | DllCharacteristics | **0x8100** | 无 0x40(DYNAMIC_BASE) → **ASLR 关闭,绝对地址稳定** | | SectionAlignment | 0x1000 | 标准 | | FileAlignment | 0x200 | 标准 | | Subsystem | 2 | GUI | | AddressOfEntryPoint | 0xB98926(VA 0xF98926) | 入口 | | 节表 | `.text`/`.rdata`/`.data`/`.fptable`/`.rsrc` | 5 节 | | 镜像上界 | ~0x5C2D400(≈92 MB) | — | | `.text` 熵 | **6.427** | 强混淆/虚拟化信号 | | XIGNCODE | 目录含 `XIGNCODE\xm.exe` | 反调试/反篡改保护 | **节表(VirtualAddr / VirtualSize / RawOffset / RawSize):** ``` .text 0x1000 0xC6D5B1 0x400 0xC6D600 代码(受保护) .rdata 0xC6F000 0x170356 0xC6DA00 0x170400 .data 0xDE0000 0x4A377A8 0xDDDE00 0x1F800 全局指针/基址都在这 .fptable 0x5818000 0x80 0xDFD600 0x200 .rsrc 0x5819000 0x14320 0xDFD800 0x14400 ``` > 核对:所有 `0x1267B54 / 0x2E51409 / 0x2E5AC64 / 0x11A91C0` 等基址都落在镜像范围内(in-image),是合法模块内地址。 **保护证据(脚本实测):** ``` 字节签名静态命中:提取 31 个特征,命中 0 处 12 个关键全局地址 4字节LE 在文件出现次数:全部 0 次 .text 熵 = 6.427 ``` > 注:特征扫描/熵计算脚本见附录 B(`scan_sigs.py`、`verify_pe.py`、`verify_hdr.py`),可直接复跑。 --- ## 3. 稳定数据全局基址总表(19.0 ↔ 2025 共用) > 以下全部为**绝对地址**(因 ASLR 关闭)。`偏移` = 地址 − 0x400000,便于在 OD 里按 `YGOnline.exe+偏移` 跳转。 | 绝对地址 | 偏移 | 含义 | 备注 | |---|---|---|---| | `0x1267B54` | +0xE67B54 | **玩家/角色管理器根**(4 级指针起点) | 跨版本稳定锚点 | | `0x2E79C3C` | +0x2A79C3C | 角色对象基址(实体管理器) | 选中下标 [+0x1A64] | | `0x2E79C40` | +0x2A79C40 | 总对象数组(NPC/怪物/玩家) | `数组[下标]`=对象指针 | | `0x2E51409` | +0x2A51409 | "是否在 NPC 对话中"标志(byte,1=对话中) | 开功能前先判它 | | `0x2E51410` | +0x2A51410 | 主装备栏基址 | 偏移同背包 | | `0x2E51414` | +0x2A51414 | **背包基址** | `dd [基址]+0x43C+4*下标` | | `0x2E5AB3C` | +0x2A5AB3C | 个人仓库基址 | 偏移同背包 | | `0x2E5AC64` | +0x2A5AC64 | 关闭对话 call 所用对象指针 | `[它]`=对话/UI 管理对象 | | `0x2E51D88` | +0x2A51D88 | 动作窗口对象基址 | 动作使用 call 参数来源 | | `0x2E52F38` | +0x2A52F38 | 快捷栏基址 | `dd [基址]+0x43C+4*下标` | | `0x2E530CC` | +0x2A530CC | 技能列表基址 | 另一技能数组 `0x2E530D0`(+0x38C/+0x40C) | | `0x2E53970` | +0x2A53970 | 人物选择界面基址 / 当前选中角色序号 | 数组 0x138 起步,4 槽 | | `0x11A91C0` | +0xDA91C0 | 发包参数对象(Base_SendDataParam) | 断线标志 `[+0x30]` | | `0x11A9148` | +0xDA9148 | 游戏窗口句柄 HWND | — | | `0xAB2EB4` | +0x6B2EB4 | 怪物视距(float,默认 250) | 无限视野改这里 | | `0xAC9E38` | +0x6C9E38 | 另一视距(float) | 特定场景用 | | `0x2C2BDD0` | +0x282BDD0 | 人物属性基址(19.0,名字/等级/攻防…) | 2025 需运行时核对 | | `0x4294DB8` | +0x394DB8 | 周围对象/走路状态区 | `[+0x1A88]` 走路状态 | **玩家对象(功能 call 的 ecx)公式(2025 实测,4 级):** ``` 玩家对象 = dd [[[[0x1267B54] + 0x2FC] + 0x344] + 0x4] ``` 实测算例:`0F927EF8 = dd [[[[0x1267B54]+0x2FC]+0x344]+0x4]` **通用物品/容器对象偏移(背包、仓库、装备栏通用):** ``` +0x08 类型(0x1A=物品) +0x64 物品名 +0xF9 物品描述 +0x1FC 在背包/仓库中的下标(2 字节) +0x238 属性描述(石头) +0x438/+0x638/+0x838/+0xa38 装备合成属性 1~4 +0xC4C 物品数量 +0xD44 强化等级 ``` --- ## 4. 各机制 call 模板与调用约定 > 标记说明: > - **【2025 实测】** = 已在 rxjh2025 运行时 dump 确认,绝对地址直接用。 > - **【19.0 模板】** = 来自 19.0 方法库;**代码地址在 2025 不同**,但调用约定可照搬,按第 6 节在 2025 里重定位。 ### 4.1 玩家 / 角色对象 - 角色对象基址 `0x2E79C3C`;总对象数组 `0x2E79C40`。 - 选中怪物下标:`[0x2E79C3C]+0x1A64`(0xFFFF=未选中)。 - 实时坐标:`[0x2E79C3C]+0x1A6C`(X) / `+0x1A74`(Y)(走路目的地);`+0x1CA0`(X) `+0x1CA4`(Z) `+0x1CA8`(Y)(实时)。 - 选中状态:`[0x2E79C3C]+0x342C`(选中自己=1)。 ### 4.2 选怪 / 选中(thiscall,虚表) ``` ; 选中(ecx=对象, 经虚表 [obj]+0x4) mov ecx, dword ptr ds:[eax*4 + 0x2E79C40] ; 取对象 mov edx, dword ptr ds:[ecx] mov eax, dword ptr ds:[edx + 0x4] push 0 push 1 ; 1=选中 / 0=取消 push 0x450 call eax ; == [obj]+0x4 虚调用 ; 写回选中下标 mov edi, [0x2E79C3C] mov [edi + 0x1A64], eax ``` 特征(19.0):`8B06 8B50 04 6A 01 68 50 04 00 00 8BCE FFD2 8B46 0C`(虚表选中)。 ### 4.3 背包 / 物品使用(thiscall) ``` 背包基址 = 0x2E51414 物品对象 = dd [0x2E51414] + 0x43C + 4*下标 (下标 0~35) ; 吃药/用物品 call(【19.0 模板】 00848AB0) push 0 ; 背包格数 push 1 push 0 mov ecx, <背包对象> ; 如 1FA17500 call 00848AB0 ``` ### 4.4 仓库存取(thiscall,同"物品移动 call") ``` ; 存仓(【19.0 模板】 00859F50,与放技能到快捷栏同一 call) push 1 ; 仓库下标(或背包下标) push 8 ; 8=存入;1=取出/移动 push 0 ; 固定 mov ecx, <容器对象> ; 仓库=0x2E5AB3C 取值 / 背包=0x2E51414 取值 call 00859F50 ; 取物 / 移动背包内物品 push 2 push 1 push 0 mov ecx, <背包对象> call 00859F50 ``` 个人仓库基址 `dd [0x2E5AB3C]+0x43C+4*0`(另有 `0x2E7BA40` 变体)。偏移同背包。 ### 4.5 装备更换(thiscall,属于"移动物品"族) ``` 主装备基址 = 0x2E51410 主装备下标:0 衣 1 左护 2 右护 3 武器 4 鞋 5 内甲 6 项链 7 左耳 8 右耳 9 左戒 A 右戒 B 披风 C 箭 D 门甲 E 宠 F 灵宠 ; 自动穿装备(ecx=主装备对象, push 1/分类编号/背包下标) mov edi, dword ptr ds:[0x2E51410] mov ecx, dword ptr ds:[edi + 0x1634] mov edx, dword ptr ds:[edi + 0x1C60] push 1 push ecx push edx mov ecx, edi call 00859F50 ; 脱装备:把 push 1 改成 push 2(背包空位下标) ``` 特征(19.0):`89 90 ?? ?? ?? ?? 0F B7 07 3B 05 ?? ?? ?? ?? 75 ?? A1 10 14 E5 02`(装备栏遍历)。 ### 4.6 快捷栏(thiscall) ``` 快捷栏基址 = 0x2E52F38 ; 使用快捷栏(【19.0 模板】 00731BA0,ecx = [0x1267B54]+0x29C) ; 鼠标右击: mov eax, [0x1267B54] mov ecx, [eax + 0x29C] push 6 ; 快捷栏下标 mov ecx, eax_29C ; ecx=[0x1267B54]+0x29C call 00731BA0 ; 键盘按键(同一 call): mov esi, [0x1267B54] mov esi, [esi + 0x29C] push 2 ; 下标 mov ecx, esi call 00731BA0 ``` 特征(19.0):键盘 `77 ?? 84 C9 75 ?? 8D 47 08 50 8B CE E8 ?? ?? ?? ??`(快捷栏按键 call)。 ### 4.7 技能列表 / 修炼技能(thiscall) ``` 技能列表基址 = 0x2E530CC 技能对象 = dd [0x2E530CC] + 0x43C + 4*下标 (另一数组 +0x40C) ; 修炼技能(【19.0 模板】 0055B8D0) mov edi, [0x2E530CC] mov edx, [edi + 0x444] ; 技能对象 mov ecx, dword ptr ds:[0x2C2BE7C] mov eax, dword ptr ds:[edx + 0x54] push ecx push eax sub esp, 0x150 lea ecx, [esp] ; 数据缓冲 push ecx mov ecx, dword ptr ds:[0x2E79C3C] call 0055B8D0 add esp, 0x150 ; 修炼技能3(虚表 [obj]+0x4,push 0/0xE/0x3F4) mov ecx, <技能对象> mov edx, [ecx] mov edx, dword ptr ds:[edx + 0x4] push 0 push 0x0E push 0x3F4 call edx ``` 特征(19.0):`8B 0D ?? ?? ?? ?? 8B 42 ?? 51 50 8D 8D ?? ?? ?? ?? 51 8B 0D 3C 9C E7 02`(修炼技能2 段)。 ### 4.8 NPC 功能 / 对话 【2025 实测】 ``` ================================================== 打开 NPC 功能 call:007E4F50 (thiscall) ★可直接用 ================================================== ; ecx = 玩家对象 = dd [[[[0x1267B54]+0x2FC]+0x344]+0x4] ; 参数:push 功能编号 / push 1 / push 0 push <功能编号> ; 见下方功能编号表(如 3=买卖, 5=仓库) push 1 push 0 mov ecx, <玩家对象> call 007E4F50 ; OD 现场特征(2025): ; 81 FB ?? ?? ?? ?? 0F 8D ?? ?? ?? ?? 53 8B CE // 0x10 长度特征 ; 007EBAA1 push ebx(功能编号) ; 007EBAA2 mov ecx, esi(=玩家对象 0F927EF8) ; 007EBAA4 call 007E4F50 ; 用户自身运行时测试(通过): mov esi, [0x1267B54] mov esi, [esi + 0x2FC] mov esi, [esi + 0x344] mov esi, [esi + 0x4] push 5 ; 5=打开仓库 mov ecx, esi call 007E4F50 ================================================== 关闭 NPC 对话 call:004FD750 (thiscall) ★可直接用 ================================================== ; 先用 0x2E51409 字节判断是否对话中(==1),再关 mov ecx, dword ptr ds:[0x2E5AC64] push 0x0 call 004FD750 ; OD 现场(2025): ; 007E4E7B 8B 0D 64 AC E5 02 mov ecx, [0x2E5AC64] ; 007E4EAD E8 9E 88 D1 FF call 004FD750 ; 注:完整关闭流程里还 push 0x1E 并准备 edx=00900000 结构(运行时堆对象, ; 非模块基址,不可固化)。极简调用即上三行即可触发关闭。 ; 相邻 call 0077B140(ecx=[0x11A91C0])经判定"不是关闭本体",勿用。 ``` **【功能编号对照表】(打开 NPC 功能 call 的 push 值)** ``` 3 打开买卖 4 确认任务/领赏 5 打开仓库 6 装备合成 8 装备强化 E 再造合成石 11 冰宫移动回泫勃派 13 赋予属性 14 装备加锁/解锁 1B 兽灵丹 1C 灵兽仓库 26 移动至北海冰宫 2D 移动至伏魔洞 31 伏魔洞1层 34 北海冰宫幻影 35 幻影回冰宫 7B 武器组合 7C 防具组合 8F 道具组合 90 道具分解 96 移动至虎峡谷 98 删除制作技术 A3 恢复精力 B0 全部修理 B1 单件修理 B3 披风强化 B4 披风分解 B5 披风组合 BF 装备升级 C0 韩飞官转职地图 C7 查看荣誉奖励 C9 谭花灵转职地图 CA 修炼之地 D1 强化物品 D2 活动地图(遗忘村庄) DA 东陵防御战 DE 东陵奖励 E2 梅柳真转职地图 EA 卢风郎转职地图 EF 灵宠强化 F0 灵宠进化 F1 灵宠窝 13E 东陵神女转职地图 ``` ### 4.9 购买 / 出售(买卖 call,【19.0 模板】通用发包 004FD750) ``` ; 买卖指令 0x880092,经 Base_SendDataParam(0x11A91C0) 调 004FD750 sub esp, 0xA0 mov eax, esp mov dword ptr [eax+2], 0x880092 ; 指令 mov dword ptr [eax+6], 1 ; 1=购买 / 2=出售 mov dword ptr [eax+0xE], 0x3B9ACA65 ; 物品类型(+0x5C) mov dword ptr [eax+0x16], 2 ; 数量(2字节) push 0x8E push eax mov ecx, dword ptr ds:[0x11A91C0] ; 发包参数对象 call 004FD750 add esp, 0xA0 ``` > 注:`call 004FD750` 在 2025 中**已实证为"关闭 NPC 对话"call**,但它在 19.0 里同时也是通用发包 call。2025 中买卖/发包很可能有独立 call 或同一入口不同参数;此模板仅作结构参考,**须在 2025 运行时按 0x11A91C0 锚点重定位实际发包 call**。 ### 4.10 动作窗口(thiscall) ``` 动作窗口基址 = 0x2E51D88 动作对象 = dd [0x2E51D88] + 0x43C + 4*下标 ; 动作使用(【19.0 模板】 00722990,ecx = [0x1267B54]+0x29C) mov esi, 2 ; 动作窗口下标 mov edi, [0x2E51D88] mov eax, [edi + esi*4 + 0x43C] mov ecx, [eax + 0x54] ; 动作分类 ID mov edx, [0x1267B54] push ecx mov ecx, [edx + 0x29C] call 00722990 ``` 特征(19.0):`8B 15 54 7B 26 01 51 8B 8A 9C 02 00 00 E8 ?? ?? ?? ??`(动作 call 段)。 ### 4.11 寻路 / 走路(thiscall,虚表) ``` 寻路坐标:dd [[0x1267B54] + 0x2C0] + 0x23C (X) / +0x240 (Y) 寻路状态:dd [[0x1267B54] + 0x2C0] + 0x230 (1字节) 走路状态: [0x4294DB8] + 0x1A88 ; 寻路 call(【19.0 模板】,ecx=0x2E79C3C 经虚表 [ecx]+0x4) sub esp, 0x34 mov eax, esp ; ... 填 0x34 字节坐标缓冲(目的地 X/Y 浮点,0xFFFF 标记)... push 0x54 push eax push 0x3EF mov ecx, dword ptr ds:[0x2E79C3C] mov edx, dword ptr ds:[ecx] mov edx, dword ptr ds:[edx + 0x4] call edx ; == [0x2E79C3C 对象]+0x4 虚调用 add esp, 0x34 ``` 特征(19.0):`0F AF C8 89 4D 80 8B 0D 3C 9C E7 02 8D 45 84 50 68 EF 03 00 00`(寻路 call 段)。 ### 4.12 断线标志(数据,非 call) ``` 断线标志 = dd [0x11A91C0] + 0x30 正常值 0x00000B08;断线 = 0xFFFFFFFF(-1) ``` 即"发包参数对象 +0x30"。读它即可判是否掉线。 ### 4.13 窗体句柄(数据,非 call) ``` 游戏窗口 HWND = dd [0x11A9148] ``` OD 写入点特征:`89 3D 48 91 1A 01`(mov [0x11A9148], edi,建窗时)。 ### 4.14 人物选择(数据 + 写 call) ``` 当前选中角色序号 = dd [0x2E53970] (0~3) 角色数组起点 = 0x2E53970 + 0x138,每槽 +0x84 槽0 +0x138 / 槽1 +0x1BC / 槽2 +0x240 / 槽3 +0x2C4 ; 选择第二个人物:写 [0x2E53970] = 1 内存_写整数型(进程, "0x02E53970", 1) ``` OD 写入特征(19.0):`8B 3D 70 39 E5 02 8D 14 49 89 0D 70 39 E5 02`(选中角色序号写回)。 ### 4.15 无限视野(视距,数据 + 关键 call) ``` 怪物视距(float,默认 250)= dd [0xAB2EB4] 另一视距 = dd [0xAC9E38] ; 关键 call(【19.0 模板】 008C4710):视距判定就在里面 008C4731 fld dword ptr ds:[0xAB2EB4] ; 怪物视距 008C4738 fld dword ptr ds:[0xAC9E38] ; 另一视距 ; 把 0xAB2EB4 处 float 改大(如 1000.0)即无限视野 ``` 特征:`D9 05 B4 2E AB 00`(fld [0xAB2EB4],视距读取点)。 ### 4.16 周围对象 / 怪物 ``` 总对象数组 = 0x2E79C40 (dd [0x2E79C40 + 4*下标] = 对象指针) 对象类型 = [对象] + 0x2E (如 NPC/怪物类型判定) 对象名字 = [对象] + 0x360 走路状态区 = [0x4294DB8] + 0x1A88 ``` NPC 对象(19.0 打开对话框用):`NPC_OBJ = dd [0x2E79C40 + 4*([0x2E79C3C]+0x1A64)]`。 > 2025 的"打开 NPC 对话框(显 UI)"底层 call 在用户提供数据里未给出;用 4.8 的 `007E4F50` 按功能编号直接开对应功能窗即可,无需先显 UI。 --- ## 5. 在 YGOnline.exe 运行时定位每个 call 的标准流程 > 适用于所有标记为【19.0 模板】的 call(代码地址需在 2025 重找)。 1. **原始状态加载 OD** 到 `YGOnline.exe` 进程(不修改、不加任何插件,符合用户要求)。 2. **确定锚点全局基址**(见第 3 节),例如找背包 call 用 `0x2E51414`,找玩家相关 call 用 `0x1267B54`。 3. **在 OD 二进制搜索该基址的引用特征**,例如 `A1 54 7B 26 01`(mov eax,[0x1267B54])或 `8B 0D 14 14 E5 02`(mov edi,[0x2E51414])。 4. **在引用点附近回溯/下断**,找 thiscall 骨架:`mov ecx,<基址取值>` → `push 参数`×N → `E8 ?? ?? ?? ??`。 5. **记下 `E8` 相对 call 的目标 VA**(OD 直接显示绝对地址,因 ASLR 关闭它永久有效)。 6. **单步/运行验证**参数与效果,确认即归档为该 call 的 2025 地址。 7. 写入本报告的"2025 实测"列(后续迭代更新此文档)。 > 因静态 0 命中,**不要**试图用 19.0 的代码地址直接跳;务必运行时锚定。 --- ## 6. 与国服 19.0 的差异提示 | 维度 | 国服 19.0(Client.exe) | rxjh2025(YGOnline.exe) | |---|---|---| | 主模块名 | Client.exe | YGOnline.exe(OD 标 "Client." 只是通用标签) | | 数据全局基址 | `0x2E…/0x11A…/0x1267B54` | **完全相同**(布局一致) | | ASLR | 关闭 | 关闭(绝对地址稳定) | | 代码 call 地址 | 00859F50 / 00731BA0 / 0055B8D0 … | **不同**,需运行时重定 | | 打开 NPC 对话框(显UI) call | `00512150`(ecx=NPC对象, 0x401/0/0) | 未给底层 call;用 `007E4F50`+功能编号代替 | | 打开 NPC 功能 | 同上 | `007E4F50`(ecx=玩家对象)【实测】 | | 关闭 NPC 对话 | — | `004FD750`(ecx=[0x2E5AC64])【实测】 | | 玩家对象公式 | `[[[0x1267B54]+0x2FC]+0x344]+0x4`(旧记 3 级) | `[[[[0x1267B54]+0x2FC]+0x344]+0x4]`(4 级,实测) | | 保护 | 普通编译 | **受保护**(XIGNCODE,静态 0 命中) | > 两版本**玩家根 0x1267B54 一致**,是跨版本最稳锚点。 --- ## 7. 风险提示与合规声明 - 本报告所有地址/call 仅用于**学习逆向分析与协议理解**。热血江湖官方禁止第三方内存修改/外挂;**游戏本身不可开挂**,请仅以原始状态加载 OD、照视频逐步跟练,勿用于制作或运行作弊工具。 - `00900000` 这类运行时堆对象**不是模块基址**,不可固化进脚本。 - XIGNCODE 会检测调试器,运行时分析需自行评估风险。 --- ## 附录 A:25 个方法文件清单(桌面 `国服19.0的一些call分析\`) ``` 热血江湖基址.txt 人物属性/角色基址/物品使用/吃药call 打开NPC对话框中的功能分析.txt ★ 2025 打开/关闭 NPC 功能 call + 功能编号表 选怪分析.txt 选中/取消选中(虚表 [obj]+0x4) 背包分析.txt 背包基址 + 吃药call + 特征 存仓库call分析.txt 存仓/取物/移动(00859F50) 取仓库物品分析.txt 仓库取物 存仓,存N个物品分析.txt 批量存仓 商店列表分析.txt 商店列表 购买物品call分析.txt 买卖指令 0x880092 + 发包结构 技能列表分析.txt 技能列表基址 + 修炼技能 call 修炼技能call分析.txt 0055B8D0 / 虚表修炼 快捷栏分析于使用技能.txt 00731BA0 快捷栏使用/按键 放置技能至快捷栏分析.txt 放技能到快捷栏(同 00859F50) 动作窗口.txt 动作窗口基址 + 00722990 装备更换分析.txt 穿/脱装备(00859F50) 无限视野+人物怪物隐藏分析.txt 视距 0xAB2EB4 + 008C4710 断线标志分析.txt 断线标志 [0x11A91C0]+0x30 游戏窗口句柄基址.txt HWND 0x11A9148 人物选择界面分析.txt 0x2E53970 选人 怪物分析.txt 总对象数组/类型 任务分析.txt 任务 登录界面分析.txt 登录界面 NPC对话call分析总结.txt 19.0 NPC 对话 call 整理(00512150 可用 / 007E7DC0 废弃) NPC对话分析.txt 19.0 NPC 对话草稿 ``` ## 附录 B:扫描/校验脚本(位于 `D:\AI空间\rxjh\分析报告汇总\04_助手模块逆向\`) | 脚本 | 作用 | |---|---| | `scan_sigs.py` | 从 25 文件抽取特征字节 → 对 YGOnline.exe 做文件偏移→VA 匹配 + 锚定式全局引用扫描 | | `verify_pe.py` | PE 头关键字段(ImageBase/DllCharacteristics/节表)、.text 熵、全局地址出现次数 | | `verify_hdr.py` | 精确读取 PE 头(确认 ASLR 关闭、ImageBase=0x400000) | 实测结论(复跑可验证):**31 特征 → 0 命中;12 全局地址 → 0 出现;.text 熵 6.427;ASLR 关闭。** --- *生成日期:2026-09-22 | 分析对象:D:\rxjh2025\client\YGOnline.exe | 仅作逆向学习参考*