MINIFILTER实现文件重定向之从分析到实现
本实验的试验环境为Windows Server 2008 R2 X64下。
为了解决系统关键目录或业务敏感目录被放入恶意可执行程序或网页文件中的问题,一些安全软件将使用文件过滤驱动的技术结合一定的检测规则来保护系统和业务安全。
简单看一下Minifilter技术介绍:
Filter管理器随Windows一起安装,但只有一个minifilter只有在驱动被加载时才能工作。Filter将将管理器绑定到目标卷的文件系统栈上。Minifilter驱动为它过滤I/O通过方向操作filter管理器注册间接绑定到文件系统栈。Filter管理器随Windows一起安装,但只有一个minifilter只有在驱动被加载时才能工作。Filter将将管理器绑定到目标卷的文件系统栈上。Minifilter驱动为它过滤I/O通过方向操作filter管理器注册间接绑定到文件系统栈。
微软的WDK通过使用实例REPARSE通过重定向完成跨盘重定向,并通过Minifilter使用IoCreateFileSpecifyDeviceObjectHint完成非跨盘重定向。
因此,我们的目标是先通过Windows一些内核代码可以看到为什么Reparse通过简单地配置监控路径和重定向后路径的驱动程序和应用控制程序,可以完成文件重定向功能。
通过源码查看文件创建源码的关键部分
虽然是Windows Server 2008 x64系统,但为了避免过多的反向分析,直接使用WRK作为目标(因为不能引用太多,尽量用文字描述),看能不能得到关于Reparse重定向结论。
创建文件的入口是IoCreateFile其主要工作原因IopCreateFile的ObOpenObjectByName它是对象管理的核心函数。
ObOpenObjectByName函数中的两个主要工作是调用ObpLookupObjectName函数对应于我们真正的文件内核对象,并通过ObpCreateHandle将内核对象插入指定句柄表。
其实***答案就在这里ObpLookupObjectName由于函数中存在可选输入参数RootDirectoryHandle作为搜索目录对象,我们类似地分析了不提供参数的过程。
***步骤,它会用的ObpRootDirectoryObject处理搜索的根目录对象“\??\”以当前流程开始的对象名称ProcessMap搜索父目录。然后进入循环依次分析对象名中的每一段,在访问前非KernelMode访问必须进行安全检查ObpLookupDirectoryEntry计算当前对象名称Hash值后与Hash数组大小37取余,后继链表中获得的对象存在OBJECT_HEADER_NAME_INFO与提供的名称一致后,返回对象地址。直接调用对象类型ParseProcedure(进入IopParseFile->IopParseDevice从而向相应的卷对象发送请求)。
读完后发现回来了STATUS_REPARSE后会转入ParseFromRoot处,完成从前面描述的DeviceMap重新分析处理。
这说明了STATUS_REPARSE它确实可以帮助我们完成从一个文件位置到另一个文件位置的重定向(例如,一个类别的目录总是STATUS_REPARSE,而且STATUS_REPARSE在ObpLookupObjectName有次数限制),第二,由于交付给对象管理器时会完全重新分析,因此确实可以完成跨盘操作。
可配置文件的文件系统跨盘重定向
我们的目标是实现一个应用程序将监控配置发送给驱动程序,驱动程序向应用程序报告需要重定向文件的结果。驱动程序完成了将监控文件夹中的所有新文件转移到目标文件夹下的操作。
首先,我们主要关心如何在特定路径下拦截文件的创建和操作。我们首先完成了对卷实例的绑定。该回调程序在新卷和注册后被调用。本回调主要通过FltGetVolumeName并通过获取完成卷的设备名称和卷标名称FltAllocateContext从内存池或lookaside保存上下文内存的表种,FltSetInstanceContext在实例中完成设置,以满足跨盘重定向后的程序DOS将风格名称发送给应用程序,因此添加双链表以获取其他磁盘的信息。
对于绑定后InstanceQueryTeardownCallback,InstanceTeardownStartCallback,InstanceTeardownCompleteCallback3值得注意的是,类回调的处理InstanceQueryTeardownCallback,因为它对应于手工解绑定,我们只是直接返回STATUS_FLT_DO_NOT_DETACH以拒绝。
现在让我们来看看相应的主功能号IRP_MJ_CREATE主功能号的处理(Minifilter中)为IRP_MJ_NETWORK_QUERY_OPEN我们也在这里处理请求,因为它是一个Fast I/O操作,所以返回FLT_PREOP_DISALLOW_FASTIO拒绝。我们用了FltGetFileNameInformation和FltParseFileNameInformation为了其文件名信息的目的是方便卷设备名转换为DOS风格名。
在这个过程中,我们根据上下文链表和配置生成两个名称,一个是DOS前者发送给应用程序,后者设置为风格文件名和完整文件名FileObject中(使用IoReplaceFileObjectName),并在I/O请求包中返回STATUS_REPARSE以完成***部分分析使创建操作根据新名称重新从对象管理办公室处理。回调函数返回FLT_PREOP_COMPLETE来完成这个I/O请求,不发送请求。
IRP_MJ_CREATE的操作IRP_MJ_SET_INFORMATION的FileInformationClass为FileRenameInformation由于非跨盘移动将通过此请求完成操作,因此使用相同的处理IRP_MJ_CREATE操作相同。
***提一下Minifilter从应用程序到驱动的信息发送和主动发送到应用程序的处理。通过应用程序FilterConnectCommunicationPort向命名的通信端口请求连接。驱动内部通过PFLT_MESSAGE_NOTIFY MessageNotifyCallback回调接收监控的目录和重定向后的目录。***,重定向后驱动完成FltSendMessage发送消息,使用应用程序FilterGetMessage获取。
本次试验资源可链接:http://pan.baidu.com/s/1o766JtK密码:jnsk下载。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。