目前國內的Windows9x平台反病毒產品大多屬靜態反病毒軟件,指導思想是"以殺為主",這一方式的缺點是病毒在被清除之前可能早已造成了嚴重危害一個好的反病毒軟件應該是"以防為主,以殺為輔",在病毒入侵時就把它清除掉,這就是實時反病毒技術。
Windows9x使用IntelCPU的Ring0和Ring3兩個保護級。系統進程運行於Ring0,因而具有對系統全部資源的訪問權和管理權;而普通用戶進程運行於Ring3,只能訪問自己的程序空間,不允許對系統資源進行直接訪問許多操作受到限制。顯然這種普通用戶進程是無法勝任實時反病毒工作的,必須使後台監視進程運行在Ring0優先級,實現這一目的基礎就是VxD技術。
一、VxD技術的特點
VxD即虛擬設備驅動程序,用作Windows9x系統和物理設備之間的接口。但它不僅適用於硬件設備,也適用於按VxD規范所編制的各種軟件"設備"
VxD技術的實質是:通過加載具有Ring0最高優先級的VxD,運行於Ring3上的應用程序能夠以一定的接口控制VxD的動作,從而達到控制系統的目的。實時反病毒軟件之所以要使用VxD技術,關鍵有二:(1)VxD擁有系統最高運行權限(2)許多Windows9x系統底層功能只能在VxD中調用,應用程序如果要用必須編個VxD作為中介。VxD作為應用程序在系統中的一個代理,應用程序通過它來完成任何自己本身做不到的事情,通過這一手段,Windows9x系統為普通應用程序留下了擴充接口。很不幸,這一技術同樣為病毒所利用,CIH病毒正是利用了VxD技術才得以駐留內存、傳染執行文件、毀壞硬盤和FlashBIOS。
Windows9x系統下有眾多的VxD,每個VxD可提供4種服務,即PM(保護模式)API、V86(虛擬86)API、Win32服務和VxD服務,前3種分別供應用程序在16位保護模式、V86模式以及32位保護模式下調用,VxD服務則只供其他VxD使用用戶開發的VxD可提供任意上述服務。除此之外,應用程序還可通過調用API函數DeviceIoControl與支持IOCTL接口的VxD進行通信,執行Win32API不支持的系統低級操作。
二、VxD技術的實現
VxD的操作基於寄存器,所以一般用匯編語言編寫,它的關鍵部分是一個和普通窗口的消息處理過程WndProc相類似的控制過程,不同之處在於它的處理對象是系統發來的控制消息。這些消息共51種,在VxD自加載至卸出整個生命周期內,操作系統不斷向它發送各種控制消息,VxD根據自己的需要選擇處理,其余的忽略。系統向VxD發送控制消息時將消息代號放在EAX寄存器中並在EBX寄存器中放系統虛擬機(VM)句柄。
對動態VxD來說,最重要的消息有三個:SYS_DYNAMIC_DEVICE_INIT、SYS_DYNAMIC_DEVICE_EXIT以及W32_DEVICEIOCONTROL,消息代號分別是1Bh、1Ch、23h。當VxD被動態加載至內存時。
系統向其發送SYS_DYNAMIC_DEVICE_INIT消息,VxD應在此時完成初始化設置並建立必要的數據結構;當VxD將被卸出內存時,系統向其發送SYS_DYNAMIC_DEVICE_EXIT消息VxD在收到後應清除所作設置並釋放相關數據結構;當應用程序調用API函數DeviceIoControl與VxD進行通信時,系統向VxD發送W32_DEVICEIOCONTROL消息,它是應用程序和VxD聯系的重要手段,此時ESI寄存器指向一個DIOCParams結構,VxD從輸入緩沖區獲取應用程序傳來數據,相應處理後將結果放在輸出緩沖區回送應用程序,達到相互傳遞數據的目的。
應用程序向VxD發出DeviceIoControl調用時,第2個參數用於指定進行何種控制,控制過程從DIOCParams結構+0Ch處取得此控制碼再進行相應處理控制碼的代號和含義由應用程序和VxD自行約定,系統預定義了DIOC_GETVERSION (0)和DIOC_CLOSEHANDLE(-1)兩個控制碼,當應用程序調用API函數CreateFile("\\.\VxDName",...)動態加載一VxD時,系統首先向該VxD的控制過程發送SYS_DYNAMIC_DEVICE_INIT控制消息,若VxD返回成功,系統將再次向VxD發送帶有控制碼DIOC_OPEN(即DIOC_GETVERSION,值為0)的W32_DEVICEIOCONTROL消息以決定此VxD是否能夠支持設備IOCTL接口,VxD必須清零EAX寄存器以表明支持IOCTL接口,這時CreateFile將返回一個設備句柄hDevice,通過它應用程序才能使用DeviceIoControl函數對VxD進行控制。
同一個VxD可用CreateFile打開多次,每次打開時都會返回此VxD的一個唯一句柄,但是系統內存中只保留一份VxD,系統為每個VxD維護一個引用計數,每打開一次計數值加1。當應用程序調用API函數CloseHandle(hDevice)關閉VxD句柄時,VxD將收到系統發來的帶控制碼DIOC_CLOSEHANDLEW32_DEVICEIOCONTROL消息,同時該VxD的引用計數減1,當最終引用計數為0時,系統向VxD發送控制消息SYS_DYNAMIC_DEVICE_EXIT,然後將其從內存中清除。在極少數情況下應用程序也可調用API函數DeleteFile("\\.\VxDName")忽略引用計數的值直接將VxD卸出內存,這將給使用同一VxD的其他應用程序造成毀滅性影響,應避免使用。
--一個典型的VxD控制過程代碼如下:
BeginProcVXD_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]
;從DIOC Params+0Ch處取控制碼
....
;處理控制碼
EndProcVXD_Control
三、實時反病毒的關鍵技術-FileHooking
應用程序通過使用動態加載的VxD,間接獲得了對Windows9x系統的控制權,但要實現對系統中所有文件I/O操作的實時監視,還要用到另一種關鍵技術-FileHooking,通過掛接一個處理函數,截獲所有與文件I/O操作有關的系
統調用。Windows9x使用32位保護模式可安裝文件系統(IFS),由可安裝文件系統管理器(IFSManager)協調對文件系統和設備的訪問,它接收以Win32API函數調用形式向系統發出的文件I/O請求,再將請求轉給文件系統驅動程序FSD,由它調用低級別的IOS系統實現最終訪問。每個文件I/OAPI調用都有一個特定的FSD函數與之對應,IFSManager負責完成由API到FSD的參數裝配工作,在完成文件I/OAPI函數參數的裝配之後轉相應FSD執行之前,它會調用一個稱為FileSystemApiHookFunction的Hooker函數。通過安裝自己的Hooker函數,就可以截獲系統內所有對文件I/O的API調用,並適時對相關文件進行病毒檢查,從而實現實時監控。
上述過程由用戶VxD調用系統VxDIFSMgr提供的服務完成,該VxD提供了豐富的底層文件操作功能:IFSMgr_InstallSyatemApiHook函數用來安裝FileSystemApiHookFunction,IFSMgr_RemoveSystemApiHook用來卸除Hooker,IFSMgr_Ring0_FileIO用來對文件和磁盤扇區進行讀寫訪問等等。當由IFSManager轉入SystemApiHookFunction時,帶有6個參數:
FileSystemApiHookFunction(
pIFSFuncFSDFnAddr, //對應FSD服務函數地址
intFunctionNum, //與API對應的FSD服務功能號(詳見下面)
intDrive, //驅動器代號(1=A,2=B,3=C...)
intResourceFlags, //資源標志(詳見下面)
intCodePage, //代碼頁(0=ANSI,1=OEM)
pioreqpir //指向IOREQ結構的指針
)
參數中比較重要的是FSD功能號、驅動器號和IOREQ結構指針3項。如需截獲某個文件I/OAPI調用,只需在Hooker中對相應FSD功能號進行處理
系統中可掛接多個Hooker,形成一條鏈。IFSMgr_InstallFileSystemApiHook安裝Hooker成功時返回前一個Hooker地址,每個Hooker在做特定處理後總應調用前一個Hooker,最後安裝的Hooker最先被調用。在VxD中調用其他VxD服務采用INT20h指令後跟一個雙字的特殊格式,其中高字為被調用VxD的ID號(系統VxD的ID固定),低字為該VxD之服務號,這一形式稱為VxDcall,如:
int20h
dd00400043h
;VxDCallIFSMgr_InstallSystemApiHook
int20h
dd00400044h
;VxDCallIFSMgr_RemoveSystemApiHook