Sidecar Helper 架构设计:如何控制反作弊游戏输入法并通过 Microsoft Store 审核

繁體中文 · English · 简体中文 · 日本語 · 한국어

在 Windows 的安全机制下,普通权限程序既无法干涉具备管理员权限的反作弊游戏,也不能向受沙盒保护的现代应用程序(如 Windows 11 记事本)发送窗口控制消息。

ImeModePersistence 在 v1.5.0+ 引入了 Sidecar Helper(侧车辅助服务) 机制,在不提权主程序、不使用 DLL 注入、不模拟按键的前提下,同时达成了:

  1. 控制《绝地潜兵 2 (Helldivers 2)》等高权限 / 反作弊游戏的输入法语言。
  2. 跨越 UIPI 屏障维持 Windows 11 记事本等现代 WinUI 窗口的输入模式。
  3. 完全符合微软商店安全规范,成功上架 Microsoft Store

这篇技术文档详细记录该架构的设计原理、安全边界与实现细节。


1. 面临的挑战:Windows UIPI 权限隔离

Windows 自 Vista 引入了 UIPI (User Interface Privilege Isolation) 机制。系统依照完整性级别 (Integrity Level) 隔离进程:

为什么普通程序无法控制反作弊游戏?

当 ImeModePersistence 以普通权限(Medium-IL)执行时,即使能通过公开的 Win32 API 识别出游戏窗口(class:stingray_window),当尝试发送:

Windows 内核层的 UIPI 机制会直接拦截并丢弃这些消息,返回 ERROR_ACCESS_DENIED


2. Sidecar Helper 的核心架构

为了解决 UIPI 屏障,同时避免“把整个主程序以管理员身份开机常驻”所带来的安全风险,我们采用了 权限分离的 Sidecar Helper 架构

+-------------------------------------------------------------+
|  主程序 (ImeModePersistence.exe)                             |
|  - 权限:Medium-IL (普通用户 / Microsoft Store MSIX 容器)       |
|  - 职责:托盘 UI、窗口焦点监听、按键状态维护、规则比对              |
+-------------------------------------------------------------+
                              │
             命名管道 IPC (Named Pipe)
             安全 SDDL 访问控制 (仅限本机交互用户与管理员)
                              │
                              ▼
+-------------------------------------------------------------+
|  辅助服务 (ImeModePersistence.exe --helper <parent_pid>)    |
|  - 权限:High-IL (通过用户 UAC 授权提升)                       |
|  - 职责:代表主程序向 High-IL 游戏与焦点子窗口发送 Win32 消息      |
|  - 守护线程:监听父进程 PID,主程序退出时 Helper 立即自动结束   |
+-------------------------------------------------------------+
                              │
               Win32 标准窗口消息 (通过 UIPI)
                              │
                              ▼
+-------------------------------------------------------------+
|  目标窗口 (Helldivers 2 / Windows 11 现代记事本)               |
+-------------------------------------------------------------+

运作流程:

  1. 按需启动 (On-Demand):用户在托盘菜单点击「启用现代窗口 (WinUI) 支持…」,主程序调用 ShellExecuteExW(动词指定 runas)启动 --helper <parent_pid>。用户只需通过一次 Windows 原生 UAC 确认对话框。
  2. 安全命名管道 (Named Pipe IPC)
    • 管道名称:\\.\pipe\ImeModePersistence.Sidecar
    • 安全描述符 (SDDL):D:(A;;GA;;;BA)(A;;GA;;;IU)S:(ML;;NW;;;ME)
    • 严格限制只有本机交互用户 (Interactive User)管理员 (Builtin Administrators) 可以连接,杜绝跨网络或未授权进程的访问。
  3. 无锁同步转发:管道采用同步双向消息模式(PIPE_TYPE_MESSAGE | PIPE_WAIT),确保数据封包精确无误。
  4. 生命周期自动守护 (Watchdog)
    • Helper 服务端启动一条独立的 Watchdog 线程,通过 OpenProcess(SYNCHRONIZE, ...) 监听主程序的进程句柄,同时监听内部的 hShutdownEvent
    • 一旦主程序结束、崩溃或用户在菜单关闭 Helper,Watchdog 会即时触发结束流程并释放所有系统资源,绝不残留后台僵尸进程。

3. 为什么反作弊系统不会封禁?

许多玩家担心使用第三方工具会被反作弊系统(如 GameGuard、Easy Anti-Cheat、BattlEye、Vanguard)判定为外挂而封号。Sidecar Helper 之所以安全,是因为它完全遵循 “零侵入” 原则:

常见外挂手段 本工具的做法 为什么安全
内存读写 (ReadProcessMemory, WriteProcessMemory) 完全不使用 不读写游戏任何内存地址,不触碰游戏状态。
DLL 注入 / 线程创建 (CreateRemoteThread, SetWindowsHookEx) 完全不使用 不注入任何代码到游戏进程内。
模拟按键 (SendInput, keybd_event) 完全不使用 不模拟玩家键盘输入(避免被反作弊判定为宏/按键精灵)。
全局键盘监听 (WH_KEYBOARD_LL, GetAsyncKeyState) 完全不使用 不侧录玩家按键,无安全顾虑。
Win32 标准消息 (WM_INPUTLANGCHANGEREQUEST, WM_IME_CONTROL) 唯一采用的机制 这是 Windows 系统本身在用户按下 Win+Space 或切换窗口时发送的标准通知,游戏窗口与输入法框架将其视为合法的操作系统通知。

4. 为什么可以顺利在 Microsoft Store 上架?

Microsoft Store 对应用程序的安全性有极高要求:

1. MSIX 封装与 asInvoker 要求

2. 符合 Microsoft Store 政策 10.2(用户控制与授权)

3. 原生模块路径防护(消除 LPE / TOCTOU 漏洞)


5. 总结

通过 Sidecar Helper 架构,ImeModePersistence 成功在 “极致的用户安全性”“强大的底层输入控制能力” 之间取得了完美的平衡: