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

VxD 程式設計入門教學:Windows 95/98 檔案系統 API 攔截實戰

     編輯:關於VC++

一、Windows 95 DDK 安裝簡易方案

傳統安裝需完整 Win32 SDK(難取得),提供兩種替代方案:

方案一:第三方資源編譯器 + 手動註冊表偽裝

  1. 匯入 WIN32SDK.REG 偽裝 SDK 已安裝(指向 C:\MSTOOLS)。
  2. 安裝 DDK 至 C:\DDK、MASM 6.11 至 C:\MASM611、VC++ 5.0 至預設路徑。
  3. 建立 C:\MSTOOLS\BINW16,放入 Borland 資源編譯器三檔(BRC.EXE→RC.EXE、BRCC32.EXE、RW32CORE.DLL)。
  4. CONFIG.SYS 加入 SHELL=C:\WINDOWS\COMMAND.COM /E:8192 /P 擴大環境變數空間。
  5. DOS 模式下跑批次:NEW-VARS.BAT → DDKINIT.BAT 32 BASE → VCVARS32.BAT。

方案二:直接安裝 Windows 98 DDK 完整版(含 SDK、MASM 6.11C),再跑 Check/Free Build Environment 即可。

二、攔截檔案操作的 VxD 實作(FILEHOOK.VXD)

VxD 運行於 Ring 0(最高特權),可完成 API 無法做到的事:埠讀寫、實體記憶體存取、中斷呼叫、API 掛鉤。本範例攔截 Win9x 所有檔案操作,核心用途:病毒防火牆(動態掃毒/過濾)。原理類似 CIH 病毒感染機制。

架構:兩類裝置物件

  • 控制裝置物件(唯一、具名 \Device\Filemon):與 GUI 程式通訊,接收掛載分區、啟用/停用監控等指令。
  • 過濾裝置物件(多個、不具名):掛載至目標分區(C:、D:…),攔截該分區的 IRP(讀/寫/開啟等)。

驅動程式入口 DriverEntry 關鍵流程

  1. 建立控制裝置物件 IoCreateDevice,標記 Type = GUIINTERFACE。
  2. 建立符號連結 IoCreateSymbolicLink(\DosDevices\Filemon) 供 Win32 開啟。
  3. 註冊所有 MajorFunction 至 FilemonDispatch。
  4. 設定 Fast I/O 表 FastIOHook。
  5. 初始化同步物件(SpinLock、FastMutex、Resource)、查找表、Lookaside List、輸出緩衝區。
  6. 呼叫 FilemonGetProcessNameOffset() 掃描 KPEB 取得進程名稱偏移(系統進程名 "System" 為特徵)。

分發函式 FilemonDispatch 路由邏輯

if (DeviceExtension->Type == GUIINTERFACE)
    return FilemonDeviceRoutine(DeviceObject, Irp);  // GUI 控制碼
else
    return FilemonHookRoutine(DeviceObject, Irp);    // 檔案系統掛鉤

檔案系統 API 掛鉤核心 FilemonHookRoutine

  • 取得被操作檔案完整路徑(GETPATHNAME 巨集 → FilemonGetFullPath)。
  • 依 MajorFunction(IRP_MJ_CREATE/READ/WRITE…)記錄操作資訊。
  • 下發 IRP 前手動複製堆疊位置:*NextStack = *CurrentStack(未用 IoCopy/IoSkip)。

取得完整路徑三種情境

  1. 建立檔案前:解析 FileObject->FileName(相對路徑)與 RelatedFileObject 組合。
  2. 建立檔案後:於完成例程中查詢。
  3. 讀寫等操作:自建 IRP 發送 IRP_MJ_QUERY_INFORMATION 取得 FileNameInformation。

FilemonGetFullPath 以條件判斷區分上述情境,代碼較長但邏輯清晰。

命名管道/郵槽特殊處理

針對 IRP_MJ_CREATE_NAMED_PIPE、IRP_MJ_CREATE_MAILSLOT 判斷並加上前綴(\\.\pipe\、\\.\mailslot\)。

三、Win32 應用程式與 VxD 通訊

使用 DeviceIoControl:

hDevice = CreateFile("\\\\.\\FILEHOOK.VXD", 0, 0, NULL, 0, FILE_FLAG_DELETE_ON_CLOSE, NULL);
DeviceIoControl(hDevice, INSTALL_HOOK, NULL,0, NULL,0, &cb, 0);  // 安裝掛鉤
DeviceIoControl(hDevice, UNINSTALL_HOOK, NULL,0, NULL,0, &cb, 0); // 移除掛鉤
CloseHandle(hDevice);

執行後,任何開啟檔案動作皆彈出 "Open file!" 訊息框,驗證攔截生效。

四、模組定義檔 (.DEF) 與 NMAKE 檔

提供標準 FILEHOOK.DEF(段屬性、匯出 FILEHOOK_DDB)與 MAKEFILE(MASM 6.11C 編譯規則、Link 參數 /VXD /NOD、產生 .vxd/.map/.sym)。

小結

本教學展示完整的檔案系統 API 掛鉤 VxD 框架,可作為病毒防火牆等安全軟體基礎。VxD 功能遠不止於此,善用 Ring 0 特權可開發 API 無法實現的高階應用。受限於篇幅與筆者水平,僅作為入門引導,歡迎交流探討。

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