-
Notifications
You must be signed in to change notification settings - Fork 0
Sidecar Helper Architecture Simplified
繁體中文 · English · 简体中文 · 日本語 · 한국어
在 Windows 的安全机制下,普通权限程序既无法干涉具备管理员权限的反作弊游戏,也不能向受沙盒保护的现代应用程序(如 Windows 11 记事本)发送窗口控制消息。
ImeModePersistence 在 v1.5.0+ 引入了 Sidecar Helper(侧车辅助服务) 机制,在不提权主程序、不使用 DLL 注入、不模拟按键的前提下,同时达成了:
- 控制《绝地潜兵 2 (Helldivers 2)》等高权限 / 反作弊游戏的输入法语言。
- 跨越 UIPI 屏障维持 Windows 11 记事本等现代 WinUI 窗口的输入模式。
- 完全符合微软商店安全规范,成功上架 Microsoft Store。
这篇技术文档详细记录该架构的设计原理、安全边界与实现细节。
Windows 自 Vista 引入了 UIPI (User Interface Privilege Isolation) 机制。系统依照完整性级别 (Integrity Level) 隔离进程:
- Low-IL:浏览器沙盒
- Medium-IL:普通用户执行的桌面程序与 Microsoft Store 应用程序
- High-IL:以管理员身份执行的程序、以及启动内核反作弊驱动的全屏游戏(例如 Helldivers 2 搭配 nProtect GameGuard)
当 ImeModePersistence 以普通权限(Medium-IL)执行时,即使能通过公开的 Win32 API 识别出游戏窗口(class:stingray_window),当尝试发送:
-
PostMessage(hwnd, WM_INPUTLANGCHANGEREQUEST, 0, hkl)(切换键盘语言) -
SendMessage(imeWnd, WM_IME_CONTROL, IMC_SETCONVERSIONMODE, ...)(切换中/英输入模式)
Windows 内核层的 UIPI 机制会直接拦截并丢弃这些消息,返回 ERROR_ACCESS_DENIED。
为了解决 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 现代记事本) |
+-------------------------------------------------------------+
-
按需启动 (On-Demand):用户在托盘菜单点击「启用现代窗口 (WinUI) 支持…」,主程序调用
ShellExecuteExW(动词指定runas)启动--helper <parent_pid>。用户只需通过一次 Windows 原生 UAC 确认对话框。 -
安全命名管道 (Named Pipe IPC):
- 管道名称:
\\.\pipe\ImeModePersistence.Sidecar - 安全描述符 (SDDL):
D:(A;;GA;;;BA)(A;;GA;;;IU)S:(ML;;NW;;;ME) - 严格限制只有本机交互用户 (Interactive User) 与管理员 (Builtin Administrators) 可以连接,杜绝跨网络或未授权进程的访问。
- 管道名称:
-
无锁同步转发:管道采用同步双向消息模式(
PIPE_TYPE_MESSAGE | PIPE_WAIT),确保数据封包精确无误。 -
生命周期自动守护 (Watchdog):
- Helper 服务端启动一条独立的 Watchdog 线程,通过
OpenProcess(SYNCHRONIZE, ...)监听主程序的进程句柄,同时监听内部的hShutdownEvent。 - 一旦主程序结束、崩溃或用户在菜单关闭 Helper,Watchdog 会即时触发结束流程并释放所有系统资源,绝不残留后台僵尸进程。
- Helper 服务端启动一条独立的 Watchdog 线程,通过
许多玩家担心使用第三方工具会被反作弊系统(如 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 或切换窗口时发送的标准通知,游戏窗口与输入法框架将其视为合法的操作系统通知。 |
Microsoft Store 对应用程序的安全性有极高要求:
- 微软商店规定上架的封装应用程序清单(
AppxManifest.xml)严禁声明requireAdministrator,主应用程序必须在普通用户权限(asInvoker)下启动。 - 本工具的商店版主程序维持 100% 合规的
asInvoker,完全符合沙盒安全规范。
- 依据微软商店规范,应用程序若需要执行高权限操作,必须由用户明确主动发起,并通过操作系统标准的 UAC 提示取得同意,严禁静默提权或利用漏洞绕过 UAC。
- Sidecar Helper 是由用户在右键菜单明确点击后,调用 Windows 原生
ShellExecuteEx(runas)触发标准 UAC 对话框,完全符合微软商店安全审核标准。
- 过去某些提权辅助工具会将可执行文件复制到
%LocalAppData%或%Temp%等可写目录后再提权执行,这会引入严重的本地权限提升 (LPE) 与 TOCTOU 劫持漏洞。 - ImeModePersistence 坚持直接对已注册的只读模块路径(
autostart::module_path())发起提权,彻底杜绝代码被篡改的风险。
通过 Sidecar Helper 架构,ImeModePersistence 成功在 “极致的用户安全性” 与 “强大的底层输入控制能力” 之间取得了完美的平衡:
- 🎮 玩家:可以在不以管理员身份重开主程序的情况下,顺畅游玩反作弊游戏并享受自动锁定英文。
- 🏢 日常用户:在 Windows 11 现代记事本与各类 WinUI 窗口中,输入法模式不再擅自跳回中文。
- 🛡️ 安全至上:零注入、零按键模拟、全开放源代码,并通过微软商店与 OpenSSF 双重安全检验。
ImeModePersistence · 下載 / Releases · 問題回報 / Issues · README · 設計筆記 / Design notes · MIT
本 Wiki 是操作說明;實作理由與被否決的做法記在設計筆記。發佈的檔案未經簽章。 This wiki is the how-to; implementation reasoning and rejected approaches live in the design notes. Released files are unsigned.
繁體中文
English
简体中文
日本語
한국어