文件过滤驱动开发

文件过滤驱动

一、文件透明加解密

关键字:透明、文件过滤驱动、加密标识,缓存

文件过滤驱动最重要的两点是搞定加密标识和缓存管理

1、透明概念:

透明指的是用户在操作的时候,虽然后台在自动的进行加解密,但是用户根本就不知道加密的存在,就像中间隔了一层透明的玻璃一样。

透明的好处在于不改变用户的操作,一切都和加密之前一样,甚至在有些企业安装加密后都无需通知所有的员工,就像加密并不存在一样,只是加密文件到了企业安全环境的外部才会发现文件无法打开。

透明的程度也是加密软件一个很重要的方面,例如:正在编辑一个Word文件时,能否拷贝或者使用其他程序来读取这个文件,如果不能那么这里就不够透明,在一些PDM的文档管理软件中就是文件在一个应用程序打开状态时另一个应用程序进行检入。透明的程度越高,用户使用时就越是和未加密时一样,透明程序越低用户就会发现有越多的操作受到限制,和加密前有较大的差异。

2、加密类型:


加密类型


加密原理


举例


静态加密


把整个文件加密掉、或者把整个文件加密掉。


动态加密


文件整体是加密状态,需要解密时读取多少就解密多少,写入多少就加密多少,而不需要把整个文件都解密掉。


主动加密


由使用者自行要求文件变成加密状态称之为主动加密


主动加密的方式很多,例如用WinRar把文件压缩并定义一个口令,或者给Word、Excel文件一个打开或者修改的口令,这样其他人使用时必须由正确的口令才能打开,这是使用者主动进行的加密,如果使用者不进行加密则文件不会在加密状态。只针对某些文件夹加密的方式也可以理解为主动加密方式。主动加密主要应用于个人的文件保护。


被动加密


使用者并不知道或者并不想文件变成加密状态,系统自动将文件加密,称之为被动加密。


被动加密主要用于企业内部防止文件泄密,即使使用者不想文件被加密,系统还是会根据定义加密文件,这样文件被拷贝等各种方法脱离企业环境后,由于文件在加密状态而无法打开。被动加密具有另一个特性就是透明操作,即使用者并不需要进行加密和解密操作,一切都是后台自动完成,使用者可以不知道加密的存在。被动加密与作者的意愿无关,相关文件都会被加密,磁盘加密和文件透明加解密属于此类。

3、文件过滤驱动怎样加密:

文件过滤驱动是微软公开支持进行文件加密的技术手段,在驱动的层次定义中,微软定义了杀毒、压缩、加密等各种功能层次,加密的定义如下:
     Load Order Group:FSFilter Encryption ,Altitude Range:140000-149999

由于文件过滤驱动处于驱动层面(不像API Hook处于应用层),可以控制系统的更多细节,和应用程序的关联度很小,可以兼容所有的应用程序,使用文件过滤驱动更利于进行动态加解密的处理。

API Hook 主要是拦截打开和关闭的动作,在这2个动作里做文件的静态加解密处理;而文件过滤驱动主要拦截的读和写的动作,在这2个IRP请求中进行动态的加解密处理,处理的内容很精确(读多少解密多少、写多少加密多少),由于动态加解密实际上处理的大多数都是缓存,没有磁盘IO操作速度更快。当然文件过滤驱动中进行动态加解密的技术难度也要大得多。

由于原有的Legacy Filter架构在很多杀毒等软件中使用,微软于近几年推出了MiniFilter架构,旨在减少各驱动间的冲突,提高工作效率,是微软大力推广的技术架构,可以在后续的各种新操作系统中使用而不用担心。MiniFilter具有兼容、高效、标准、稳定等各种优点。

4、文件加密标记:

加密标记是指如何判断一个文件是否加密的关键,也是在做动态透明加解密开发中最为重要的一环,加密标记的正确与否决定了文件是否会丢失、损坏,是必须要保证不能出任何问题的技术关键点。加密标记一般可存放在文件外部和文件内部,存放于文件内部时,又常分为存放在文件头上、文件尾上、压缩在文件内等三类技术方法,相关介绍如下:


序号


标记存储位置


类型


文件变长


方法


1


数据库中


文件外部



文件的加密状态记录在数据库中,判断文件加密状态时读取数据库,缺点巨大,在驱动中是很难访问数据库的,且若数据库丢失则所有文件都可能无法打开了。


2


文件目录中


文件外部



文件的加密状态记录在其所在的目录中,文件所属目录变化时程序需要处理各种细节,且存在记录丢失整个目录文件无法打开的可能性。


3


文件名上


文件内部



将文件的名字加上一个后缀来识别是否加密过且使用技术手段对用户隐藏掉这个后缀,通用性不好且容易被人为不小心去掉加密标记。


4


文件属性里


文件内部



将文件的时间或者其他属性改变一下,例如将时间加上1000年且向用户隐藏掉这个变化,通用性太差且加密标记极易丢失。


5


压缩在文件里


文件内部



最好的思路可惜无法兼容所有的文件,一方面如果文件太小,可能很难进行压缩,对于一些压缩软件产生的压缩文件无法继续压缩等,通用性很差。


6


文件头上


文件内部



在文件头部附加一段内容来记录文件的加密标记,和文件尾的对比见图1


7


文件尾上


文件内部



在文件尾部附加一段内容来记录文件的加密标记,和文件头的对比见图1

实际上,考虑到整体系统的稳定性和可管理性,文件的加密标记存放在文件内部,更能保证标记的可靠性、恒久性和通用性,而使用重定向原理时由于是静态加解密,加密标记存放位置对此类产品的影响不大。我们这里把使用动态加解密原理时的文件头和文件尾技术进行对比:

假设一个文件的开头位置是P1,结束位置是P2,加密标记的长度是L,带文件头和带文件尾有不同的状态,然后需要发出一个写操作从Pw1位置写到Pw2位置,此事写操作会超过原有的结束位置P2,如图1

图1 动态加解密时文件头和文件尾对比

文件头标记的处理方法:仅改变写入位置参数将Pw1= Pw1+L然后加密Pw2-Pw1这段内容并传递下去。
    文件尾标记的处理方法也有两种:一种方法是将L段加密标记复制到内存中,然后加密Pw2-Pw1这段内容并原位置传递下去,再到Pw2的位置把L段加密标记接上去;另一种方法是先到Pw2的位置复制L段加密标记并接上去,然后加密Pw2-Pw1这段内容并原位置传递下去。

从以上分析可以看出,在文件尾加标记会导致加长写文件时软件要多执行一个动作,就是移动尾部加密标记的动作,如果完成第一个动作后由于掉电或其他原因未能完成第二个动作,那么文件就会被损坏。不论是加长写文件还是缩短写文件都需要把加密标记不断移动,可能在一个文档的一个保存操作中这种动作会执行几十上百次。
    当然计算机掉电本来就有可能造成文件的损坏,但使用文件头标记不会造成多余的动作,也就意味着使用文件头存放加密标记在文件损坏的概率与文件未加密时是相等的,没有扩大文件损坏的概率。

5、文件加密逻辑,文件后缀

文件的加密逻辑有2种方法

1、加密指定后缀:

通过指定后缀加密是指保密程序对生成的某一类文档进行加密,而对其他后缀仍然采用明文。其优点是只加密制定类型的文档,而不影响其它文件,在加密范围上相对较小,系统的稳定性容易提高;缺点是可能产生“另存为其他类型的文档”的泄密漏洞,因为此时存储的结果并不是被指定加密的文件类型。即使把程序可能产生的后缀格式都指定也没有用,因为有很多办法另存出来 ,例如在Word中可以点击另存为然后在文件名栏输入2个双引号("),然后在这2个双引号之间输入任意后缀(例如test.123),那么保存后的文件就是明文的,拷贝出来文件名改回doc后缀就可能导致文档泄密。
     而且有些程序的文件格式没有定式,甚至可以保存为任意后缀,例如记事本,这样加密指定的文件后缀就带来了安全漏洞。

2、加密不区分后缀:

加密不区分后缀是指保密程序对生成的所有文件都进行加密。这种加密方式由于对指定进程产生的任何文件都加密从而堵住“另存为其他类型的文档”的漏洞,可保证不论用户如何将文件另存都不会出现明文文件。其工作原理为指定进程只要发生写操作就加密被写的文件,任何中间文件和临时文件都会被加密。不区分文件后缀有更高的安全性,技术难度也大得多。

加密不区分后缀的透明加密产品开发的层面有两个:应用层和驱动层,应用层基本上采用重定向原理+加密指定后缀;驱动层可能为2×2的组合即4种模式,如下表所示:


加密指定后缀


加密不区分后缀


重定向原理


重定向原理+加密指定后缀(1)


重定向原理+加密不区分后缀(2)


动态加解密原理


动态加解密原理+加密指定后缀(3)


动态加解密原理+加密不区分后缀(4)

上表中模式2技术实现上很困难,所以实际上驱动层加密一般采用模式(1)-模式(3)-模式(4)。
     还可能将加解密操作在应用层和驱动层中混合完成,在驱动层拦截文件打开然后传递给应用层加解密,这种方法和纯应用层开发是一样只能采用模式(1)。

二、文档加密流程讲解

1、基本知识讲解

基本流程

1、读流程

2、写流程

需要判断的的IRP标识介绍:

1、IRP_MN_MDL

IoStatus.Information field字段表明有写入MDL的字节数

主要是调用者需要fsd够着写入文件的MDL,fsd来分配和构造MDL

2、IRP_MN_MDL_COMPLETE

表示调用者已经处理完fsd创建的mdl,由mdl来清除和释放mdl

3、IRP_MN_DPC

表示调用者的上下文环境是DPC,fsd必须返回STATUS_PENDING,并且在工作线程中完成此历程

2、主要数据结构

FileObject,打开一个文件,io管理器为其创建一个文件对象结构

FCB,一个文件可能被多个程序同时打开,这样会生成多个FileObject,但是只存在一个FCB

段对象指针

FILE_CONTEXT

2、加解密算法

RC4流加密

密钥为静态密钥

3、读写流程

读过滤条件

A、过滤标志g_bStartFilter是否启动

B、判断pFileObj->FsContext是否存在

C、IrpSp->MinorFunction判断是否为 IRP_MN_COMPLETE_MDL

D、是否为目录操作

获取读文件的读取的长度,起始位置,读取内容:

文件的长度:

Length= IrpSp->Parameters.Read.Length;

文件的偏移量:

Offser.QuadPart= IrpSp->Parameters.Read.ByteOffset.QuadPart

文件内容:

Irp-> MdlAddress不为空,则使用Irp-> MdlAddress,缓冲区位置为MmGetSystemAddressForMdlSafe(Irp-> MdlAddres),否则直接使用Irp-> UserBuffer

#define CdMapUserBuffer(IC, UB) {                                              \

*(UB) = (PVOID) ( ((IC)->MdlAddress == NULL) ?                 \

(IC)->UserBuffer :                                     \

(MmGetSystemAddressForMdlSafe( (IC)->MdlAddress,HighPagePriority)));   \

}

写过滤条件

E、过滤标志g_bStartFilter是否启动

F、判断pFileObj->FsContext是否存在

G、IrpSp->MinorFunction判断是否为IRP_MN_MDL

H、是否为目录操作

 

文件的长度:

Length= IrpSp->Parameters.Write.Length

文件的偏移量:

LARGE_INTEGERlnOffset=IrpSp->Parameters.Write.ByteOffset;

文件内容:

Irp-> MdlAddress不为空,则使用Irp-> MdlAddress,缓冲区位置为MmGetSystemAddressForMdlSafe(Irp-> MdlAddres),否则直接使用Irp-> UserBuffer

#define CdMapUserBuffer(IC, UB) {                                              \

*(UB) = (PVOID) ( ((IC)->MdlAddress == NULL) ?                 \

(IC)->UserBuffer :                                     \

(MmGetSystemAddressForMdlSafe((IC)->MdlAddress, HighPagePriority)));

缓存管理

单缓存

„1、合法进程打开存在文件,关闭文档,明文保存在缓存,此时缓存没有刷

至硬盘,也没有清空内存中的资源。此时非法进程再打开文档,在

IRP_MJ_CREATE例程会刷新缓存操作,所以非法进程打开为乱码

„2、合法进程打开存在文件,明文保存在缓存,此时缓存没有刷至硬盘,也

没有清空内存中的资源。此时非法进程再打开文档,如果是word这种占着句

柄没有关闭的文档,判断为非法进程,禁止打开;如果是notedpad采用内存

映射文件的方式的,句柄关闭,则非法进程打开正在被合法进程打开的文档,在IRP_MJ_CREATE例程会刷新缓存操作,所以非法进程打开为乱码

„3、非法进程打开未打开过的加密文档,密文。合法进程再打开加密文档,会先刷新缓存。

„4、合法进程打开加密文档,在关闭的时候在IRP_MJ_CLEANUP例程中对新

建的文件才刷新缓存

获取缓存资源的顺序:

文件系统资源最先获得

缓存管理器资源次之获得

VMM资源最后获得

附:

¢Minifilter相关资料

http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=B54730CF-8850-4531-B52B-BF28B324C662

http://www.microsoft.com/taiwan/whdc/driver/filterdrv/alt-range.mspx

http://www.microsoft.com/whdc/driver/filterdrv/default.mspx

参考资料

¢《File System Internals》

¢《Windows 文件系统过滤驱动开发教程》----楚狂人

¢《寒江独钓-----windows内核安全编程》

¢OSR DOC

¢http://bbs.driverdevelop.com

¢http://www.osronlne.com

¢http://www.rootkit.com

¢http://bbs.pediy.com

¢http://www.codeproject.com

参考:http://www.cnblogs.com/adylee/archive/2013/03/20/2971544.html

时间: 2024-10-05 23:44:19

文件过滤驱动开发的相关文章

文件过滤驱动开发入门笔记

转载(详细教程):http://blog.csdn.net/chenyujing1234/article/details/7565346 转载(文件驱动小例子SFilter):http://download.csdn.net/detail/wangqjpp/4826392 转载(楚狂人教程):http://blog.csdn.net/joshua_yu/article/details/589981 转载(Win7 VS2012 环境搭建教程):http://blog.sina.com.cn/s/

基于文件过滤驱动的透明加密那点事儿(转)

文件透明加密这点事儿,从2001年开始出现基于API HOOK的方式开始到现在,已经十几年了,有细心人按技术实现的方式将其细分为4代,分别是基于API HOOK的第一代技术.基于文件过滤驱动(加清缓存)的第二代技术.使用Layerfsd的双缓冲第三代技术和基于微软新一代minifilter框架的Layerfsd双缓冲第四代技术.第一代和第二代的技术划分基本上没有异议,所谓的第四代很多人并不认同,认为使用minifilter框架算不上是技术突破,其技术实现仍然是基于Layerfsd的双缓冲技术,没

文件过滤驱动实现目录重定向(一)good

文件过滤驱动拦截的IRP主要包括以下几个:IRP_MJ_CREATE,文件创建操作,文件的任何操作,都是从这里开始的.IRP_MJ_CLEANUP,文件的HANDLE句柄全部关闭会触发这个消息IRP_MJ_CLOSE,文件对象 FILE_OBJECT引用减为0,文件对象即将被删除时触发.IRP_MJ_READ.IRP_MJ_WRITE, 文件的读写操作IRP_MJ_QUERY_INFORMATION 查询文件信息,比如文件创建修改时间,文件大小等等.IRP_MJ_SET_INFORMATION

[转载]文件过滤驱动 文件系统激活通知 IoRegisterFsRegistrationChange函数实现

IoRegisterFsRegistrationChange 注册一个文件系统变动回调函数,用来被通知文件系统的激活和注销,激活是指第一次加载文件系统,当一个文件系统已经加载后,当加载一个同种文件系统的卷时,该文件系统就和激活没关系.话说该函数调用后,激活的文件系统会重新激活一遍,在2k SP4之后的系统都会这样做. 现在考虑下,这种机制是怎么实现的,猜测是在注册的时候,注册完成后,系统将各种类型的文件系统,都调用该回调函数一遍,来一次所有文件系统激活的通知.而事实上,也应该如此,reactOs

圈圈.第10章.USB过滤驱动开发.ZC资料

1.DriverStudio 的基本使用: 1.1.度娘 找到的文章:"DriverStudio 开发USB驱动程序 - CSDN博客.html"(https://blog.csdn.net/luckysolar/article/details/1478508?utm_source=jiancool) 里面有一句话:"通过快捷方式"Setup DDK and Start MSVC"来启动VC IDE",一直不知道怎么操作,∵这个快捷方式 我找不到

USB设备驱动开发之远程访问USB设备(二 USB设备虚拟端)

By Fanxiushu 2016-05-22 转载或引用请注明原始作者 接上文, 在处理好USB数据采集端的问题之后,接下来进入核心的部分,虚拟USB设备端的开发工作. 上文简单介绍过,需要开发虚拟总线驱动来模拟USB设备. 所谓虚拟总线驱动,就是安装于System系统设备下的一个驱动,由PnP管理器创建出一个虚拟的总线PDO设备, 我们的虚拟总线驱动Attach到这个PDO上,形成一个FDO功能设备驱动, 然后在我们的驱动中,根据需要创建出若干个 Child PDO设备, 这些 Child

File System Minifilter Drivers(文件系统微型过滤驱动)

问题: 公司之前有一套文件过滤驱动,但是在实施过程中经常出现问题,现在交由我维护.于是在边看代码的过程中,一边查看官方资料,进行整理. 这套文件过滤驱动的目的只要是根据应用层下发的策略来控制对某些特定文件的控制,例如根据后缀名来决定是否允许查看,是否允许查看指定目录啊之类的功能. 介绍: MSDN上对可安装的文件系统驱动介绍http://msdn.microsoft.com/en-us/library/windows/hardware/ff548143(v=vs.85).aspx:其中树形结构菜

Windows驱动开发(中间层)

Windows驱动开发 一.前言 依据<Windows内核安全与驱动开发>及MSDN等网络质料进行学习开发. 二.初步环境 1.下载安装WDK7.1.0(WinDDK\7600.16385.1) 地址:https://msdn.microsoft.com/en-us/windows/hardware/hh852365 2.下载InstDrv软件(用于安装.启动.停止.卸载驱动) 界面如下: 注:srvinstw.exe 也可以安装.卸载sys文件,但需要手动开启.关闭,即在cmd命令窗口下执行

行为驱动开发(BDD) - 深入了解

行为驱动开发(BDD) - 一个快速的描述和示例 BDD表示乙 ehavior e里文e才有发展.用于描述行为的语法是Gherkin. 这个想法是尽可能自然地描述一种语言应该发生什么. 如果你熟悉单元测试,并且很容易编写单元测试,那么你熟悉它们的阅读方式.根据测试需要覆盖的程度,可以很难弄清楚它的作用,因为毕竟只是代码. 只有开发人员才能真正了解那里发生了什么. BDD以不同的方式解决问题. 让我们来隐藏代码,开始一个对话,所以现在任何人都可以阅读一个场景并了解它的测试. 举一个例子: 给定第一