Win64 驱动内核编程-17. MINIFILTER(文件保护)
MINIFILTER(文件保护)
使用 HOOK 来监控文件操作的方法有很多,可以在 SSDT 上 HOOK 一堆和 FILE 有关的函数,也可以对 FSD 进行 IRP HOOK,不过这些方法既不方便,也不安全。微软推荐的文件操作过滤方法是使用过滤驱动,在 VISTA 之后,推荐使用 MINIFILTER (字面翻译是迷你过滤器)。MINIFILTER 基于标准的文件过滤驱动,但是微软把它封装得很好,使得大家不用注意太多细节,而专注于对 IRP 的过滤。
之前一直在看一些细节和各种配置文件设置,最后发现如果用VS当IDE的话直接就自动生成模板了。先说下创建一个MiniFilter驱动项目:
然后他会自动生成一个模板文件:
我们只需要在上面改东西就行了,贼方便。
编译之后会有两个文件:
***.sys 和 ***.inf 把inf拷贝到相关虚拟机上右键安装就行了。
安装之后会生成类似如下注册表:
OK这样一个基本的MiniFilter驱动就安装上了。
然后在cmd里对这个驱动的操作和服务是一样的(但是注意这个不是服务,在服务里查不到)
Sc start MyMiniFilter 开始
Sc stop MyMiniFilter 停止
Sc Delete MyMiniFilter 删除(删除后记得自己清理system32/drivers\**.sys这个文件)
下面说下这个框架的细节:
创建这个项目之后,模板已经被自动创建好了,里面也有很多注释。要自己看下,这里就说几点关键:
CONST FLT_OPERATION_REGISTRATION Callbacks[] = {
{ IRP_MJ_WRITE,
0,
MinifilterPreOperation,
MinifilterPostOperation },
#if 0 // TODO - List all of the requests to filter.
{ IRP_MJ_CREATE,
0,
MinifilterPreOperation,
MinifilterPostOperation },
{ IRP_MJ_CREATE_NAMED_PIPE,
0,
MinifilterPreOperation,
MinifilterPostOperation },
{ IRP_MJ_CLOSE,
0,
MinifilterPreOperation,
MinifilterPostOperation },
{ IRP_MJ_READ,
0,
MinifilterPreOperation,
MinifilterPostOperation },
{ IRP_MJ_QUERY_INFORMATION,
0,
MinifilterPreOperation,
MinifilterPostOperation },
{ IRP_MJ_SET_INFORMATION,
0,
MinifilterPreOperation,
MinifilterPostOperation },
{ IRP_MJ_QUERY_EA,
0,
MinifilterPreOperation,
MinifilterPostOperation },
{ IRP_MJ_SET_EA,
0,
MinifilterPreOperation,
MinifilterPostOperation },
{ IRP_MJ_FLUSH_BUFFERS,
0,
MinifilterPreOperation,
MinifilterPostOperation },
{ IRP_MJ_QUERY_VOLUME_INFORMATION,
0,
MinifilterPreOperation,
MinifilterPostOperation },
{ IRP_MJ_SET_VOLUME_INFORMATION,
0,
MinifilterPreOperation,
MinifilterPostOperation },
{ IRP_MJ_DIRECTORY_CONTROL,
0,
MinifilterPreOperation,
MinifilterPostOperation },
{ IRP_MJ_FILE_SYSTEM_CONTROL,
0,
MinifilterPreOperation,
MinifilterPostOperation },
{ IRP_MJ_DEVICE_CONTROL,
0,
MinifilterPreOperation,
MinifilterPostOperation },
{ IRP_MJ_INTERNAL_DEVICE_CONTROL,
0,
MinifilterPreOperation,
MinifilterPostOperation },
{ IRP_MJ_SHUTDOWN,
0,
MinifilterPreOperationNoPostOperation,
NULL }, //post operations not supported
{ IRP_MJ_LOCK_CONTROL,
0,
MinifilterPreOperation,
MinifilterPostOperation },
{ IRP_MJ_CLEANUP,
0,
MinifilterPreOperation,
MinifilterPostOperation },
{ IRP_MJ_CREATE_MAILSLOT,
0,
MinifilterPreOperation,
MinifilterPostOperation },
{ IRP_MJ_QUERY_SECURITY,
0,
MinifilterPreOperation,
MinifilterPostOperation },
{ IRP_MJ_SET_SECURITY,
0,
MinifilterPreOperation,
MinifilterPostOperation },
{ IRP_MJ_QUERY_QUOTA,
0,
MinifilterPreOperation,
MinifilterPostOperation },
{ IRP_MJ_SET_QUOTA,
0,
MinifilterPreOperation,
MinifilterPostOperation },
.....
上面的东西就是设置开启哪些回调函数(所有回调函数格式一样),Pre是之前的意思,Post是之后的意思。默认的模板是用的if 0给全都关闭了。我是开启了 写 的权限进行测试:
回调函数代码如下(保护xxxx.txt文件):
FLT_PREOP_CALLBACK_STATUS
MinifilterPreOperation (
_Inout_ PFLT_CALLBACK_DATA Data,
_In_ PCFLT_RELATED_OBJECTS FltObjects,
_Flt_CompletionContext_Outptr_ PVOID *CompletionContext
)
{
UNREFERENCED_PARAMETER(FltObjects);
UNREFERENCED_PARAMETER(CompletionContext);
PAGED_CODE();
{
PFLT_FILE_NAME_INFORMATION nameInfo;
//直接获得文件名并检查
if (NT_SUCCESS(FltGetFileNameInformation(Data, FLT_FILE_NAME_NORMALIZED | FLT_FILE_NAME_QUERY_DEFAULT, &nameInfo)))
{
if (NT_SUCCESS(FltParseFileNameInformation(nameInfo)))
{
WCHAR pTempBuf[512] = { 0 };
WCHAR *pNonPageBuf = NULL, *pTemp = pTempBuf;
if (nameInfo->Name.MaximumLength > 512)
{
pNonPageBuf = ExAllocatePool(NonPagedPool, nameInfo->Name.MaximumLength);
pTemp = pNonPageBuf;
}
RtlCopyMemory(pTemp, nameInfo->Name.Buffer, nameInfo->Name.MaximumLength);
DbgPrint("[MiniFilter][IRP_MJ_WRITE]%wZ", &nameInfo->Name);
_wcsupr(pTemp);
if (NULL != wcsstr(pTemp, L"xxxx.txt")) /
{
if (NULL != pNonPageBuf)
ExFreePool(pNonPageBuf);
FltReleaseFileNameInformation(nameInfo);
return FLT_PREOP_DISALLOW_FASTIO;
}
if (NULL != pNonPageBuf)
ExFreePool(pNonPageBuf);
}
FltReleaseFileNameInformation(nameInfo);
}
}
return FLT_PREOP_SUCCESS_NO_CALLBACK;}
执行效果如下:
Win64 驱动内核编程-17. MINIFILTER(文件保护)的更多相关文章
- Win64 驱动内核编程-3.内核里使用内存
内核里使用内存 内存使用,无非就是申请.复制.设置.释放.在 C 语言里,它们对应的函数是:malloc.memcpy.memset.free:在内核编程里,他们分别对应 ExAllocatePool ...
- Win64 驱动内核编程-8.内核里的其他常用
内核里的其他常用 1.遍历链表.内核里有很多数据结构,但它们并不是孤立的,内核使用双向链表把它们像糖 葫芦一样给串了起来.所以遍历双向链表能获得很多重要的内核数据.举个简单的例子,驱 动对象 Driv ...
- Win64 驱动内核编程-7.内核里操作进程
在内核里操作进程 在内核里操作进程,相信是很多对 WINDOWS 内核编程感兴趣的朋友第一个学习的知识点.但在这里,我要让大家失望了,在内核里操作进程没什么特别的,就标准方法而言,还是调用那几个和进程 ...
- Win64 驱动内核编程-2.基本框架(安装.通讯.HelloWorld)
驱动安装,通讯,Hello World 开发驱动的简单流程是这样,开发驱动安装程序,开发驱动程序,然后安装程序(或者其他程序)通过通讯给驱动传命令,驱动接到之后进行解析并且执行,然后把执行结果返回. ...
- Win64 驱动内核编程-18.SSDT
SSDT 学习资料:http://blog.csdn.net/zfdyq0/article/details/26515019 学习资料:WIN64内核编程基础 胡文亮 SSDT(系统服务描述表),刚开 ...
- Win64 驱动内核编程-34.对抗与枚举MiniFilter
对抗与枚举MiniFilter MiniFilter 是目前杀毒软件用来实现"文件系统自我保护"和"文件实时监控"的方法. 由于 MiniFilter 模型简单 ...
- Win64 驱动内核编程-11.回调监控进线程句柄操作
无HOOK监控进线程句柄操作 在 NT5 平台下,要监控进线程句柄的操作. 通常要挂钩三个API:NtOpenProcess.NtOpenThread.NtDuplicateObject.但是在 VI ...
- Win64 驱动内核编程-10.突破WIN7的PatchGuard
突破WIN7的PatchGuard WIN64 有两个内核保护机制,KPP 和 DSE.KPP 阻止我们 PATCH 内核,DSE 拦截我们加载驱动.当然 KPP 和 DSE 并不是不可战胜的,WIN ...
- Win64 驱动内核编程-25.X64枚举和隐藏内核模块
X64枚举和隐藏内核模块 在 WIN64 上枚举内核模块的人方法:使用 ZwQuerySystemInformation 的第 11 号功能和枚举 KLDR_DATA_TABLE_ENTRY 中的 I ...
随机推荐
- Office2013安装教程(附安装包+激活工具)
office2013中文版是微软推出的新一代office办公软件,重点加强了云服务项目,Office2013[☜借你手指用下]采用了全新的Merto界面,使用户更加专注于内容,配合Windows 8的 ...
- JS时间格式转成字符串
formatNumber = n => { n = n.toString(); return n[1] ? n : '0' + n }; // 时间格式化 formatTime = date = ...
- 漏洞复现-CVE-2015-1427-Groovy远程代码执行
0x00 实验环境 攻击机:Win 10 靶机也可作为攻击机:Ubuntu18 (docker搭建的vulhub靶场) 0x01 影响版本 Elasticsearch 1.3.0-1.3. ...
- go中errgroup源码解读
errgroup 前言 如何使用 实现原理 WithContext Go Wait 错误的使用 总结 errgroup 前言 来看下errgroup的实现 如何使用 func main() { var ...
- VSCode添加用户代码片段,自定义用户代码片段
在使用VScode开发中经常会有一些重复使用的代码块,复制粘贴也很麻烦,这时可以在VScode中添加用户代码片段,输入简写即可快捷输入. VScode中添加用户自定义代码片段很简单. 1.在VScod ...
- C#开发BIMFACE系列35 服务端API之模型对比6:获取模型构建对比分类树
系列目录 [已更新最新开发文章,点击查看详细] BIMFACE平台提供了服务端"获取模型对比构件分类树"API.目录树返回结果以树状层级关系显示了增删改的构件信息,里面无法 ...
- 配置docker的pdflatex环境
技术背景 Latex在文档撰写方面是不可或缺的工具,尤其是在写文章方面,是必须要用到的文字排版工具.但是latex的环境部署并不是一个特别人性化的操作,尤其是在各种不同的平台上操作是完全不一样的,还经 ...
- 「HTML+CSS」--自定义加载动画【007】
前言 Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 哈哈 自我介绍一下 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入计算机 ...
- 如何调试 Java 开源项目源码,记一种源码导入开发工具并调试的通用方法
楔子 说起读开源项目源码,很多朋友觉得高大上.大佬牛逼,云云~ 挡在很多人面前的不是源码怎么读,而是不知道如何导入源码到开发工具以及如何调试源码. 本文将以 spring-cloud-gateway ...
- 对不起,“下一代ERP”仍旧是现在的ERP
最近数字化转型太火了,到处都是相关数字化的网文.很多人又说在数字化转型时代,ERP早就落伍了云云,取而代之的是什么"下一代ERP",叫什么"ARP"." ...