Windows CE 採用獨特的 Slot 記憶體架構,傳統桌面 Windows 的全域鉤子、遠端執行緒注入 (CreateRemoteThread) 等技術均失效。本文揭露未公開 API PerformCallBack4 結合 Slot 0 特性,實現跨程序代碼執行的完整原理與實作路徑。
LoadLibrary("Test.dll"),則 Test.dll 內函數在 Slot 0 中位址相同// 核心模式切換
BOOL SetKmode(BOOL fKmode); // TRUE = 核心模式執行
// 程序權限遮罩:每 bit 對應一個 Slot 存取權
BOOL SetProcPermissions(DWORD dwPerms); // bit=1 允許存取對應 Slot
驅動程式常用此機制跨程序存取資料;應用層需簽名驅動或核心模式才能呼叫。
核心 API:PerformCallBack4
宣告 (C# P/Invoke)
[DllImport("coredll.dll")]
public static extern uint PerformCallBack4(
ref CallBackInfo cbInfo,
IntPtr pVoid1, IntPtr pVoid2, IntPtr pVoid3
);
[StructLayout(LayoutKind.Sequential)]
public struct CallBackInfo {
public IntPtr hProc; // 目標程序控制代碼
public IntPtr pfn; // 目標程序空間內函數位址
public IntPtr pvArg0; // 第一參數
}
參數說明:
hProc:OpenProcess 取得的目標程序控制代碼
pfn:目標程序空間內函數絕對位址(利用 DLL 共享映射推算)
pvArg0 ~ pVoid3:傳遞給目標函數的 4 個參數
完整注入流程
- 雙方程序均
LoadLibrary("InjectDll.dll")
- 注入端取得自身
InjectDll.dll 中目標函數 TargetFunc 位址
- 利用 Slot 0 映射特性,推算目標程序空間中
TargetFunc 同樣位址
OpenProcess 取得目標 hProc
- 填充
CallBackInfo,呼叫 PerformCallBack4 觸發遠端執行
驗證與注意事項
- WM 5.0+ 同樣支援,網傳「不支援」為謠言
- 需目標程序已載入同名 DLL,否則位址推算失效
- 涉及核心模式切換與記憶體權限修改,極高風險,僅供安全研究與除錯用途
- 現代 CE 7/2013 引入 CFG/DEP/ASLR,增加利用難度
結語
Windows CE 獨特的 Slot 記憶體架構與 DLL 共享映射,配合未公開的 PerformCallBack4,形成了一條跨程序代碼執行的隱蔽路徑。深入理解此機制,不僅有助於嵌入式安全防禦(如偵測異常跨程序呼叫),也為舊版系統熱修補、除錯工具開發提供理論基礎。實務上強烈建議改用簽名驅動、ETW 追蹤等合法機制替代注入技術。