首页
社区
课程
招聘
[原创]让你在日常的Windows驱动开发工作中更好地使用MiniFilter的编程知识。
发表于: 2014-9-10 16:26 17153

[原创]让你在日常的Windows驱动开发工作中更好地使用MiniFilter的编程知识。

2014-9-10 16:26
17153

  在日常的Windows驱动程序开发工作中,有的时候,你可能需要根据人们的一些需求来,隐藏指定目录下的某种格式的文件。很多人会突发奇想,用各种方法来解决问题。
  为了更好、更灵活地使用MiniFilter的知识来开发Windows文件系统过滤驱动程序。我给出了一个代码示例,来帮助大家学习。
  我写这篇文章目的,不是让你特地去绕过某些杀毒软件、安全软件。而是为了让你更好地理解和使用MiniFilter的知识。

  附件带有一个完整的代码工程,可下载,编译,并立刻使用。

  此Window驱动程序的功能是:
使用MiniFilter文件过滤驱动来隐藏文件。设置应用层指定的文件目录下的某一种类型格式的文件隐藏。使Explorer.exe等应用程序都看不见它们。
  比如:某一个文件目录下,有DOC、EXE、TXT、DLL等等类型的文件。
  假设指定隐藏txt文件类型,那么这个目录下的所有txt文件都会被隐藏,而其它类型的文件DOC、EXE、DLL都不隐藏。

本驱动可以编译通过,立刻使用到您的工程项目里面。

这个驱动程序支持:
Windows XP
32位Windows 7
64位Windows 7

32位Windows 8
64位Windows 8

32位Windows 8.1
64位Windows 8.1

开发环境:
(1)Visual Studio 2008、WDK7600    用这个环境主要是为了支持XP和Win7

(2)Visual Studio 2013、WDK8.1     用这个环境主要是为了支持Win7、Win8、Win8.1

如何测试这个驱动程序:

首先鼠标右击passThrough.inf文件,安装上驱动程序passthru.sys。而不是使用驱动加载工具来安装passthru.sys。

在Windows命令行cmd方式下输入:net start passthru  这样就开启了服务。然后你再运行编译好的应用层程序。这样就可以看见效果了。

当停止服务的时候,就输入:    net stop passthru

===========================================================================================================================

代码实现的基本思想:

应用层:
代码实现很简单,就是和驱动层通信。各位看学论坛的童鞋,都能看得懂。代码量很少,不做解释。

驱动层:

因为要用MiniFilter来编写代码实现这样的功能。因此,需要处理 IRP_MJ_DIRECTORY_CONTROL的相关操作。
因此使用了PtPostDirCtrlPassThrough函数来处理IRP_MJ_DIRECTORY_CONTROL的相关操作。

FLT_POSTOP_CALLBACK_STATUS
PtPostDirCtrlPassThrough (  __inout PFLT_CALLBACK_DATA Data,
                            __in PCFLT_RELATED_OBJECTS FltObjects,
                            __in_opt PVOID CompletionContext,
                            __in FLT_POST_OPERATION_FLAGS Flags
                         )

如何过滤呢??

  在WindowsXP及其以下版本,需要过滤 FileBothDirectoryInformation 类型的信息

if(Data->Iopb->Parameters.DirectoryControl.QueryDirectory.FileInformationClass == FileBothDirectoryInformation)
{

  ........//省略代码

}

  在Windows Vista或Windows7或更高版本的Windows的操作系统,它们返回的结构不再是FileBothDirectoryInformation. 而是FileIdBothDirectoryInformation

if(Data->Iopb->Parameters.DirectoryControl.QueryDirectory.FileInformationClass ==FileIdBothDirectoryInformation)
{
       
........//省略代码

}

具体可见PtPostDirCtrlPassThrough 函数的代码实现。

驱动程序使用了内核链表来管理文件目录。

当你添加了要隐藏的指定格式的文件扩展名时,

假设你在应用层调用:MyAddProtectPath(L"C:\\test*", L"*.txt*");

那么,C:\test目录下,所有txt类型的文件被隐藏。

那么在内核中,对应的AddNameToWhiteNameList函数被调用。
驱动程序调用ExAllocatePoolWithTag函数动态分配一个内存空间,做为链表的一个结点。
接着保存字符串C:\test和字符串txt,然后把这个结点插入到链表里面。

若字符串C:\test和字符串txt已经在链表中了,那么就不需要再新申请链表结点。IsNameInWhiteNameList函数就是用来做这个判断的。

反过来,

当你在应用层调用:MyDelProtectPath(L"C:\\test*")的时候,取消隐藏C盘test目录下的扩展名为 .txt的所有文件。
那么在内核中是调用DelNameFromWhiteNameList()来执行相应的动作。


代码附件:

用MiniFilter来隐藏指定类型的文件.rar

祝大家学习快乐!

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 3
支持
分享
最新回复 (23)
雪    币: 62
活跃值: (946)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
抢个沙发,楼主无三百两
2014-9-10 16:28
0
雪    币: 563
活跃值: (4404)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
谢谢!学习了!
2014-9-10 16:30
0
雪    币: 557
活跃值: (444)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
4
祝大家学习快乐!祝大家好运。
2014-9-10 16:30
0
雪    币: 34
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
哇,挺深奥的,学习学习。
2014-9-10 16:43
0
雪    币: 45
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
顶一下。
2014-9-10 16:50
0
雪    币: 538
活跃值: (259)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
这是干货呀!!前排学习!!!
2014-9-10 16:56
0
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
8
抢个座位
2014-9-10 17:19
0
雪    币: 67
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
exe编译出现以下提示:
fatal error C1083: Cannot open include file: 'fltuser.h'
fatal error C1083: Cannot open include file: 'FltUserStructures.h'

sys编译出现以下提示:
C:\DDK\bin\makefile.new(1082) : fatal error U1050: Your .\sources. file must define the TARGETPATH= macro
d:\xxx\precomp.h(5) : fatal error C1083: Cannot open include file: 'fltKernel.h'

开发环境:
VC 6.0
Windows DDK 3790.1830
2014-9-10 17:54
0
雪    币: 557
活跃值: (444)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
10
你太差了,这个驱动程序编译根本就不会出现错误。如下图:



我的开发环境:
(1)Visual Studio 2008、WDK7600    用这个环境主要是为了支持XP和Win7
(2)Visual Studio 2013、WDK8.1     用这个环境主要是为了支持Win7、Win8、Win8.1

你的开发环境太老了。Windows DDK 3790.1830和Visial C++6.0
上传的附件:
2014-9-10 18:00
0
雪    币: 67
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
从来没用过Win7、Win8神马的,
经常帮别人装机都是用WinXP、Win2003神马的,
见别人装上的是Win7、Win8神马的就不舒服,立马给他格C盘重装个WinXP,
俺只要求这个能在Win2003下用!
2014-9-10 18:11
0
雪    币: 557
活跃值: (444)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
12
你去安装一个WDK7.0.1吧。编译环境如下图:



你不安装WDK7.0.1,编译就不通过,那么你自己去修改驱动程序代码了。
上传的附件:
2014-9-10 18:18
0
雪    币: 557
活跃值: (444)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
13
WDK7600 支持的编译环境:

上传的附件:
2014-9-10 18:23
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
只判断这两个结构不够……别人还是可以绕过你的驱动来枚举文件……
2014-9-10 18:32
0
雪    币: 1602
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
新帖支持!MiniFilter文件过滤驱动来隐藏文件!能不能允许Explorer.exe访问而除去Explorer.exe不可访问?
2014-9-12 15:29
0
雪    币: 557
活跃值: (444)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
16
这篇文章,我在这里只是给了一个小例子供大家学习MiniFilter。若不好的地方,请原谅。
2014-10-12 18:24
0
雪    币: 16
活跃值: (400)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
lz精神可嘉,赞一个
2014-10-24 21:25
0
雪    币: 67
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
这种驱动你一般在虚拟机里开发么?听说驱动开发不小心就会搞坏系统,呵呵
2014-10-27 18:22
0
雪    币: 91
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
楼主,我试这个工程,console下使用是没有问题的,可是在MFC的工程下却不能正常的隐藏文件了。。
就是一个对话框里一个button,点击直接call myadd 函数,参数是直接char 常量。。这个是什么问题呀???

双机调试的时候几乎所有的变量在windbg看起来都是很好的,可是就是隐藏不了文件呢。
2014-12-25 22:37
0
雪    币: 188
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
多谢楼主分享
2014-12-26 00:27
0
雪    币: 91
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
楼主好人~~~
2014-12-26 09:39
0
雪    币: 307
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
22
楼主您这篇文章描述的是在IRP_MJ_DIRECTORY_CONTROL的后操作中实现的隐藏,有些人说在后操作中并不安全,因为在预操作中就可以查找到被隐藏的文件;还有就是用了这个在后操作的隐藏后,如果是使用windows自带的资源管理器确实看不到被隐藏的文件,但是在应用层调用WIN32  API写一个目录枚举的程序,依然可以看得到已经被隐藏的文件,楼主能给点看法吗?
2018-4-6 21:45
0
雪    币: 6394
活跃值: (2207)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
23
支持一个!
2019-4-11 13:39
0
雪    币: 20
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
24
学习了,感谢大佬这么好的示例,另 驱动代码有些小bug导致只能添加一种文件格式,我已修复,应用程序也改为命令行控制,,有需要的童鞋请@我
2019-11-6 13:37
0
游客
登录 | 注册 方可回帖
返回
//