首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

VxD 技術深度解析:從虛擬裝置驅動到即時防毒核心架構

     編輯:關於C++

前言:為何即時防毒非 VxD 不可?

Windows 9x 採雙保護環:Ring 0(核心模式)與 Ring 3(使用者模式)。應用程式跑在 Ring 3,無法直接存取硬體、中斷向量、全域記憶體。即時防毒需攔截所有檔案 I/O、掃描開機磁區、監控記憶體駐留行為——這些動作全屬 Ring 0 特權。**VxD(Virtual Device Driver)是唯一合法讓 Ring 3 代碼觸達 Ring 0 的橋樑**。

一、VxD 技術特點

本質:虛擬化硬體資源的多工協調者

  • 介於 Windows 核心(VMM)與實體硬體之間,或純軟體虛擬裝置。
  • 提供 **PM API(保護模式)**、**V86 API(虛擬 86 模式)**、**Win32 服務**、**VxD 服務** 四種介面,分別服務 16/32 位元應用與其他 VxD。
  • 應用程式透過 DeviceIoControl("\\\\.\\VxDName", ...) 與支援 IOCTL 的 VxD 通訊,執行 Win32 API 不支援的底層操作。

雙面刃:CIH 病毒同樣利用 VxD 駐留、感染、毀壞 BIOS

技術中立,關鍵在防禦方能否比攻擊方更早掌握 Ring 0 控制權。

二、VxD 實作核心機制

生命週期與控制訊息

VxD 在 VMM 監控下運行,透過 控制程序 處理系統發送的 51 種控制訊息(EAX 傳訊息碼,EBX 傳 VM 句柄)。動態 VxD 必處理三大關鍵訊息:

訊息值時機處理重點
SYS_DYNAMIC_DEVICE_INIT1Bh動態載入時初始化硬體、建立資料結構、掛載中斷/IO 攔截
SYS_DYNAMIC_DEVICE_EXIT1Ch卸載前釋放資源、卸載中斷、還原狀態
W32_DEVICEIOCONTROL23h應用呼叫 DeviceIoControl從 DIOCParams+0Ch 取控制碼,雙向傳輸緩衝區資料

動態載入/卸載流程

  1. CreateFile("\\\\.\\MyVxD", ...) → 系統發送 SYS_DYNAMIC_DEVICE_INIT → 成功則發送 DIOC_OPEN (0) → VxD 清零 EAX 表示支援 IOCTL → 回傳裝置句柄。
  2. 同一 VxD 可多次 CreateFile,系統維護引用計數;CloseHandle 觸發 DIOC_CLOSEHANDLE (-1),計數歸零才發送 SYS_DYNAMIC_DEVICE_EXIT 真正卸載。
  3. 嚴禁用 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

三、即時防毒關鍵技術:File Hooking (IFS Hook)

Windows 9x 檔案系統架構

Win32 API (CreateFile/ReadFile/WriteFile) → IFSMgr (可安裝檔案系統管理器) → FSD (檔案系統驅動,如 VFAT, CDFS) → IOS (輸入輸出監督程式) → 實體磁碟。

掛鉤點:FileSystemApiHookFunction

IFSMgr 在將 API 參數打包轉交 FSD 前,會呼叫掛鉤函數。透過 IFSMgr_InstallSystemApiHook 安裝自訂 Hooker,即可攔截所有檔案 I/O。

Hooker 原型與關鍵參數

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 結構 (含檔案名、緩衝區、長度等)
);

Hook 鏈機制

  • 多個 VxD 可安裝 Hooker,形成鏈結。
  • IFSMgr_InstallFileSystemApiHook 回傳前一個 Hooker 位址。
  • 每個 Hooker 處理完**必須呼叫前一個 Hooker**,最後安裝的最先被呼叫。
  • VxD 呼叫系統服務用 INT 20h + 雙字服務碼(高字=VxD ID,低字=服務號),稱 VxDCall。

關鍵服務

服務用途
IFSMgr_InstallSystemApiHook安裝 Hooker,回傳前一個 Hooker 位址
IFSMgr_RemoveSystemApiHook卸載 Hooker
IFSMgr_Ring0_FileIORing 0 直接讀寫檔案/磁區,掃描病毒特徵碼用

四、完整防毒流程設計

  1. **啟動階段**:應用程式 CreateFile 載入 VxD → VxD SYS_DYNAMIC_DEVICE_INIT 掛載 IFS Hook。
  2. **即時監控**:使用者執行/寫入檔案 → IFSMgr 呼叫 Hooker → 解析 intFunctionNum 與 IOREQ 取得檔案路徑/內容 → IFSMgr_Ring0_FileIO 讀取檔案資料 → 特徵碼比對 → 發現病毒則阻擋 (修改 IOREQ 狀態/回傳錯誤) 或隔離。
  3. **通訊機制**:應用程式定期 DeviceIoControl 取得病毒日誌、更新特徵碼庫、設定白名單。
  4. **卸載階段**:應用結束 → CloseHandle → VxD 卸載 Hook → SYS_DYNAMIC_DEVICE_EXIT 釋放資源。

五、開發與除錯工具鏈

  • 編譯環境:VToolsD (QuickVxD 產生框架) + VC++/BC++ 32-bit 編譯器 + MASM 6.11+。
  • 段管理:Real Init (16-bit) / Protected Init / Pageable / Locked / Static / Debug-only,共 12 段。
  • 除錯神器:Soft-ICE for Win95(Ring 0 級原始碼除錯,斷點、記憶體檢視、暫存器追蹤)。
  • 部署:INF 安裝腳本複製 .VXD 至 %System%\Vmm32,修改登錄表 HKLM\System\CurrentControlSet\Services\VxD\MyVxD 設定啟動順序。

六、從 VxD 到 WDM/KMDF 的歷史傳承

Windows 98 開始支援 WDM (Windows Driver Model),Windows 2000 徹底移除 VxD 架構,改用核心模式驅動程式 (KMDF/UMDF)。現代防毒採用:

  • 迷你過濾驅動程式:掛載於 NTFS/ReFS 檔案系統堆疊,IRP_MJ_CREATE/READ/WRITE 前置/後置處理。
  • ETW (Event Tracing for Windows):核心級事件追蹤,無侵入式監控。
  • ELAM (Early Launch Anti-Malware):開機早期載入,保護啟動流程完整性。

總結

VxD 是 Windows 9x 時代賦予開發者 Ring 0 能力的唯一合法管道。即時防毒透過 IFS Hook 攔截檔案系統呼叫,結合 Ring 0 直接磁碟存取,實現了「以防為主」的主動防禦。雖然架構已隨 Windows 9x 退場,但**虛擬化硬體、分層攔截、Ring 0/3 協作、引用計數生命週期**等核心設計哲學,依然活在今日的 WDM/KMDF/迷你過濾驅動模型中。研讀 VxD 經典架構,有助於深入理解現代 Windows 核心驅動開發的本質。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved