Skip to content

介绍minifilter框架和一些概念

hkx3upper edited this page May 29, 2022 · 7 revisions

1.重要概念

本文使用了Fcb,FileObject,IRP,缓冲,NonCachedIo等概念,在正文开始之前,对这些概念进行描述。
(1)Fcb:文件控制块,由文件系统驱动维护的一块结构体,其中保存文件的一些信息,通常情况下一个文件只有一个fcb。
(2)FileObject:文件对象,类似于文件的一个打开实例,一个文件的fcb可以对应多个FileObject。文件的打开操作、写操作和读操作等都是操作的FileObject。由IO管理器创建并初始化,由文件系统驱动填写FileObject一些文件的信息。
(3)IRP:即IO请求数据包,应用程序打开、读写、关闭文件时,通过系统调用进入操作系统内核,由I/O管理器做一些参数检查的工作,再把参数封装成IRP包,传到文件系统驱动中,文件系统驱动处理完(比如从磁盘或Cache中读取数据)以后,再将一些返回值填到IRP中,回传到I/O管理器。
(4)缓冲:为了提高文件系统读写文件的效率,通常并不是每次读写都要去和磁盘交互,所以缓冲管理器维护了一块内存,由缓冲管理器去判断是否进行预读操作或者延迟写操作。
(5)NonCachedIo:非缓冲IO,就是文件系统驱动不建立缓冲,不从缓冲中读取已有的数据,直接去磁盘中读。写操作则直接写入到磁盘中。该标识要求操作的偏移和大小都要和扇区大小对齐。
(6)CachedIo:缓冲IO。读操作是从缓冲中读数据,如果缓冲中没有,就建立缓冲,并且由缓冲管理器以非缓冲IO发送IRP到文件系统驱动,从磁盘中读取数据。写操作则写入缓冲中,如果没有缓冲,就建立缓冲。
(7)PagingIo:分页IO,通常由内存管理器设置该标识,分页IO一定是非缓冲IO,优先级较高。在分页写请求和分页读请求时会提前取独占锁,而且分页写请求不允许扩展文件大小。
(8)内存映射读写是一种直接由内存管理器提供的接口,它读写的内存和缓冲读写的内存是一块内存,内存管理器和缓冲管理器都可以操作这块内存。如果内存中没有数据,同样由内存管理器以非缓冲IO发送IRP到文件系统驱动,从磁盘中读取数据。写操作同样由内存管理器负责,向磁盘中写入数据。


2.文件微过滤驱动minifilter介绍

Minifilter,即文件微过滤驱动,是Windows操作系统文件系统内的一个组件,由Filter Manager统一管理。通过在minifilter中注册想要监听的事件,它可以过滤包括打开 (Create)、读操作(Read)、写操作(Write)等由IO管理器发往文件系统的IRP请求。
如图1-1所示,本次操作是由应用程序发起的缓冲读操作,此时缓冲还未建立,所以IRP由IO管理器建立,经过minifilter发往文件系统驱动,然后文件系统驱动建立缓冲,由缓冲管理器以及内存管理器协同发起非缓冲分页读操作(箭头6),该请求被IO管理器封装为IRP,经过minifilter发往再次文件系统驱动,文件系统驱动从磁盘中读取文件(箭头7、8、9),然后逐步返回。
1-1 可见,每次IRP从IO管理器发往文件系统驱动时会进入minifilter一次,从文件系统驱动返回IO管理器也会进入minifilter,在读操作中,前者称为PreRead,后者称为PostRead。


3.项目的组成部分

如图1-2所示,项目分为三个模块:在Windows内核的minifilter模块,大部分功能实现于minifilter中;另外两个在桌面端,分别是特权加密解密模块,负责从桌面发送单独加密或解密文件的命令到minifilter;进程授权模块,负责添加或修改进程的权限。
1-2


4.使用的工具

(1)使用Windbg和VMware Workstation Pro中的Windows 10虚拟机进行串口调试。
(2)使用OsrLoader加载驱动,使用DebugView打印驱动输出信息。
(3)项目开发过程中,使用FileSpy抓取IRP,分析IRP参数。