背景
Windows 9x 使用 x86 三環保護:Ring 0 (核心/VxD)、Ring 3 (應用程式)。應用程式嘗試執行特權指令 (`MOV EAX, CR0`) 或中斷 (`INT xx`) 會觸發 GPF。傳統解法是寫 VxD,但開發門檻極高。
核心思路:讓普通應用程式以 Ring 0 執行
利用「呼叫閘門」或「修改 IDT/GDT」等技巧,將特定代碼段描述符 DPL 設為 0,或建立一個 Ring 0 的呼叫閘門,應用程式透過 `CALL FAR` 進入 Ring 0 執行特權代碼,完成後 `RETF` 返回 Ring 3。
關鍵步驟 (概念)
- 分配一頁實體記憶體,鎖定不可分頁。
- 建立代碼段描述符:Base=該頁線性位址、Limit=4KB、Type=Code/Execute/Read、DPL=0。
- 將描述符寫入 GDT 或 LDT(需 Ring 0 協助,通常靠一個最小 VxD/驅動程式一次性安裝)。
- 應用程式取得該段選擇子,構造 `FAR PTR` 呼叫:`CALL FAR Selector:Offset`。
- Ring 0 代碼執行特權操作(存取 CR0、CR3、I/O 埠、物理記憶體、呼叫 VMM 服務等)。
- `RETF` 返回 Ring 3 繼續執行。
風險與限制
- 極度危險:Ring 0 代碼出錯直接藍屏/死機。
- Windows 2000/XP 採用 WDM,不再支援 VxD,且核心簽名策略嚴格,此技巧難以移植。
- 現代安全機制 (PatchGuard, SMEP, SMAP, VBS/HVCI) 徹底封殺此類手法。
現代替代方案
簽名驅動程式 (KMDF/WDM) + IOCTL 通訊、或使用已有的脆弱性驅動 (BYOVD) —— 但均屬高階驅動開發/安全研究範疇,非一般應用開發可行。
本文僅作歷史技術原理解析,實務開發請走正規驅動開發路徑。