文件过滤驱动FSFilter引言文件系统程序是操作系统核心的部分,对于Windows操作系统来讲,文件系统和网络部分并列为驱动程序中最难的部分,难度大大超过声卡、显卡之类的硬件驱动程序。深入学习和调试文件驱动程序,文件过滤驱动程序,更有助于学习Windows系统底层核心技术。本胶片主要介绍文件过滤驱动开发和其应用:透明加解密,胶片内容比较广泛,希望能够普及这方面的知识,希望更多有兴趣的人一起研究,一起进步。学习曲线Windows系统Windows开发C/C++MFC机制COM机制进程、线程、内存管理PE文件格式、SHE机制HOOK技术、反汇编。。。文件过滤驱动应用层驱动开发缓存管理文件头标识存放密钥、策略管理读写加解密处理。。。驱动层文件系统进程、线程、内存机制核心数据结构。。。大纲驱动开发简介开发特点开发要素文件过滤驱动基本概念分发函数设备绑定读写过滤文件路径获取透明加解密简介概念类型和逻辑流程基本数据结构重要技术难点透明加解密开发怎样开发透明加解密程序开发参考框架代码,Sfilter、Filemon、Filespy、toolflat的代码微过滤驱动Minifilter架构开发工具小集合DSM透明加解密技术透明加解密发展驱动开发特点编程资料较少,微软提供接口和文档很少,经常需要反汇编、逆向在Ring0特级运行,权力很大,代码安全要求比较高不能采用VC直接调试,单机调试比较困难,必须采用windbg双机调试(Windbg+Vmare)定位问题困难,编程出错容易照成蓝屏,后果比较严重稳定周期较长兼容性测试最重要(各种防火墙软件、防病毒软件、主动防御软件、Rookit技术软件等等)Windows操作系统的升级导致驱动不能平滑过渡(win98/wind2000/winxp/vista/windows7)编程模式周期长调试困难驱动开发字符串操作进程空间、线程上下文内存分配线程互斥访问数据结构(双链表)中断优先级DeviceObject、DriverObjectIrp理解文件过滤驱动1.基本概念2.分发函数3.设备绑定4.读写过滤5.文件路径获取基本概念卷,有卷管理器生成,一个卷一般对应一个逻辑盘文件系统NTFS:ntfs.sysFAT32:fastfat.sysCDFS:cdfs.sys1.文件系统拥有两类设备:控制设备,卷设备。2.如C:、D:为ntfs,E:F:为FAT32,那么E:、F:为FAT32文件系统的两个卷设备,而C:、D:为NTFS文件系统的两个卷设备3.文件操作针的irp都是发到卷设备上,发给控制设备的irp主功能号为IRP_MJ_FILE_SYSTEM_CONTROL,发给卷设备的irp一般都是文件操作irp分发函数主功能IRPDriverObject-MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL]=FsControl;DriverObject-MajorFunction[IRP_MJ_DIRECTORY_CONTROL]=DispatchDirectoryControl;DriverObject-MajorFunction[IRP_MJ_CREATE]=DispatchCreate;DriverObject-MajorFunction[IRP_MJ_READ]=DispatchRead;DriverObject-MajorFunction[IRP_MJ_WRITE]=DispatchWrite;DriverObject-MajorFunction[IRP_MJ_SET_INFORMATION]=DispatchSetInfo;DriverObject-MajorFunction[IRP_MJ_CLOSE]=DispatchClose;DriverObject-MajorFunction[IRP_MJ_CLEANUP]=DispatchClean;DriverObject-MajorFunction[IRP_MJ_DEVICE_CONTROL]=DispatchDeviceIoControl;FAstIO注册这些函数后,一般不做任何处理直接返回快速IO主要是当文件数据存在缓存里面时,windows为了提高性能,直接向缓存管理器放送快速io去缓存获取数据设备绑定创建控制设备对象,对象类型必须FILE_DEVICE_DISK_FILE_SYSTEM调用IoRegisterFsRegistrationChange,注册文件系统激活或者卸载的回调函数,文件系统常用的为ntfs、fat32、cdfs,默认情况下,文件系统是存在的,没有触发激活机制,这时候在xp和windows2000sp4以上,仍然会触发调用注册的回调函生成设备附加到文件系统上,这样能监控到文件系统的irp,主要是监控此irpIRP_MJ_FILE_SYSTEM_CONTROL,在此irp中监控卷的挂载和卸载在卷的挂载过程中,生成设备附加到卷上,这样才完成设备的附加,做完此操作后,就能监控到所有卷上的文件操作irp读写过滤如何获取到读取的内容,取决于irp操作的io方式:缓冲方式、直接方式、其他方式缓冲方式:在文件读写请求中没有出现过,这种方式的特点是缓冲从发出irp的应用程序的用户空间,拷贝一份到内核空间,不同进程空间的内存各自生效,但是需要拷贝一份,效率较低直接方式是用MDL来传递缓冲区,将用户空间的地址范围直接映射到内核空间,这里面要修改页表的属性其他方式就是直接把用户空间的指针传递到内核空间,不做任何处理,这个指针就是irp-UserBuffer读写过滤读操作文件的长度:Length=IrpSp-Parameters.Read.Length;文件的偏移量:Offser.QuadPart=IrpSp-Parameters.Read.ByteOffset.QuadPart文件内容:Irp-MdlAddress不为空,则使用Irp-MdlAddress,缓冲区位置为MmGetSystemAddressForMdlSafe(Irp-MdlAddres),否则直接使用Irp-UserBuffer#defineCdMapUserBuffer(IC,UB){\*(UB)=(PVOID)(((IC)-MdlAddress==NULL)?\(IC)-UserBuffer:\(MmGetSystemAddressForMdlSafe((IC)-MdlAddress,HighPagePriority)));\}写操作文件的长度:Length=IrpSp-Parameters.Write.Length文件的偏移量:LARGE_INTEGERlnOffset=IrpSp-Parameters.Write.ByteOffset;文件内容:Irp-MdlAddress不为空,则使用Irp-MdlAddress,缓冲区位置为MmGetSystemAddressForMdlSafe(Irp-MdlAddres),否则直接使用Irp-UserBuffer#defineCdMapUserBuffer(IC,UB){\*(UB)=(PVOID)(((IC)-MdlAddress==NULL)?\(IC)-UserBuffer:\(MmGetSystemAddressForMdlSafe((IC)-MdlAddress,HighPagePriority)));\文件路径获取在文件创建时获取文件路径透明加解密简介1.概念2.类型和逻辑3.流程4.基本数据结构5.重要技术难点概念透明指的是用户在操作的时候,虽然后台在自动的进行加解密,但是用户根本就不知道加密的存在,就像中间隔了一层透明的玻璃一样。透明的好处在于不改变用户的操作,一切都和加密之前一样,甚至在有些企业安装加密后都无需通知所有的员工,就像加密并不存在一样,只是加密文件到了企业安全环境的外部才会发现文件无法打开类型和逻辑加密类型加密原理举例静态加密把整个文件加密掉、或者把整个文件加密掉。动态加密文件整体是加密状态,需要解密时读取多少就解密多少,写入多少就加密多少,而不需要把整个文件都解密掉。主动加密由使用者自行要求文件变成加密状态称之为主动加密主动加密的方式很多,例如用WinRar把文件压缩并定义一个口令,或者给Word、Excel文件一个打开或者修改的口令,这样其他人使用时必须由正确的口令才能打开,这是使用者主动进行的加密,如果使用者不进行加密则文件不会在加密状态。只针对某些文件夹加密的方式也可以理解为主动加密方式。主动加密主要应用于个人的文件保护。被动加密使用者并不知道或者并不想文件变成加密状态,系统自动将文件加密,称之为被动加密。被动加密主要用于企业内部防止文件泄密,即使使用者不想文件被加密,系统还是会根据定义加密文件,这样文件被拷贝等各种方法脱离企业环境后,由于文件在加密状态而无法打开。被动加密具有另一个特性就是透明操作,即使用者并不需要进行加密和解密操作,一切都是后台自动完成,使用者可以不知道加密的存在。被动加密与作者的意愿无关,相关文件都会被加密,磁盘加密和文件透明加解密属于此类。类型和逻辑1、加密指定后缀:通过指定后缀加密是指保密程序对生成的某一类文档进行加密,而对其他后缀仍然采用明文。其优点是只加密制定类型的文档,而不影响其它文件,在加密范围上相对较小,系统的稳定性容易提高;缺点是可能产生“另存为其他类型的文档”的泄密漏洞,因为此时存储的结果并不是被指定加密的文件类型。即使把程序可能产生的后缀格式都指定也没有用,因为有很多办法另存出来,例如在Word中可以点击另存为然后在文件名栏输入2个双引号(“),然后在这2个双引号之间输入任意后缀(例如test.123),那么保存后的文件就是明文的,拷贝出来文件名改回doc后缀就可能导致文档泄密。而且有些程序的文件格式没有定式,甚至可以保存为任意后缀,例如记事本,这样加密指定的文件后缀就带来了安全漏洞。2、加密不区分后缀:加密不区分后缀是指保密程序对生成的所有文件都进行加密。这种加密方式由于对指定进程产生的任何文件都加密从而堵住“另存为其他类型的文档”的漏洞,可保证不论用户如何将文件另存都不会出现明文文件。其工作原理为指定进程只要发生写操作就加密被写的文件,任何中间文件和临时文件都会被加密。不区分文件后缀有更高的安全性,技术难度也大得多。类型和逻辑加密指定后缀加密不区分后缀重定向原理重定向原理+加密指定后缀(1)重定向原理+加密不区分后缀(2)透明加解密原理动态加解密原理+加密指定后缀(3)动态加解密原理+加密不区分后缀(4)基本流程读流程基本流程写流程基本数据结构FileObject,打开一个文件,io管理器为其创建一个文件对象结构FCB,一个文件可能被多个程序同时打开,这样会生成多个FileObject,但是只存在一个FCB段对象指针重要技术难点缓存管理单缓存合法进程打开存在文件,关闭文档,明文保存在缓存,此时缓存没有刷至硬盘,也没有清空内存中的资源。此时非法进程再打开文档,在IRP_MJ_CREATE例程会刷新缓存操作,所以非法进程打开为乱码合法进程打开存在文件,明文保存在缓存,此时缓存没有刷至硬盘,也没有清空内存中的资源。此时非法进程再打开文档,如果是word这种占着句柄没有关闭的文档,判断为非法进程,禁止打开;如果是notedpad采用内存映射文件的方式的,句柄关闭,则非法进程打开正在被合法进程打开的文档,在IRP_MJ_CREATE例程会刷新缓存操作,所以非法进程打开为乱码非法进程打开未打开过的加密文档,密文。合法进程再打开加密文档,会先刷新缓存。合法进程打开加密文档,在关闭的时候在IRP_MJ_CLEANUP例程中对新建的文件才刷新缓存获取缓存资源的顺序:文件系统资源最先获得缓存管理