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