Windows 9x 採雙保護環:Ring 0(核心模式)與 Ring 3(使用者模式)。應用程式跑在 Ring 3,無法直接存取硬體、中斷向量、全域記憶體。即時防毒需攔截所有檔案 I/O、掃描開機磁區、監控記憶體駐留行為——這些動作全屬 Ring 0 特權。**VxD(Virtual Device Driver)是唯一合法讓 Ring 3 代碼觸達 Ring 0 的橋樑**。
DeviceIoControl("\\\\.\\VxDName", ...) 與支援 IOCTL 的 VxD 通訊,執行 Win32 API 不支援的底層操作。技術中立,關鍵在防禦方能否比攻擊方更早掌握 Ring 0 控制權。
VxD 在 VMM 監控下運行,透過 控制程序 處理系統發送的 51 種控制訊息(EAX 傳訊息碼,EBX 傳 VM 句柄)。動態 VxD 必處理三大關鍵訊息:
| 訊息 | 值 | 時機 | 處理重點 |
|---|---|---|---|
| SYS_DYNAMIC_DEVICE_INIT | 1Bh | 動態載入時 | 初始化硬體、建立資料結構、掛載中斷/IO 攔截 |
| SYS_DYNAMIC_DEVICE_EXIT | 1Ch | 卸載前 | 釋放資源、卸載中斷、還原狀態 |
| W32_DEVICEIOCONTROL | 23h | 應用呼叫 DeviceIoControl | 從 DIOCParams+0Ch 取控制碼,雙向傳輸緩衝區資料 |
CreateFile("\\\\.\\MyVxD", ...) → 系統發送 SYS_DYNAMIC_DEVICE_INIT → 成功則發送 DIOC_OPEN (0) → VxD 清零 EAX 表示支援 IOCTL → 回傳裝置句柄。CreateFile,系統維護引用計數;CloseHandle 觸發 DIOC_CLOSEHANDLE (-1),計數歸零才發送 SYS_DYNAMIC_DEVICE_EXIT 真正卸載。DeleteFile("\\\\.\\MyVxD") 強制卸載,會導致共用該 VxD 的其他程式崩潰。BeginProc VXD_Control
cmp eax, 1Bh ; SYS_DYNAMIC_DEVICE_INIT
jz vxd_dynamic_init_handle
cmp eax, 1Ch ; SYS_DYNAMIC_DEVICE_EXIT
jz vxd_dynamic_exit_handle
cmp eax, 23h ; W32_DEVICEIOCONTROL
jnz exit_control_proc
mov ecx, [esi+0Ch] ; 取控制碼
; ... 處理各控制碼 ...
EndProc VXD_Control
Win32 API (CreateFile/ReadFile/WriteFile) → IFSMgr (可安裝檔案系統管理器) → FSD (檔案系統驅動,如 VFAT, CDFS) → IOS (輸入輸出監督程式) → 實體磁碟。
IFSMgr 在將 API 參數打包轉交 FSD 前,會呼叫掛鉤函數。透過 IFSMgr_InstallSystemApiHook 安裝自訂 Hooker,即可攔截所有檔案 I/O。
FileSystemApiHookFunction(
PVOID pIFSFuncFSDFnAddr, // 對應 FSD 服務函數位址
INT intFunctionNum, // FSD 功能號 (對應 CreateFile/ReadFile/WriteFile/DeleteFile 等)
INT intDrive, // 磁碟機號 (1=A, 2=B...)
INT intResourceFlags, // 資源旗標
INT intCodePage, // 0=ANSI, 1=OEM
PIOREQ pir // 指向 IOREQ 結構 (含檔案名、緩衝區、長度等)
);
IFSMgr_InstallFileSystemApiHook 回傳前一個 Hooker 位址。INT 20h + 雙字服務碼(高字=VxD ID,低字=服務號),稱 VxDCall。| 服務 | 用途 |
|---|---|
| IFSMgr_InstallSystemApiHook | 安裝 Hooker,回傳前一個 Hooker 位址 |
| IFSMgr_RemoveSystemApiHook | 卸載 Hooker |
| IFSMgr_Ring0_FileIO | Ring 0 直接讀寫檔案/磁區,掃描病毒特徵碼用 |
CreateFile 載入 VxD → VxD SYS_DYNAMIC_DEVICE_INIT 掛載 IFS Hook。intFunctionNum 與 IOREQ 取得檔案路徑/內容 → IFSMgr_Ring0_FileIO 讀取檔案資料 → 特徵碼比對 → 發現病毒則阻擋 (修改 IOREQ 狀態/回傳錯誤) 或隔離。DeviceIoControl 取得病毒日誌、更新特徵碼庫、設定白名單。CloseHandle → VxD 卸載 Hook → SYS_DYNAMIC_DEVICE_EXIT 釋放資源。%System%\Vmm32,修改登錄表 HKLM\System\CurrentControlSet\Services\VxD\MyVxD 設定啟動順序。Windows 98 開始支援 WDM (Windows Driver Model),Windows 2000 徹底移除 VxD 架構,改用核心模式驅動程式 (KMDF/UMDF)。現代防毒採用:
VxD 是 Windows 9x 時代賦予開發者 Ring 0 能力的唯一合法管道。即時防毒透過 IFS Hook 攔截檔案系統呼叫,結合 Ring 0 直接磁碟存取,實現了「以防為主」的主動防禦。雖然架構已隨 Windows 9x 退場,但**虛擬化硬體、分層攔截、Ring 0/3 協作、引用計數生命週期**等核心設計哲學,依然活在今日的 WDM/KMDF/迷你過濾驅動模型中。研讀 VxD 經典架構,有助於深入理解現代 Windows 核心驅動開發的本質。