============================================================================== CE 读不了游戏内存 —— 排查结论(不是脚本问题,是 CE 位数问题) 2026-09-28 12:0x (对象:D:\rxjh2025\client\YGOnline.exe) ============================================================================== 一、现象 ------------------------------------------------------------------------------ 桥连得上、attach_process 报 success、getOpenedProcessID 也正确, 但所有读取全部失败: readBytes(0x400000, 4) -> nil readInteger(0x03970A70) -> nil (血量) readInteger(0x03BF7E18) -> nil (队员基址) enumModules() -> 0 个 aob_scan 搜角色名 -> 0 命中 (CE 侧 Lua 返回 nil → JSON 里表现为 {"result":[]},看着像"空数据", 实际是读失败。) 二、对照实验:CE 本身没问题 ------------------------------------------------------------------------------ 同一个 CE 去读别的进程,一切正常: attach conhost.exe -> enumModules 列出 conhost.exe@7FF7DBFC0000 / ntdll.dll@7FFCABD70000 / KERNEL32.DLL@7FFCAB060000 readBytes(模块基址) -> 正常返回 → 桥、管道、CE 读取链路都没坏,**是游戏进程拒绝这次读取**。 三、根因:机器上同时跑着两个 CE,一个是 32 位、一个是 64 位 ------------------------------------------------------------------------------ 任务管理器里有 4 个伪装成 csrss.exe 的进程(CE 改名的): PID 4024 / 14780 D:\登录源码数据存储账号\CE+调试V7.6\csrss.exe → PE 头 = x86(32 位) ★ 启动 11:33/11:34,**它读得了** PID 14464 / 15844 C:\Windows\Fonts\<乱码目录>\csrss.exe → 旁边只有 lua53-64.dll = **64 位 CE** ★ 启动 11:45:05,**它读不了** 时间线完全对得上: 11:26-11:28 游戏三开 + xxd-0/1/2.xem(反外挂模块) 11:33/11:34 32 位 CE 启动 11:40-11:44 桥挂在 32 位 CE 上 → 读取全部正常(namescan/vt2/dumpname 等) 11:45:05 64 位 CE 启动,用户把桥 lua 挂到了它上面 11:52 起 读取全 nil ★ 结论:反外挂(驱动 xhunter2 = C:\Windows\xhunter2.sys,Running, 外加 xxd-*.xem 三个模块)**只放行 32 位程序读 YGOnline.exe(32 位进程)**, 64 位程序一律被拒。 旁证:64 位托管 Python 直接 ReadProcessMemory / NtReadVirtualMemory 也恒失败 —— STATUS_ACCESS_DENIED(0xC0000022),管理员 + SeDebugPrivilege 也无效。 这和长期以来"64 位 Python 读不了游戏"是同一个原因。 四、内核态绕读:此路不通 ------------------------------------------------------------------------------ CE 7.4 里有这些内核态开关,调用都返回成功: Dbk_useKernelmodeOpenProcess(true) Dbk_useKernelmodeProcessMemoryAccess(true) Dbk_useKernelmodeQueryMemoryRegions(true) 但是 Dbk_initialize() -> **false** 两份 CE 目录里都没有 dbk32.sys / dbk64.sys → 没有内核驱动可加载, 内核态读内存用不起来。**位数是硬约束,绕不过去。** 五、解决动作(就两步) ------------------------------------------------------------------------------ 1) 先关掉 64 位那个 CE: 任务管理器里结束 PID 14464、15844 的 csrss.exe (路径是 C:\Windows\Fonts\... 的那两个) ⚠️ 千万别动 PID 768 / 864 —— 那是真的系统 csrss.exe (路径 C:\Windows\System32\csrss.exe,System 进程,杀了会蓝屏) 2) 回到 32 位的 CE(D:\登录源码数据存储账号\CE+调试V7.6\csrss.exe, 现在应该还开着,PID 4024 / 14780),在里面重新 Execute 一遍: D:/ce_mcp/ce_mcp_bridge.lua (命名管道 \\.\pipe\ce_mcp_bridge 是全局唯一的,必须先关掉 64 位那份, 否则它占着管道,32 位这份建不起来) 3) 我再跑一次验证脚本,就能把「自己名字」定死。 六、以后每次开工的检查顺序(30 秒) ------------------------------------------------------------------------------ ① `CE 是不是 32 位的那份?`(D:\登录源码数据存储账号\CE+调试V7.6\csrss.exe) ② 管道探活:`Get-ChildItem '\\.\pipe\' | findstr ce_mcp` ③ `enumModules()` 是不是 0(0 = 读不了,别浪费时间) ④ 读一个必然有值的地址热身:0x400000 模块头 / 0x03970A70 血量 ==============================================================================