傳統防毒屬「事後清除」,病毒已造成損害才發現。實時防毒需在 Ring 0(核心層) 攔截檔案 I/O,於病毒寫入磁碟前即攔截清除。Win9x 只有 VxD 能在 Ring 0 執行,故成為實時防毒核心技術。
DeviceIoControl + 支援 IOCTL 的 VxD,完成 Win32 API 無法做的底層操作。| 訊息 | 代碼 | 觸發時機 | 處理重點 |
|---|---|---|---|
| SYS_DYNAMIC_DEVICE_INIT | 1Bh | 動態載入 | 初始化、建立資料結構、掛鉤 |
| SYS_DYNAMIC_DEVICE_EXIT | 1Ch | 卸載 | 清理資源、卸除鉤子 |
| W32_DEVICEIOCONTROL | 23h | 應用程式呼叫 DeviceIoControl | 從 DIOCParams 取控制碼、雙向資料傳輸 |
控制程序骨架(組合語言):
BeginProc VXD_Control
cmp eax, 1Bh
jz vxd_dynamic_init_handle
cmp eax, 1Ch
jz vxd_dynamic_exit_handle
cmp eax, 23h
jnz exit_control_proc
mov ecx, [esi+0Ch] ; 取得控制碼
; 處理各控制碼...
EndProc VXD_Control
CreateFile, ReadFile 等)。IFSMgr_InstallSystemApiHook:安裝自訂 Hooker,回傳前一個 Hooker 位址(形成鏈)。IFSMgr_RemoveSystemApiHook:卸除 Hooker。IFSMgr_Ring0_FileIO:Ring 0 層級檔案/磁區讀寫。
FileSystemApiHookFunction(
pIFSFunc FSDFnAddr, // 對應 FSD 服務函數位址
int FunctionNum, // FSD 功能號(對應具體 API)
int Drive, // 磁碟機代號(1=A, 2=B...)
int ResourceFlags, // 資源旗標
int CodePage, // 代碼頁(0=ANSI, 1=OEM)
pioreq pir // IOREQ 結構指標(含檔案路徑、緩衝區等)
);
攔截特定 API 只需在 Hooker 中判斷 FunctionNum,例如 IFS_FUNC_OPEN 對應 CreateFile。
INT 20h + 雙字 VxD_ID << 16 | Service_Num(如 00400043h 為 IFSMgr_InstallSystemApiHook)。CIH 病毒利用 VxD 技術駐留記憶體、感染 PE 檔、破壞硬碟與 BIOS。防毒軟體同樣使用此技術,屬「雙面刃」,需極度謹慎實作、嚴格簽章驗證。
VxD + FileHooking 是 Win9x 實時防毒的核心基礎。雖現代 Windows 已轉向 WDM/KMDF 驅動模型與微濾波驅動,但其「核心層攔截、API 鉤子鏈」的設計思想仍具參考價值。