背景:為何需要 VxD?
Windows 9x 基於 Intel Ring 0/3 保護模式:Ring 0(核心模式)擁有完整硬體存取權;Ring 3(用戶模式)受限於自身位址空間。傳統用戶模式反病毒軟體屬「靜態掃描」,無法在病毒入侵瞬間攔截。實現「以防為主」的實時監控,必須讓監控代碼運行在 Ring 0,**VxD(Virtual Device Driver)正是官方提供的 Ring 0 程式開發介面**。
VxD 核心特性
- 虛擬裝置驅動程式:連接系統核心與硬體/軟體「虛擬裝置」。
- Ring 0 權限:可執行特權指令、存取所有記憶體、攔截中斷、掛鉤系統服務。
- 四類服務:PM API(16位保護模式)、V86 API(虛擬 86 模式)、Win32 服務、VxD 服務(供其他 VxD 呼叫)。
- 應用程式通訊:
DeviceIoControl + IOCTL 代碼,雙向傳遞資料。
VxD 生命週期與控制訊息
系統透過控制訊息(Control Message)管理 VxD,關鍵訊息:
| 訊息 | 代碼 | 時機 | 處理任務 |
| SYS_DYNAMIC_DEVICE_INIT | 0x1B | 動態載入時 | 初始化、建立資料結構、掛鉤中斷/服務 |
| SYS_DYNAMIC_DEVICE_EXIT | 0x1C | 卸載時 | 清理掛鉤、釋放資源、還原系統狀態 |
| W32_DEVICEIOCONTROL | 0x23 | 應用呼叫 DeviceIoControl | 從輸入緩衝區取參數、執行 Ring 0 操作、回寫輸出緩衝區 |
動態載入流程
- 應用呼叫
CreateFile("\\\\.\\VxDName", ...)。
- 系統發送
SYS_DYNAMIC_DEVICE_INIT,VxD 初始化成功返回。
- 系統發送
W32_DEVICEIOCONTROL(控制碼 DIOC_OPEN=0),VxD 清零 EAX 表示支援 IOCTL。
CreateFile 返回裝置句柄 hDevice。
- 應用透過
DeviceIoControl(hDevice, ioctlCode, inBuf, inSize, outBuf, outSize, &bytesReturned, NULL) 與 VxD 交換資料。
- 應用呼叫
CloseHandle(hDevice),系統發送 DIOC_CLOSEHANDLE(-1),引用計數歸零時發送 SYS_DYNAMIC_DEVICE_EXIT 卸載 VxD。
典型 VxD 控制程序骨架(組合語言)
BeginProc VXD_Control
mov eax, [control_message] ; EAX = 訊息代碼
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] ; 從 DIOCParams 取 IOCTL 代碼
; ... 依代碼分派處理 ...
exit_control_proc:
ret
EndProc
實時反病毒應用架構
- VxD 核心模組:掛鉤檔案系統 IFS(Installable File System)相關服務(如
IFSMgr_RegisterFileSystemHook),攔截 IRP_MJ_CREATE、IRP_MJ_WRITE、IRP_MJ_READ 等操作。
- 特徵碼掃描引擎:在攔截點讀取檔案內容,對比病毒特徵庫(需高效能、增量更新)。
- 決策與阻斷:發現病毒 → 返回錯誤碼阻止操作、隔離檔案、通知用戶模式 UI。
- 用戶模式介面:提供
DeviceIoControl 介面供 UI 查詢狀態、設定策略、更新特徵庫。
雙刃劍:病毒也利用 VxD
CIH 病毒即利用 VxD 技術:以 Ring 0 代碼駐留記憶體、感染 PE 檔案、破壞硬碟分區表、刷新 BIOS。防禦端必須保護 VxD 載入機制、監控可疑 VxD 註冊、簽名驗證核心模組。
總結
VxD 是 Windows 9x 時代實現 Ring 0 功能的唯一正規路徑,支撐了實時反病毒、防火牆、磁碟工具等核心安全軟體。雖隨 Windows NT 核心(WDM/KMDF)淘汰,但其核心模式程式設計思想、硬體抽象層互動、用戶/核心模式通訊模型對理解現代驅動開發、根套件防禦、EDR 架構仍具極高參考價值。
- 上一篇文章: 高品質 C++/C 程式設計指南:前言——從「真正程式設計師」迷思到品質覺醒
- 下一篇文章: TCP 網路傳輸「黏包」問題成因分析與完整解決方案
Copyright ©
程式碼之家 All Rights Reserved