分析时间:2026-09-16 15:47
目标进程:YGOnline.exe(PID 14064,32 位)
模块基址:0x00400000,模块大小 92,463,104 字节(约 88.2 MB)
游戏目录:D:\rxjh2025\client\
| 项 | 值 |
|---|---|
| 十进制 | 62799464 |
| 十六进制 | 0x03BE3E68 |
| 所属模块 | YGOnline.exe(模块范围 0x00400000 ~ 0x05C28A00) |
| 模块内偏移 | YGOnline.exe + 0x37E3E68 |
结论:它是主模块 .data 里的静态地址,每次启动游戏都在同一位置,不需要做指针扫描,也不会随重登改变。
数组基址 = 0x03BE3E68
槽位 k 的地址 = 0x03BE3E68 + k * 4 ← 每个槽位 4 字节,存对象指针
对象 (obj) 结构 :
+0x08 = 对象类型 0x31=人物 0x18=物品 0x20=? 0x22=怪物
+0x0C = 对象ID
+0x18 = 名字(BIG5 编码,内联字符串)
你工程里的写法 (8000 + i) * 4 + 62799464 等价于 槽位号 k = 8000 + i,即你的扫描是从下标 8001 开始的。
实测当前在线的 34 个人物,34/34 全部满足 对象.0xC == 槽位号 k:
slot k= 9157 obj=674B8008 +C=9157 沒有男朋友
slot k= 9278 obj=6BA6E030 +C=9278 嬌小小
slot k= 9346 obj=68A10F48 +C=9346 小春
slot k= 9423 obj=68B14A88 +C=9423 一至尊一美美一 ← 你的测试角色
slot k= 9426 obj=70C664B0 +C=9426 一至尊霸王花一 ← 你的测试角色
...
也就是说:对象的 +0xC 字段 = 它在数组里的下标 = 游戏内部使用的对象ID。
你代码里的 取玩家索引 返回 i,那么 对象ID = i + 8000,而 +0xC 读出来的就是这个值,两者等价。
| 槽位/ID | 名字 | 槽位/ID | 名字 |
|---|---|---|---|
| 9157 | 沒有男朋友 | 9439 | 紫小妮 |
| 9278 | 嬌小小 | 9444 | 蝶皇 |
| 9281 | 天逆槍 | 9449 | 紫湘璦妮 |
| 9284 | 蝶霏 | 9453 | 瑀晨 |
| 9289 | 一橘色一 | 9456 | 無殤補 |
| 9293 | 昱辰 | 9459 | 晨昱 |
| 9296 | 楊董 | 9462 | 澄曉 |
| 9300 | 眾裡尋 | 9465 | 功夫2 |
| 9303 | 星空密碼 | 9468 | JINSHEN |
| 9346 | 小春 | 9471 | 功夫1 |
| 9382 | 盧龍吟 | 9474 | 四川麻辣燙 |
| 9423 | 一至尊一美美一 | 9477 | 華佗本人 |
| 9426 | 一至尊霸王花一 | 9483 | 半月鐮刀2 |
| 9431 | 青皮豆 | 9484 | 妶之樂 |
| 9433 | 星蝶 | 9487 | 星晴密碼 |
| 9490 | 功夫3 | 9519 | 花之影 |
| 9526 | 刀的記憶 | 9535 | 龍寶兒 |
把你提供的 7 个抓包值逐个丢回数组里查,结果全部指向非人物对象:
| 抓包值 | 槽位里的对象类型 | 说明 |
|---|---|---|
| 24 | 0x18 |
不是人物 |
| 50 | 0x22 |
不是人物 |
| 566 | 0x22 |
不是人物 |
| 730 | 0x20 |
不是人物 |
| 1302 | 0x22 |
不是人物 |
| 1343 | 0x22 |
不是人物 |
| 1424 | 0x22 |
不是人物 |
而人物类型是 0x31 —— 邀请一个玩家,包里却填着"物品/怪物/NPC"的槽位号,逻辑上不成立。
判断:这 7 条 0x30 包极可能是你挂机程序自己发的「打怪 / 拾取」包(目标 = 怪物或地面物品的槽位)。
因为封包拦截 hook 的是游戏统一的发包函数,你自己程序发出去的包同样会被拦到——挂机一直开着,拦截框里绝大部分是挂机自己的包,很容易误抓。
补充佐证:000000003400060001000100000000000823B1D4 里那个 0823B1D4 现在已不可读(0xFFFFFFFF,上个会话的堆已释放),无法证明它是对象指针。
同一角色在不同时刻 ID 不同:
1278 → 对应 +0xC = 92781423 → 对应 +0xC = 9423原因:槽位会被回收复用,玩家换图/重新进入视野会拿到新槽位。
所以对象ID 必须每次实时读取,任何缓存都会失效——这一点你的代码写法(每次现查现发)是对的。
0x68B14A88 这种 6 开头大数)→ 用 取玩家对象 实时读指针填包;3000 → 说明 0x30 既能打怪也能邀请(靠第 8~11 字节的固定标志区分),我们再按新包字节结构对齐。我已反汇编确认 0x0076C080 就是游戏的封包发送函数(它会读 buf+4 作为长度字、长度上限 0x90)。
在它入口下断点,你手动邀请一次就能拿到最原始的邀请包字节,比拦截框更可靠。
⚠️ 但该进程加载了 XIGNCODE 反作弊(XIGNCODE\x3.xem),启用 CE 调试器有被检测的风险,要不要做由你决定。