李凡刘学照卢安
(华中科技大学计算机科学与技术学院)
谢四江(北京
电子科技学院科研中心)
WindOwsNT
和基于NT内核的WindOws2000/XP操作系统中,通常需要通过开发文件系统过滤驱动程序来保证文件系统的信息安全运行,主要包括动态病毒扫描、透明文件加密解密、文件保护和系统恢复等功能。文件系统驱动程序(FileSystemDriver,简称FSD)管理文件系统格式。WindOwSNT的文件系统驱动程序是I/O子系统的一个组件,为用户提供在磁盘或者磁带等非易失性存储介质上存取数据服务。WindOwsNT的文件系统驱动程序和其他的设备驱动程序的一个主要的区别就在于文件系统驱动程序和内存管理器、高速缓存管理器有机的结合在一起,有着密不可分的关系。为了提高系统性能,FSD通常使用高速缓存(Cache)管理器以高速缓存文件数据。FSD还和内存管理器结合起来,以使内存映射文件能被正确实现_1J。本文首先探讨文件系统过滤驱动程序开发的原理和步骤,然后给出一个实现文件透明加密解密的实例。由于Wind0wSNT/20O0/XP操作系统的文件系统过滤驱动程序开发有着很类似的方面,下文中如果没有特别说明,则是针对以NT内核为基础的WindOwsNT/2000操作系统而言的。
1
文件系统过滤驱动程序开发
WindOwsNT
的I/O管理器是一个可扩展的结构,通过开发过滤驱动程序可以扩展I/O子系统的功能。I/O管理器支持分层驱动程序模型,每个I/O请求包(IRP)的处理分别经过各层驱动程序,直到某层驱动程序完成这个请求。这样第三方开发的驱动程序就有机会插入到这个层次结构中并获得截获及处理来自上层的操作请求的机会,把这种驱动程序称为过滤驱动程序。
文件系统过滤驱动程序是针对文件系统而言的。WindOwsNT的I/O管理器根据用户的文件操作请求构造IRP发到文件系统驱动程序,文件系统驱动程序把相应于文件系统的操作转换为相应于存储设备驱动程序的操作并通过I/O管理器来调用存储设备驱动程序。I/O管理器在发送操作请求到目标设备之前会检查是否有其他的设备附着于目标设备对象之上。通过构造附加的设备对象附着在文件系统或者存储设备对象之上,并为该设备对象指定专门的驱动程序,I/O管理器就会把要发送到目标设备的请求先发到附加的过滤设备,在该设备对应的过滤驱动程序中对原始请求加入附加的处理来实现对文件系统操作的截取、监控甚至替换。
文件系统过滤驱动程序可以附着在文件系统驱动程序之上,也可以加入到文件系统驱动程序和存储设备驱动程序之间,如图1所示。具体实现一个过滤驱动程序的基本步骤包括:构造一个设备对象(过滤设备)附着在目标设备上;在这个过滤设备对应的驱动程序(过滤驱动程序)中截取发送到目标设备的操作;在过滤操作中可能需要构造新的IRP来驱动下层驱动程序,也可能需要为某个IRP指定对应的完成例程以便这个IRP被下层驱动程序完成返回后调用;在合适的时候可以断开过滤程序。
图 1 文件系统过滤驱动程序在系统中的位置
2
文件透明加密解密的过滤器实例
下面给出一个在WindOwT下进行文件加密解密的过滤器具体实现过程。用户的数据在存储到磁盘上设定的安全区域(例如安全文件夹)之前经过了加密处理,读取时经过解密返回给用户,这个过程对用户来说是透明的。对这个安全区域访问时先要通过认证处理,这样就保证了安全区域里的数据安全。对于现有的WindOwsNT/2000/XP系列操作系统的文件系统本身来说,只是对WindOws2000/XP支持的5。0版本以上的NTFS文件系统本身实现了加密文件系统(EFS)。对所有文件系统分区的文件实现透明的加密解密并采用特殊的加密算法,就需要通过文件系统过滤驱动程序来实现。
在文件系统驱动程序和硬盘驱动程序之间加入过滤驱动程序。当文件系统驱动程序写硬盘的时候,过滤驱动程序首先对数据进行加密然后再调用硬盘驱动程序。当文件系统驱动程序读硬盘的时候,过滤驱动程序先调用硬盘驱动程序读取数据并对从硬盘返回的已加密数据进行解密,然后再返回给文件系统驱动程序。过滤器在系统中位于文件系统驱动程序和磁盘驱动程序之间。
要实现这个过滤器,首先需要把过滤器挂接在某个硬盘分区之上,可以在过滤驱动程序的DriverEntry例程或者应用程序中调用DeviceIO—COntrOl发送一个IOC~L请求驱动程序来挂接到硬盘上。该过程的函数调用过程为:由ZwCreate—File得到硬盘分区的设备句柄,再用ObRefer—enceObjectByHandle得到对应的FILE—OBJECT指针(wind0wsNT把每个设备当作一个文件来看待,并有一个对应的FILE—OBJECT结构描述其属性),调用IOGetRelatedDevieeObjeet得到硬盘分区设备对象指针。然后调用IOCreateDevice来构造代表过滤器的一个设备并为它指定驱动程序也就是过滤驱动程序。最后调用IOAttachDe—viceByPOinter把该设备挂接在硬盘分区设备上。这样文件系统驱动程序发送到这个硬盘分区设备的所有请求都会先经过过滤器。
硬盘驱动程序由DriverEntry提供一系列的IRP处理函数供高层驱动程序调用。在过滤驱动程序中实现加密解密是通过截取IRP_MJ_READ和IRP_MJ_WRITE来实现的。在过滤驱动程序的DriverEntry例程中指定处理函数:DriverObject->MajOrFunctiOn[IRP_MJ_WRITE] = MyFilterWrite;DriverObject->MajOrFunctiOn[IRP—MJ—READ] = MyFilterRead。
在IRP—MJ—WRITE的处理函数中如果需要加密处理就在非分页内存中分配一段与待写数据空间大小相同的内存,并把待写数据拷贝到这段内存中,对这段内存数据调用加密处理,建立这段内存的内存描述符MDL,更新IRP结构中的Irp->MdlAddress指向这个新建立的MDL,并记住原先的值。为这个IPR指定一个完成例程,接着调用下层的硬盘驱动程序写入已加密数据。硬盘驱动程序完成这个写操作并返回后,系统会调用指定的这个完成例程。在完成例程中恢复Irp->MdlAddress为原来的值并且释放原先分配的那段内存。
在IRP—MJ—READ的处理函数中解密是一个近似相反的过程。先直接调用硬盘驱动程序取得数据,然后在它的完成例程中对读取的数据进行解密返回上层驱动程序。
3
主要应用和展望
基于文件系统过滤驱动程序可以实现动态的病毒扫描。文件系统针对病毒的安全措施有两种:一种是以杀为主的静态反病毒措施,另一种是以防为主的动态反病毒措施。动态的反病毒措施也就是对病毒实时监控,这个可以通过文件系统过滤驱动程序来实现。基本方法是在文件系统驱动程序上面加入一个过滤驱动程序来过滤被病毒感染的文件。这个过滤驱动程序先于文件系统看到I/O操作请求,在截取到上层传下来的写操作请求时如果侦测到病毒特征就拒绝这个请求,保证硬盘数据的安全。
另外,利用文件系统过滤驱动程序可以实现分级的存储管理。举例来说,一个系统中有两个存储设备,一个存取速度很快价格很昂贵;另一个存取速度较慢但是价格便宜。可以作一个过滤驱动程序附着在文件系统驱动程序之上来优化系统性能。把不常用的数据放在慢速设备上,当截取到对这些数据的操作请求时先把这些数据转移到快速设备然后再向下传递原来的操作请求到文件系统驱动程序,这样就可以在现有设备不变的情况下获得更好的系统性能。
开发文件系统过滤驱动程序的用途在于它可以扩展、修改、甚至替代现有文件系统的操作而不用重新开发新的文件系统驱动程序。随着信息技术的发展和WindOwsNT应用的普及,文件系统过滤驱动程序的开发会有着更广泛的应用
posted on 2007-03-25 13:21
汤宛灵 阅读(1353)
评论(0) 编辑 收藏 引用 所属分类:
转载