热血江湖 YGOnline.exe —— CE 活体遍历实测结果 时间:2026-09-28 14:21 目标:D:\rxjh2025\client\YGOnline.exe(32位,无ASLR,模块基址恒 0x400000) CE:32位 CE(XIGNCODE 只放行 32 位程序读 32 位游戏) ================================================================================ 一、本次实测环境 -------------------------------------------------------------------------------- PID = 16164(32 位) IFManager 全局 = 0x0188C61C → 读出的对象指针 = 0x428750A8 扫描范围 = IFManager + 0x000 ~ 0xC00,步长 4 非空槽 = 86 个 判定公式 = 读整数(读整数(0x0188C61C) + 槽偏移) = 窗口对象; 窗口已弹出 = 窗口对象 > 0 且 读整数(窗口对象 + 0x40) == 1 二、本次"正在显示"的窗口(+0x40 == 1)只有 3 个 -------------------------------------------------------------------------------- 槽偏移 对象地址 控件ID 类名 0x3AC 4268D9C0 108 InterMAIN (主界面 HUD) 0x3B0 45673008 904 InterChat (聊天框) 0x4D4 473C34D0 6698 InterExchange (交易窗口)★ 对比 2026-09-28 上午同机另一次实测(pid 16164 为 4 个,还含 InterMiniMap 小地图; pid 14256 为 5 个,含武功栏)。本次小地图(槽 0x3D0)的 +0x40 已归 0,即已被玩家关闭。 ★ 结论不变:所有接口窗口在游戏启动时就全部创建好(86 个槽指针全部非 0), "槽指针 != 0" 判断不了弹出与否,必须看 +0x40。 三、InterExchange(交易窗口)子控件全表 —— 本次实测 -------------------------------------------------------------------------------- 窗口对象 = 0x473C34D0(槽 0x4D4) 偏移 对象 类型 控件ID 可见 位置x,y 大小cx,cy 说明 +0x330 5751C678 InterWindow 6710 0 372,146 475,280 (隐藏的另一页面板) +0x334 574FE030 InterWindow 6699 1 362,274 220,300 (当前显示的主面板) +0x338 4E87C5C0 ButtonClass 6804 0 210,60 17,17 (小按钮,未显示) +0x348 572676B8 TextBox 6713 1 0,0 17,130 +0x34C 57262000 TextBox 6752 1 0,0 17,130 +0x350 572670F0 TextBox 6714 1 0,0 17,141 +0x354 57267C80 TextBox 6753 1 0,0 17,141 +0x358 57115FF0 ButtonClass 6711 1 213,436 18,34 +0x35C 571149D0 ButtonClass 6712 1 258,26 12,11 (右上角小按钮) +0x360 56A89D00 ListCtrl 6717 1 0,0 0,0 +0x364 575ED878 ListCtrl 6756 1 0,0 0,0 +0x368 57266560 TextBox 6716 1 0,0 17,130 +0x36C 57265408 TextBox 6755 1 0,0 17,130 +0x370 57264E40 TextBox 6715 1 0,0 17,63 +0x374 57268810 TextBox 6754 1 0,0 17,63 +0x378 574D2D48 InterSTATIC 6700 1 0,0 0,0 ← 按钮文字标签 +0x37C 57110770 ButtonClass 6701 1 119,178 18,60 ← 按钮本体(显示中) +0x388 574CA918 InterSTATIC 6702 0 0,0 0,0 ← 另一标签(隐藏) +0x38C 57110CF8 ButtonClass 6703 0 85,178 18,60 ← 同排按钮(隐藏) +0x394 57114448 ButtonClass 6704 0 156,178 18,60 ← 同排按钮(隐藏) +0x3A0 4F2E9FB8 接口 6705 0 0,0 0,0 +0x3A4 576E7A30 InterWindow 6807 0 265,183 402,493 +0x3A8 4E885590 ButtonClass 6808 1 129,320 30,100 +0x3AC 4E887C48 ButtonClass 6809 1 265,320 30,100 ★ 关键点 1:y=178 那一排其实是 3 个同尺寸(18x60)按钮并排: +0x38C x=85 (本次 id 6703, 可见=0) +0x37C x=119 (本次 id 6701, 可见=1) +0x394 x=156 (本次 id 6704, 可见=0) 同一排按钮只亮其中一部分 —— 交易窗口有"阶段/页面切换",不同阶段启用不同按钮。 +0x378 / +0x388 是紧贴按钮的两个 InterSTATIC(按钮上的文字标签),x 偏移都是 0。 ★ 关键点 2:控件 ID 每次开客户端(或控件重建)都会整体平移。 同机上午那次实例:+0x378=6697(标签) / +0x37C=6698 / +0x38C=6700 / +0x394=6701 本次实例: +0x378=6700(标签) / +0x37C=6701 / +0x38C=6703 / +0x394=6704 → 你上次看到的按钮 6700/6701,在这次实例里对应的是 +0x378/+0x37C, 而不是上次记录里的 +0x38C/+0x394。偏移和类名是稳定的,ID 绝对不能写死。 → 代码里一律:按钮对象 = 读整数(交易窗口 + 固定偏移),控件ID = 读整数(按钮对象 + 0x0C)。 ★ 控件通用字段(本次复核一致): +0x00 虚表指针 +0x04 父对象 +0x08 类型码 +0x0C 控件ID +0x28,+0x2C 位置 x,y +0x30,+0x34 大小 cx,cy +0x40 可见标志(1=显示) 类型码:14=接口基类 24=InterWindow 31=ListCtrl 32=TextBox 34=ButtonClass 85=InterSTATIC 23/20/33 等=其它控件 ★ 顺带发现:交易窗口的控件文本【不在控件对象里以指针形式存放】。 对全部子控件对象 +0x000~+0x200 逐 DWORD 扫描,没有命中任何指向 Big5/ASCII 字符串的指针。也就是说按钮上的"確定/取消"等字是渲染时从消息表(ybmsg.cfg) 现取的,不落地在控件结构里。想拿文本要走消息表,而不是读控件。 四、InterMAIN / InterChat 子控件(顺带记录) -------------------------------------------------------------------------------- InterMAIN(0x4268D9C0) +0x33C ListCtrl id=339 可见 (聊天/系统消息滚动列表) +0x344 InterWindow id=111 可见 pos=767,704 大小=50,252 +0x348 ~ +0x3BC TextBox ×30 id=147,149,... 全部可见=0(快捷栏数字槽,未填充) +0x3C0 ~ +0x3E4 TextBox ×10 id=148,150,...164 可见=1 大小=7,32 +0x438 (类型33) id=129 可见=0 大小=4,1000 +0x43C (类型33) id=253 可见=0 大小=65,62 InterChat(0x45673008) +0x334 (类型23) id=926 可见 pos=37,5 大小=14,290 +0x340 (类型20) id=906 可见=0 大小=128,350 五、完整槽位表(本次 86 个非空槽,off / 对象 / 控件ID / +0x40) -------------------------------------------------------------------------------- (见文末附录) 六、给易语言的两条常量 / 用法重申 -------------------------------------------------------------------------------- .常量 IFManager基址, "25740828" ' 0x0188C61C,里面存 IFManager 对象指针 .常量 窗口显示标志, "64" ' 0x40 .常量 交易窗口槽, "1236" ' 0x4D4 .常量 交易按钮1, "892" ' 0x37C 按钮本体(本次实例 id=6701) .常量 交易按钮2, "908" ' 0x38C 按钮本体(本次实例 id=6703,本状态隐藏) .常量 交易按钮3, "916" ' 0x394 按钮本体(本次实例 id=6704,本状态隐藏) 遍历可见窗口 → 对全部槽读 +0x40,==1 就是正在显示的界面; 点按钮 → 先读 按钮对象 = 读整数(交易窗口 + 偏移),再取 控件ID = 读整数(按钮对象 + 12), 用"派发事件 0x409 + 控件ID 给 [0x0188C60C]"那段机器码调用。 (细节见《窗口弹出状态与遍历_0928.txt》第八节) 附:复现脚本(D:\ce_mcp\) -------------------------------------------------------------------------------- _t2.py 全槽扫描:off / 对象 / 虚表 / 类型 / 控件ID / +0x40 _t3.py 可见窗口清单 + 每个可见窗口的子控件表 _t4.py 交易窗口子控件文本指针扫描(结论:无,文本来自 ybmsg.cfg) 说明:桥为 \\.\pipe\ce_mcp_bridge,用 _wbpy.py 的 cmd('execute_lua', {...}) 单次下发 Lua,避免 read_memory_batch 通道不稳。 ================================================================================ 附录:本次 IFManager 全部非空槽(off / 对象 / 控件ID / +0x40 / 类名) ================================================================================ 槽偏移 对象地址 控件ID +0x40 类名 -------------------------------------------------------------------------- 0x000 010E196C 5674816 1550415199 0x038 5CD91598 300 0 0x03C 5CD9159C 0 0 0x348 6AB9F9DA nil nil 0x36C 007E249A 860976594 1102881036 0x3AC 4268D9C0 108 1 InterMAIN <<< 显示中 0x3B0 45673008 904 1 InterChat <<< 显示中 0x3B4 4512B560 466 0 InterStatus 0x3B8 36818E58 953 0 InterInventory 0x3C0 37597E08 1296 0 InterCenterMessage 0x3C4 4290D000 1297 0 InterMugongHanbigwang 0x3CC 36981488 1654 0 InterOption 0x3D4 46802538 1988 0 InterHelp 0x3D8 46801A40 1989 0 InterExit 0x3DC 467E6088 1996 0 InterQuestEx 0x3E0 5CD83D50 8768 0 0x3E4 5C932A78 8770 0 0x3E8 5CD91570 8771 0 0x3EC 5C92D258 8773 0 0x3F4 428DCEB8 4024 0 InterStatusReply 0x3F8 473B4E58 4107 0 CInterDye 0x3FC 20764AF0 8531 0 CPinoDeburp 0x400 571DF4D0 8647 0 InterLuckyBox 0x404 4287B018 7021 0 InterNotice 0x40C 42876F60 8643 0 InterPcRoomBenefit 0x410 5CB28728 8655 0 InterSendPackage 0x414 4F2E9868 6540 0 InterTimer 0x418 467F4630 4840 0 InterPath 0x41C 4E5C55F0 4855 0 InterCallToGuild 0x420 429CD178 4897 0 CBloodBattle 0x424 3D671B60 4631 0 InterInitiateAbility 0x428 44ADD9D8 4753 0 InterServerMove 0x42C 44ADCE80 4621 0 InterByulho 0x430 4DEC7320 4251 0 InterAutoPlay 0x434 44FC7148 4841 0 InterChangeLooksPet 0x43C 42943CF0 4827 0 InterHairdressing 0x448 36804068 4806 0 CInterSaju 0x44C 45306828 4898 0 InterLuckyBag 0x458 44B6FC38 4901 0 InterManufacture 0x460 4FA29328 5213 0 InterMedicineMaking 0x468 4F2DF3E0 5297 0 InterNameChange 0x470 4F990F60 5318 0 InterPartySearch 0x478 16770928 5436 0 InterPremiumCashItem 0x47C 3D672F80 5461 0 InterPremiumSelect 0x48C 453053B8 5631 0 InterAttChangeSoulStone 0x490 428DD500 5637 0 SoulPetIncubation 0x494 4F2DF788 5727 0 InterGifticon 0x49C 473ADD10 5776 0 InterExcangeHeroWeapon 0x4AC 4F2E40A8 5917 0 InterWarpToParty 0x4B0 1676FD10 5922 0 InterGibo 0x4B8 2176FFD8 6300 0 CPetInven 0x4BC 42200FE8 6157 0 CPetInfo 0x4C4 451EFA18 6359 0 CSajeSystem 0x4C8 56BCA858 6517 0 InterMunpaWar 0x4CC 571D83D0 6820 0 InterCoatChange 0x4D0 4F2E8278 6811 0 InterEscape 0x4D4 473C34D0 6698 1 InterExchange <<< 显示中 0x4D8 571D8048 6843 0 InterAttributeJesukbu 0x4DC 571D9578 6864 0 InterMacro 0x4E0 5729FB08 6927 0 InterMail 0x4E4 4F2E5698 7017 0 InterMugongLearn 0x4E8 36814590 7032 0 InterParty 0x4F4 57283F70 7492 0 InterPremiumWin 0x4F8 4DBD0860 7504 0 InterWar 0x4FC 3A64B378 7515 0 InterWeb 0x500 571D9C88 7553 0 InterWebShop 0x504 571DBC50 7557 0 CInterCharm 0x508 57C560E8 7563 0 InterMunpa 0x50C 428D9630 7663 0 InterCastleWar 0x514 5C6F7008 8302 0 InterRaid 0x518 0DC8EA68 23 0 InterUI_Community 0x51C 0DC92320 32 0 InterUI_CharacterInfo 0x520 1D9D32E8 40 0 InterUI_Manufacture 0x524 1D9CD3D8 48 0 InterUI_Option 0x530 3DD77D80 63 0 InterUI_AllFunction 0x534 4F2E5A40 6549 0 InterSoulPetEvolve 0x538 21770B30 6575 0 InterSoulPetReinforce 0x53C 45305DF0 6603 0 InterSoulPetWareHouse 0x540 571DA398 6623 0 InterSoulPetSeal 0x544 4F2E5DE8 6671 0 InterEmoticon 0x548 4F2E9C10 6649 0 InterMarbleEvolve 0x54C 30C8B728 5306 0 InterGuildNameChange 0x550 4F2E8620 8774 0 ScriptDungeon 0x554 010FBED0 14587536 1095062092 0x558 00321D30 0 0 0x55C 00010000 16780409 67392 (共 86 个非空槽;+0x40 == 1 的已在行尾标注) 注 1:控件ID 一列是每个窗口对象的 +0x0C,会话内递增分配,不可写死。 注 2:0x000 / 0x038 / 0x03C 是 IFManager 对象自身的成员,不是窗口; 0x348 / 0x36C / 0x554 / 0x558 / 0x55C 是浮点常量被当成指针的误报 (0x3E8xxxxx~0x40000000 区间,扫描时应排除)。真正的窗口槽在 0x3AC 起。 注 3:从 0x3AC 到 0x550 几乎连续,实际使用约 100 个接口槽;本次 86 个非空。