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