-
Notifications
You must be signed in to change notification settings - Fork 0
Sidecar Helper Architecture
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
简体中文
日本語
한국어