Minifilter实现文件备份
Arcueid 发表于 浙江 二进制安全 370浏览 · 2025-06-02 08:11

起因

在分析某款软件时发现, 其主要功能被实现于内核态驱动中, 在加载驱动后会自删除文件, 想要逆一下发现找不到驱动 所以考虑用minifilter读写文件拿到驱动

实现过程

首先我们要确定一下文件名格式FltGetFileNameInformation

nameInfo.Name 结构类似下面这样

\Device\HarddiskVolumex\xxxxx\...\xxxxx.sys

随便注册个针对IRP_MJ_WRITE的回调 dbgPrint输出一下找找我们要的驱动文件



拿到名称之后可以考虑开始写回调了

这里考虑写后回调 整体思路大致如下

1 通过判断nameInfo.Name决定是否备份

2获取目标文件大小

3获取目标驱动文件句柄,文件对象 创建备份文件

4读写 分段读取原文件内容并写入到备份文件中

1. 通过判断nameInfo.Name决定是否备份

2. 获取目标文件大小

3. 获取目标驱动文件句柄,文件对象 创建备份文件

通过FltCreateFileEx打开目标文件 和创建备份文件

4. 分段读取原文件内容并写入到备份文件中





优化

那么现在是硬编码的目标文件和备份文件 比较蠢 考虑上个通信从R3接收文件名

R0

先写驱动这块

通过FltCreateCommunicationPort 创建通信端口



在这之前需要用FltBuildDefaultSecurityDescriptor来创建默认的安全描述符

fltDisConnectNotifyCallback我们不关心

fltConnectNotifyCallback如下

先定义一个通信结构

记得在卸载的时候free掉

对应IRP_MJ_WRITE的后回调需要修改的点如下

R3

通过FilterConnectCommunicationPort直接在连接的时候走回调把数据传完 就不用写MessageNotifyCallback

当然通过filterSendMessage MessageNotifyCallback实际上是更符合直觉的 当时不知道为什么没这么写



image.png




0 条评论
某人
表情
可输入 255