首页  编辑  

VxD 技术及其在实时反病毒中的应用

Tags: /超级猛料/Core.驱动,VxD,服务/   Date Created:

VxD 技术及其在实时反病毒中的应用

----目前国内的Windows 9x

平台反病毒产品大多属静态反病毒软件,指导思想是"

以杀为主",这一方式的缺点是病毒在被清除之前可能早已造成了严重危害。一个好的反病毒软件应该是"

以防为主,以杀为辅",在病毒入侵时就把它清除掉,这就是实时反病毒技术。

----Windows 9x 使用Intel CPU 的Ring 0 和Ring 3

两个保护级。系统进程运行于Ring

0,因而具有对系统全部资源的访问权和管理权;而普通用户进程运行于Ring

3,只能访问自己的程序空间,不允许对系统资源进行直接访问,许多操作受到限制。显然这种普通用户进程是无法胜任实时反病毒工作的,必须使后台监视进程运行在Ring

0 优先级,实现这一目的基础就是VxD 技术。

一、VxD 技术的特点

----VxD 即虚拟设备驱动程序,用作Windows 9x

系统和物理设备之间的接口。但它不仅适用于硬件设备,也适用于按VxD

规范所编制的各种软件" 设备"。

----VxD 技术的实质是:通过加载具有Ring 0 最高优先级的VxD,运行于Ring 3

上的应用程序能够以一定的接口控制VxD

的动作,从而达到控制系统的目的。实时反病毒软件之所以要使用VxD

技术,关键有二:( 1) VxD 拥有系统最高运行权限( 2) 许多Windows 9x

系统底层功能只能在VxD 中调用,应用程序如果要用,必须编个VxD

作为中介。VxD

作为应用程序在系统中的一个代理,应用程序通过它来完成任何自己本身做不到的事情,通过这一手段,Windows

9x

系统为普通应用程序留下了扩充接口。很不幸,这一技术同样为病毒所利用,CIH

病毒正是利用了VxD 技术才得以驻留内存、传染执行文件、毁坏硬盘和Flash

BIOS。

----Windows 9x 系统下有众多的VxD,每个VxD 可提供4 种服务,即PM(

保护模式) API、V86( 虚拟86) API、Win32 服务和VxD 服务,前3

种分别供应用程序在16 位保护模式、V86 模式以及32 位保护模式下调用,VxD

服务则只供其他VxD 使用,用户开发的VxD

可提供任意上述服务。除此之外,应用程序还可通过调用API

函数DeviceIoControl 与支持IOCTL 接口的VxD 进行通信,执行Win32 API

不支持的系统低级操作。

二、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_ CLOSEHANDLE 的W32_DEVICEIOCONTROL

消息,同时该VxD 的引用计数减1,当最终引用计数为0 时,系统向VxD

发送控制消息SYS_DYNAMIC_DEVICE_EXIT,然后将其从内存中清除。在极少数情况下,应用程序也可调用API

函数DeleteFile("\\.\VxDName") 忽略引用计数的值直接将VxD

卸出内存,这将给使用同一VxD 的其他应用程序造成毁灭性影响,应避免使用。

----一个典型的VxD 控制过程代码如下:

   BeginProc VXD_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]

; 从DIOCParams +0Ch 处取控制码

      ....

; 处理控制码

EndProc VXD_Control

三、实时反病毒的关键技术-FileHooking

----应用程序通过使用动态加载的VxD,间接获得了对Windows 9x

系统的控制权,但要实现对系统中所有文件I/O

操作的实时监视,还要用到另一种关键技术-FileHooking,通过挂接一个处理函数,截获所有与文件I/O

操作有关的系统调用。Windows 9x 使用32

位保护模式可安装文件系统(IFS),由可安装文件系统管理器(IFS Manager)

协调对文件系统和设备的访问,它接收以Win32 API

函数调用形式向系统发出的文件I/O

请求,再将请求转给文件系统驱动程序FSD,由它调用低级别的IOS

系统实现最终访问。每个文件I/O API 调用都有一个特定的FSD

函数与之对应,IFS Manager 负责完成由API 到FSD

的参数装配工作,在完成文件I/O API 函数参数的装配之后转相应FSD

执行之前,它会调用一个称为FileSystemApiHookFunction 的Hooker

函数。通过安装自己的Hooker 函数,就可以截获系统内所有对文件I/O 的API

调用,并适时对相关文件进行病毒检查,从而实现实时监控。

----上述过程由用户VxD 调用系统VxD IFSMgr 提供的服务完成,该VxD

提供了丰富的底层文件操作功能: IFSMgr_InstallSyatemApiHook

函数用来安装FileSystemApiHookFunction,IFSMgr_RemoveSystemApiHook

用来卸除Hooker,IFSMgr_Ring0_FileIO

用来对文件和磁盘扇区进行读写访问等等。当由IFS Manager

转入SystemApiHookFunction 时,带有6 个参数:

FileSystemApiHookFunction(

pIFSFunc FSDFnAddr,

// 对应FSD 服务函数地址

int FunctionNum,  

// 与API 对应的FSD 服务功能号( 详见下面)

int Drive,          

// 驱动器代号(1=A, 2=B, 3=C ...)

int ResourceFlags,

// 资源标志( 详见下面)

int CodePage,        

// 代码页(0=ANSI,1=OEM)

pioreq pir        

// 指向IOREQ 结构的指针

)

----参数中比较重要的是FSD 功能号、驱动器号和IOREQ 结构指针3

项。如需截获某个文件I/O API 调用,只需在Hooker 中对相应FSD

功能号进行处理

----系统中可挂接多个Hooker,形成一条链。IFSMgr_InstallFileSystemApiHook

安装Hooker 成功时返回前一个Hooker 地址,每个Hooker

在做特定处理后总应调用前一个Hooker,最后安装的Hooker 最先被调用。在VxD

中调用其他VxD 服务采用INT 20h

指令后跟一个双字的特殊格式,其中高字为被调用VxD 的ID 号( 系统VxD 的ID

固定),低字为该VxD 之服务号,这一形式称为VxDcall,如:

int   20h

        dd   00400043h  

;VxDCall  IFSMgr_InstallSystemApiHook

        int   20h

        dd   00400044h  

;VxDCall  IFSMgr_RemoveSystemApiHook