程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> VxD技術及其在實時反病毒中的應用

VxD技術及其在實時反病毒中的應用

編輯:vc教程

目前國內的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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved