早期 Windows 95 時代,著名的 CIH 病毒正是利用 VxD(Virtual Device Driver)技術在核心層級破壞系統。若能徹底掌握 VxD 程式設計,不僅能洞悉病毒運作原理,更能從根源上實現病毒的查殺與防護。本文將系統性介紹 VxD 的架構、開發流程與關鍵技術細節,幫助開發者建立扎實的核心層驅動開發能力。
VxD 是運行於 Windows 95 核心模式(Ring 0)的 32 位可執行模組,負責管理硬體設備、軟體資源與系統中斷。它讓多個應用程式能安全地共享硬體資源,實現真正的多任務處理。VxD 處理硬體中斷、執行 I/O 操作,並為每個虛擬機(VM)維護獨立的設備狀態,確保應用程式切換時硬體狀態的一致性。
大多數 VxD 管理實體硬體(如磁碟控制器、網卡),也有部分模擬 MS-DOS 驅動程式或 TSR 程式,甚至透過 32 位代碼替代 16 位實模式代碼以提升效能。Intel 處理器在保護模式下執行 32 位 VxD 的效率遠高於虛擬 8086 模式下的 16 位代碼。
Windows 95 內建多種標準 VxD(如 V86MMGR、VPICD),支援常見硬體與軟體介面。當標準 VxD 無法滿足特殊硬體需求、或需提供新功能時,開發者需編寫自訂 VxD。Windows 95 DDK 提供大量原始碼範例,是學習與開發的最佳參考。
撰寫 VxD 假設開發者具備:
| 區段名稱 | 宏定義 | 用途 | 屬性 |
|---|---|---|---|
| VxD_CODE | VxD_CODE_SEG / VxD_CODE_ENDS | 核心控制程序、回呼、服務、API | 32 位保護模式程式碼(必須) |
| VxD_DATA | VxD_DATA_SEG / VxD_DATA_ENDS | 裝置描述表、服務表、全域資料 | 32 位保護模式資料(必須) |
| VxD_ICODE | VxD_ICODE_SEG / VxD_ICODE_ENDS | 僅初始化時使用的程式碼 | Init_Complete 後被丟棄(可選) |
| VxD_IDATA | VxD_IDATA_SEG / VxD_IDATA_ENDS | 初始化階段專用資料 | Init_Complete 後被丟棄(可選) |
| VxD_REAL_INIT | VxD_REAL_INIT_SEG / VxD_REAL_INIT_ENDS | 實模式初始化程式碼與資料 | VxD 載入最早執行,隨後丟棄(可選) |
所有保護模式區段均採用 32 位平坦模型,偏移量由連結器修正。程式碼中需使用 OFFSET32 宏取代傳統 OFFSET。VxD 不得修改 CS/DS/ES/SS,僅可使用 FS/GS。
.386p 以啟用保護模式指令集。VMM.INC(VMM 服務與巨集)、DEBUG.INC(除巨集)、VPICD.INC(中斷控制器服務)、SHELL.INC(視窗殼層服務,如 MessageBox)。Declare_Virtual_DeviceDeclare_Virtual_Device MYVXD, 1, 0, MYVXD_Control, \
MYVXD_Device_ID, MYVXD_Init_Order, \
MYVXD_V86_API_Handler, \
MYVXD_PM_API_Handler
此宏完成:命名、版本、初始化順序、控制程序入口、裝置 ID、API 處理器的宣告,並自動建立裝置描述區塊(DDB)於資料區段,產生連結器需匯出的標號(如 MYVXD_DDB)。
Undefined_Device_ID。Undefined_Init_Order。控制程序透過 Begin_Control_Dispatch、Control_Dispatch、End_Control_Dispatch 宏建立訊息分派表。核心系統控制訊息包括:
Sys_Critical_Init:最早收到,中斷關閉,快速完成硬體中斷掛鉤、記憶體申請、讀取 SYSTEM.INI。Device_Init:啟用中斷,分配控制塊、安裝 I/O 攔截與頁錯誤回呼。Init_Complete:最後初始化訊息,此後 VMM 丟棄初始化區段(ICODE/IDATA)。Create_VM / Destroy_VM:虛擬機建立/銷毀時的資料初始化與清理。VM_Init / VM_Suspend / VM_Resume:虛擬機啟動、掛起、恢復時的硬體狀態切換。Set_Device_Focus:執行焦點切換時還原硬體狀態。Sys_Critical_Exit:系統關機前,重設硬體確保安全返回實模式。完整訊息表尚包含 Begin/End_Message_Mode、Debug_Query、Query_Destroy、Reboot_Processor、Sys_VM_Init/Terminate、System_Exit、VM_Critical_Init、VM_Not_Execute 等,開發者需按需處理。
開發過程中,建議在除錯器控制下載入 VxD,於關鍵中斷處設中斷點,驗證中斷處理邏輯與狀態保存/恢復是否正確。善用 DDK 範例程式碼作為架構參考,可大幅降低試錯成本。
VxD 開發是 Windows 95 核心層程式設計的巔峰技術。雖現代 Windows 已轉向 WDM/KMDF 架構,但 VxD 的設計哲學——核心模式資源管理、虛擬化隔離、中斷與 I/O 的統一抽象——仍對理解作業系統底層運作具有不可替代的教學價值。掌握 VxD,不僅能破解 CIH 等早期病毒迷思,更能奠定系統級開發的堅實基礎。