面向Windows的文件透明加解密解决方案(3)——透明加解密驱动程序一

来源:互联网 发布:淘宝客经典文案 编辑:程序博客网 时间:2024/05/21 21:35

   

.透明加解密驱动程序:


3.1.Windows文件系统及传统文件过滤驱动模型

 

  Windows 操作系统是基于分层思路设计的,每层由若干个组件组成。如图2.1.1,Windows 操作系统简化图所示,Windows 操作系统总体上分为用户层和内核层,内核层的接口对用户层的应用程序提供服务。在用户层,应用程序各自调用相应的Win32 子系统,Win32 子系统将应用程序调用的API 接口转化为Native API 接口。在Native API 接口中调用转化为对系统服务函数的调用,即Native API 穿过了用户层和内核层的界面,到达了内核层,系统服务函数通过I/O 管理器将消息传递给驱动程序。执行体组件提供了大量的内核函数供驱动程序调用,其中I/O 管理器负责发起I/O 请求,并且管理这些请求,使来自用户层的I/O 请求独立于设备,无论是对端口的读写、对键盘的访问,还是对磁盘文件的操作都统一为IRP(I/O Request Packages)的请求形式,IRP 被传递到具体设备的驱动程序,驱动程序负责“完成”这些IRP,之后将结果返回给用户层的应用程序。图2.1.2即展示了用户应用程序在一个开启了缓存机制的文件上的读写流程。



    传统的文件过滤驱动程序位于文件系统驱动程序之上,截获I/O 管理器发送给文件系统驱动程序的IRP 包。每个文件系统驱动程序和过滤驱动程序都有唯一的控制设备对象CDO(Control Device Object),文件系统过滤驱动就是通过把自己的CDO 绑定到文件系统驱动的CDO 上来实现截获文件系统驱动程序的IRP 包。由于Windows 操作系统内核异常复杂在传统的过滤驱动模型中,开发者需要自己处理一系列系统机制的问题,例如建立数据结构来保存处理对象的上下文信息,新建并发送IRP 来查询某些状态,并且需要提供机制预防IRP重入,重入是指的是当前处理的请求会产生新的请求,然后这个请求又被过滤驱动捕获到陷入递归的问题。于是微软引入了一个新的文件过滤驱动框架——Minifilter,用以解决传统过滤驱动开发中的难题。

3.2Minifilter模型简介

Minifilter基于Microsoft公司对于传统型的文件系统过滤驱动整合的基础上提出的过滤管理器(Filter Manager)所提供的接口,使过滤驱动的开发具有了更好的鲁棒性与可移植性。

2.2.1展示了WDK中提供的示例Minifilter模型的框架示意。


Minifilter框架与Legacy Filter框架比较:

l 兼容性

Minifilter模型相对Legacy Filtersfilter模型具有更好的兼容性,不仅仅指在和其它Filter共处时的兼容性,它更多的是对Windows后续版本的兼容性。随着Windows XP系统即将退出历史的舞台,Windows NT 6.X 系列各个版本相继发布,在实际的公司中往往多个版本的操作系统共存,基于Minifilter框架开发的文件透明加密系统可以实现更好地兼容性并且对于用户其他行为的干扰也是较小

  • 文件重入

文件重入问题类似于死锁,指驱动在处理某IRP请求时必须发出并且等待NewIRP的执行结果,而NewIRP又被发送给了驱动本身,最终导致驱动陷入死循环之中而导致用户的请求无法正确及时处理。在WDKWindows提供了IoCreateFileSpecifyDeviceObjectHint函数来实现直接向下层设备打开一个文件对象,但是这个函数的兼容性较差。而Minifilter中提供了这类接口有:FltCreateFileEx),FltReadFile 和 FltWriteFile等,较好地解决了文件重入的问题。

  • 用户态与核心态的双向通信机制

传统的驱动程序与应用程序交互方式采取共享内存、事件驱动的异步/同步通信,通信效率较低开发难度大。Minifilter有内建支持的通信API并且建立了通信端口方便用户交互信息。

  • 上下文的安全管理

传统的文件透明加密驱动中需要对于机密文件进行计数处理(也就是上下文管理),但是由于Microsoft未公布NTFS的源代码,无法获取NTFSFCB的结构体,使得对于FCB的计数与控制存在着一定的困难。Filter Manager 提供了上下文(context)来了解属于自己的对象状态,对于文件一般使用流上下文(StreamContext)来追踪,并且可以把对此文件的操

作状态作为标志位记录在流上下文中。初次打开一个文件对象时,通常调用FltAllocateContext 函数申请一块内存区域,然后调用FltSetStreamContext 将其附着在这个文件对象上,然后在在上下文中记录一些有用的标志位,在其他操作中可以根据这些标志位对文件对象进行适当的操作,每当处理完一个context 之后要调用FltReleaseContext 释放这块内存空间。



0 0