文件过滤驱动学习笔记1

合集下载

文件系统过滤驱动

文件系统过滤驱动

1 引言文件系统过滤概述文件安全性问题已成为当今信息科学领域最重要的课题之一。

目前,解决这个问题的主要技术手段有两种:一是利用应用层HOOK(钩子)技术,对Windows 提供的文件操作函数(API)及由文件操作所触发的Windows消息进行HOOK,经过适当的处理达到预期目的,缺点是效率低、稳定性和一致性差,不适合于大型系统的开发;另一种是开发文件过滤驱动程序,文件过滤驱动作为一种内核态中间层驱动,不需要改变下层驱动或用户程序而增加新的功能,具有效率高、可靠性强、可扩充等特点,成为现阶段信息安全技术研究的热点。

1.1 文件过滤驱动在信息安全领域的应用1 文件加/解密文件过滤驱动程序可以实现对指定文件、目录,甚至整个逻辑盘的加/解密功能。

当文件在写入磁盘的过程中,截获所有对该文件的IRP_MJ_WRITE,在其分发例程中对IRP携带的数据进行加密处理后写入磁盘;文件被从磁盘读取的过程中,截获所有对该文件的IRP_MJ_READ,在其分发例程中对IRP携带的数据进行解密处理后向上层返回。

加密后的文件在磁盘中以密文形式存储,保证了数据存储的安全性。

2 病毒防护应用程序在创建一个新文件或打开一个已存在文件时,文件系统过滤驱动程序截获IRP_MJ_create,判断被打开文件是否存在和病毒特征代码库相匹配的特征,若存在,说明文件感染了病毒,失败掉该IRP,拒绝打开;否则,使IRP继续向下传递,完成正常的打开操作。

3 进程控制为了防止恶意进程的破坏,有时需要规定只允许某些经过安全验证的特定进程对受保护的文件进行访问,其他不在规则范围内的进程不允许访问。

我们可以通过系统提供的PsGetCurrentProcessId、PsGetCurrentThreadId等API函数得到发起I/O请求的进程及线程的相关信息,如:获得发起进程名称,与安全访问规则(进程白名单)中的可信进程相比较,若该进程位于规则中,说明信任其行为是安全的,允许访问受保护文件;否则,拒绝访问。

驱动入门:从WRK到IRP实践篇

驱动入门:从WRK到IRP实践篇

驱动入门科普:从WRK理解IRP IRP Stack之实践篇By AntBean昨天通过WRK的代码对IRP和IRP Stack的概念作出了一个比较深的理解。

但显然这样还不够。

对程序员而言,没有比光说不练更坏的恶习了。

这次,我们将通过一个文件过滤驱动来实现文件保护。

恩,是的,我们想写一个文件过滤驱动。

而且我们也知道所谓文件过滤驱动也就是将自己的设备加到要过滤的设备栈的最顶端。

说白了不就是IoAttachDeviceToDeviceStack嘛。

我们准备动手了,可是问题来了,我到底该Attach到哪个Device Stack上呢?楚狂人在文件过滤驱动二一书中提到,就是要Attach到相应的V olume上。

我晕了。

为啥子就是要Attach到相应的V olume上了?谁说的?即使Attach到相应的V olume上了,获得到的IRP到底都有啥参数呢,我该怎么检查获得的IRP以决定是否拒绝该IRP呢?难道我就只能对着他的代码从头敲到尾么?如果我知道CreateFile的整个操作流程,显然CreateFile最终都是分配了一个IRP发送给文件系统的,那么我不就知道了该Attach的Device Stack么?一、CreateFile的整个流程与文件过滤驱动的Attach对象问题显然,我们知道CreateFile在内核中调用的是NtCreateFile。

直接阅读NtCreateFile,可以看到NtCreateFile的请求最终是通过ObOpenObjectByName 实现的。

这里就不贴代码了。

而最难找的应该是ObOpenObjectByName中到底是哪个函数调用实现的创建IRP并发送IRP。

在ObOpenObjectByName中,对象管理器会获得该Name对应的Object,之后它会调用该Object的Parse Routine,在Parse Routine中完成IRP的构造和发送。

这一点你可以在<深入解析windows操作系统>一书的系统机制一章中的对象管理器获得比较深的了解。

Sfilter分析笔记之绑定卷一

Sfilter分析笔记之绑定卷一

PDEVICE_OBJECT // // FSCDO 过滤设备对象扩展 // PSFILTER_DEVICE_EXTENSION
storageStackDeviceObject;
devExt;
// // 我们创建的过滤设备对象,将要绑定到 FS 的卷设备对象上 // PDEVICE_OBJECT newDeviceObject; PSFILTER_DEVICE_EXTENSION newDevExt; NTSTATUS status;
存储卷(Storage Volumes):
存储卷是一个存储设备对象, 例如硬盘、 软盘和CD-ROM, 可以被格式化存储目录和文件 。 一个大的卷可以被分成多个或者一个逻辑卷,也叫做分区。每一个逻辑卷可以被格式化为 NTFS、FAT或者CDFS。 (这是基于文件系统的) 。
一个存储卷或者存储设备对象是一个设备对象,-physical device object(PDO)-代 表系统中的一个逻辑卷。
存储设备栈(Storage Device Stacks) 存储卷(Storage Volumes) 文件系统栈(File System Stacks)
存储设备栈(Storage Device Stacks): 大多数存储设备是 PnP 设备驱动程序,由 PnP 管理器加载和管理。 系统上的每一个物理或者逻辑设备作为 PnP 设备树(device tree)上的一个设备节点 (device node)。 重要的一点注意是:文件系统驱动和文件过滤驱动不是 PnP 设备驱动。因此,设备树 上 不包含这两个设备节点。 每个设备节点,例如磁盘设备。可能维护一个或者多个逻辑卷,这些卷通过存储设备栈 (Storage Device Stacks)来维护。 存储设备栈就像树一样,根被称为 FDO(功能设备对象) ,剩下的就是 PDO(物理设备对 象) ,代表每一个逻辑卷,也叫做存储卷。文件系统卷能被挂载到此上面。

Windows 文件过滤驱动经验总结

Windows 文件过滤驱动经验总结

P 后什么都不做,直接调用 IoCompleteRequest() 来返回。 (2) 拿到这个 IRP 后什么都不做,直接传递到底层设备,
使用IoSkipCurrentIrpStackLocation() 后调用 IoCallDriver() 传递。 (3) 使用 IoBui
ldSynchronousFsdRequest() 或 IoBuildDeviceIoControlRequest()来建立 IRP 的。
Windows 文件过滤驱动经验总结 1、获得文件全路径以及判断时机 除在所有 IRP_MJ_XXX 之前自己从头创建 IRP
发送到下层设备查询全路径外,不要尝试在 IRP_MJ_CREATE 以外的地方获得全路径,因为只有在 IRP_MJ_CREATE 中才会使
用 ObCreateObject() 来建立一个有效的 FILE_OBJECT。而 在 IRP_READ IRP_WRITE 中它们是直接操作
TION 等 IRP 不要去管它,因为它只是一个过程。最终读 写还是如上所介绍。至于以上这些 IRP 哪个是由 CC MGR 发送的,哪些是由
I/O MGR 发送和在什么时候发送的,这个已经有很多讨论了,相 信可以找到。
7、举例说明关于 IRP 传递与完成注意事项 只
看 Walter Oney 的那本 《Programming the Microsoft Windows driver model》里介绍的
其是你要达到一些特殊目的,这时候更需要注意,如 IRP_MN_QUERY_DIRECTORY,不同的标志结果有很大的不同。 3、从
头建立 IRP 获取全路径注意点 自己从头建立一个 IRP_MJ_QUERY_INFORMATION 的 IRP 获取全路径时需要注意,不

MiniFilter知识点

MiniFilter知识点

基于Minifilter框架的文件过滤驱动理解概述Minifilter即File System Minifilter Drivers,是Windows为了简化第三方开发人员开发文件过滤驱动而提供的一套框架,这个框架依赖于一个称之为Filter Manager(后面简写为FltMgr)的传统文件系统过滤驱动。

这套框架应用到内核中的结构如下图所示:FltMgr以传统文件过滤驱动的形式插入到I/O处理队列中去接收不同的I/O请求,然后将这个请求遍历发布到它所维护的Minifilter对象中,然后根据各个Minifilter对这个I/O请求的处理结果来决定后续的操作。

这种模式在很多软件架构中使用,类似于插件一样,每一个Minifilter遵守一定的接口规范插入到FltMgr中,然后就能执行过滤控制。

上面是对整个Minifilter框架进行描述,实际内部需要注意的细节牵涉到很多内核知识,比如中断级别、I/O请求被封装成IRP包和fast I/O请求等相对复杂的概念。

这里不做深究,主要以研究Minifilter的开发过程和相应注意的地方为主。

此外还有FltMgr在内核中的位置等相关知识,也只在必要的地方提及一下。

Minifilter流程Minifilter通过注册并启动后,根据在注册表中设置的相应值,插入到对应的FltMgr实例(Frame)队列中,然后关联上需要过滤的卷。

FltMgr会根据Minifilter所注册的I/O操作类型,调用对应的pre和post操作函数,并根据对应的返回值执行不同的流程。

这里假设有A、B、C三个Minifilter从上往下挂载在FltMgr实例上,那么当接收到I/O请求时,执行的步骤为A-pre、B-pre、C-pre,一旦某个Minifilter返回了FLT_PREOP_COMPLETE,即表明这个I/O请求被它完成处理了,则立即按照相反的顺序调用对应的post函数(不再继续往下调)。

Windows系统中基于文件过滤驱动的文件动态访问控制技术研究

Windows系统中基于文件过滤驱动的文件动态访问控制技术研究

Windows系统中基于文件过滤驱动的文件动态访问控制技术研究作者:李珠峰来源:《电脑知识与技术》2012年第09期摘要:该文对Windows系统下基于文件过滤驱动的文件动态访问控制技术进行了研究。

并对其实现的关键技术进行了详细的分析。

通过该技术可以有效的保护文件避免非授权的访问。

从而更为有效的保护信息资源安全。

关键词:文件过滤驱动;截获;输入输出请求包;动态访问控制中图分类号:TP316文献标识码:A文章编号:1009-3044(2012)09-2045-03Research on the Technology of Dynamically Access Control Based on File Filter Driver in Windows SystemLI Zhu-feng(PLA University of Foreign Languages,Luoyang 471003,China)Abstract: The research on dynamically access control based on file driver in Windows system was introduced in this article. and also the key technology was analyzed in detail. with this technology we can protect files from unauthorized accessing more effectively.Thus to protect the security of information resource.Key words: file filter driver; intercept; IRP; dynamically access control目前,随着技术的不断发展,基于计算机网络进行的攻击行为严重的威胁到了信息的安全,特别是非授权用户在入侵至目标主机之后通过各种技术手段提升自己的权限从而对目标主机内的敏感文件具备了相应的访问权限,导致了信息机密性被破坏。

文件系统过滤驱动技术在网页防篡改中的应用

文件系统过滤驱动技术在网页防篡改中的应用

网页非法篡改 ,可立即保护 网页防止被篡改或者恢复
被非法篡改 的网页。 经过多年 的发展 ,网页防篡改 的技 术也在不断 的 发展和更新 ,它的发展经历了如下历程 :
可能 ,其所 消耗 的内存和C U占用率也远远低于其它技 P
术。
1人工 对 比检 测 。人 工对 比检测 就是人 工监 控 网 . 站 ,一旦发现网站被篡改 ,人工对其进行还原。这种手
2过滤驱动 的概念。开发过滤驱动是为 了在操作系 . 统提供的功能之上提供 附加值。过滤驱动是一种 内核模 式驱动 ,它依靠拦截发往 已存在的内核模式驱动的请求
来提供新的功能。 3 . 过滤驱动实现的基本过 程。实现过滤驱动有 以下 几个基本步骤 :
改技术出现 的时间差距不大 ,而且两种技术常常被结合
非对称加密存放 ,在外来访问时将经过加密验证过 的网
页 ,进行解密对外发布 ;若 网页未经过验证 ,则拒绝对 外发布 ,调用备份 网页进行验证解密后对外发布。通常 要结合事件触发机制对文件 的大小 、页面生成时间等属
7 6 信息系统工程 I 0 2 . 1.2 2 70
驱动服务的各种模块不产生影 响( 即保证所有I P R 都有对 应 的处理例程) 所有工作做好后就可以 向I 管理器 。D. / O
段非常原始 ,其最致命的缺陷在于人工监控不能达到即
时性 。 2时 间轮 巡 技 术 。 时 间轮 巡 技 术 是 利 用 一个 网 页检 .
二 、文件 系统 过滤 驱动研 究
1文件 系统驱 动 的概念 。文件 系统 驱动是 存储 管 . 理子 系 统 的一 个 组 成部 分 。它 向用 户 提供 非 易 失 性 媒介( 盘 、磁带等 ) 磁 信息 的存储 、转 发 。文 件驱 动和

windows文件过滤方案设计与实现原理

windows文件过滤方案设计与实现原理

windows文件过滤方案设计与实现原理Windows文件系统简介Windows文件系统是Windows中非常复杂的一部分,微软设计了诸多机制来提高文件系统的效率,因此,文件过滤驱动是Windows驱动开发最复杂的部分,完全不同于普通的系统设备驱动开发,在设计文件过滤系统时将要面对非常复杂的问题。

首先,Windows有着复杂的内存映射机制。

它将一个文件映射到某个内存空间,需要访问这个文件内容的基础只需要访问这个内存空间即可,然而进程对内存的访问无法被文件过滤驱动捕获。

其次,当我们打开Explore浏览文件时, Explorer就已经将文件读到文件缓冲中了,office一类的应用程序通过内存映射的方式来打开word、excel等文件。

文件的内容是通过缺页中断来从硬盘复制到进程空间里的。

这是,被内存映射的文件实际上成了一个分页交换文件。

一旦进程访问到实际上不存在的内存页(还在硬盘式,就会有一个文件上的页面被交换到内存。

在交换发生时,有一个有特殊标记(irp->Flags带有IRP_PAGING_IO、IRP_SYNCHRONOUS_PAGING_IO 或IRP_NOCACHE的IRP_MJ_READ请求发送到文件驱动,这种读/写请求被称为分页读/写请求。

所幸分页读写请求时文件过滤驱动可以捕获的。

我们可以在捕获这个请求后,对于读/写的信息进行加解密操作。

Windows具有巧妙的文件缓冲机制,只要一个文件被以缓冲方式打开过,则其内容用的全部或者一部分就已经保持在内存里了。

这个部分信息称为文件缓冲,文件缓冲这是全局的。

一般的说,一个文件无论有多少个进程在访问,都只有一份文件缓冲。

图1 Windows文件读写请求Sfilter文件过滤可以过滤到全部这4种IRP,但是无法过滤内存访问。

但是一般的应用程序读/写文件,都有以上4种IRP存在[12]。

对于一个机密进程而言:以下是确信无疑的:(1真实硬盘上的文件内容必须是密文。

【驱动笔记15】键盘过滤驱动学习笔记

【驱动笔记15】键盘过滤驱动学习笔记
为什么 呢?因为实 用的键盘记 录器应该能 够将按键信 息保存起来 ,这里我们 只能通 过 DbgView 来看到按键信息。但由于这个完成例程的 IRQL 为 DISPATCH,不能进行文件操 作,因此在 KLOG 的代码中是首先创建一个线程,然后在线程中进行保存操作,因为线程 函数工作在 PASSIVE,允许处理文件。
NTSTATUS
DispatchRead(
IN PDEVICE_OBJECT
IN PIRP
pIrp
)
{
PIO_STACK_LOCATION
PIO_STACK_LOCATION
pDeviceObject,
currentIrpStack; nextIrpStack;
currentIrpStack = IoGetCurrentIrpStackLocation(pIrp); nextIrpStack = IoGetNextIrpStackLocation(pIrp); *nextIrpStack = *currentIrpStack; // 设置完成例程 IoSetCompletionRoutine(pIrp, OnReadCompletion, pDeviceObject, TRUE, TRUE, TRUE);
为了得到按键操作的信息,我们发送一个 IRP_MJ_READ 到驱动的设备栈,由于此时 还不一定有按键产生,于是驱动程序把这个 IRP 标记为 pending 状态,一旦有按键产生, 则马上把这个 IRP 完成,所以我们需要在 IRP_MJ_READ 的处理例程中设置一个完成例程。 (因为我们工作的异步模式下)
if(pIrp->PendingReturned) {
IoMarkIrpPending(pIrp); }

Windows下文件过滤驱动技术

Windows下文件过滤驱动技术

’。 ●_ 。●● ' ’
‘。。●。。。。。。。。 。。。。。 。。。。。。。。_。。。。。。。。—


应用程序

———厂————— _—一
应用层
一 b‘o请 一·一封[据一 一 一 一 一 一 一 一 一 一 一
I文件 过滤 驱 动
Windows的 I/O 管理 器 是一 个可 扩 展 的结构 ,通过 开发 过滤 驱 动程 序 可 以扩展 I/O 子系统 的功 能 。 I/O管 理器 支 持分 层驱 动程 序 模型 ,每 个 I/O请 求 包 (IRP,I/O request package)的处 理分 别经 过 各层 驱动 程序 ,直 到某 层 驱 动程 序 完成 这个 请 求【 。 1.1过滤 驱 动程 序
允 许修 改 已有 驱动 程 序在 某些 方面 的行 为 ,而 不 必 重 写整 个驱 动 程序 。
图 1文 件过 滤驱动 工 作模型
作 为 一种 内核 态 中 间层 驱 动 ,只 需对 下层 的文 件 系 统 驱 动作 相应 的 功能 扩展 ,加 密 粒度 灵活 、可 靠性 强 、 效 率 高 、易于 扩展 。
·74 ·
M icrocomputer Applications Vo1.32,No.8,2016
开发 应用
微 型 电脑 应 用 2016年第 32卷第 8期
借助 于 Windows的 可安 装文 件 系统 IFS,Installable File System 设 备驱 动 程序 开 发工 具 DDK,Device De. velopment Kit),即 可 以 对 W indows I/O 的 子 系 统 进 行 方 便 的扩展 ,实现 一个 文 件 加密 过 滤驱 动程 序 。此 程 序有 如 下 特 点 :

Sfilter分析笔记之绑定文件系统

Sfilter分析笔记之绑定文件系统

DeviceObject,
&devExt->AttachedToDeviceObject);
if(!NT_SUCCESS(status))
{ goto ErrorCleanupDevice;
}
// // 保存该文件系统控制设备对象 // RtlInitEmptyUnicodeString(&devExt->DeviceName,
PAGE_CODE();
// // 关联并初始化 nameFSCDO // RtlInitEmptyUnicodeString(&nameFSCDO,nameBuffer,sizeof(nameBuffer));
// // 获得 FSCDO 的名字 // SfGetObjectName(DeviceObject, &nameFSCDO);
devExt->DeviceNameBuffer, sizeof(devExt->DeviceNameBuffer));
RtlCopyUnicodeString(&devExt->DeviceName, DeviceName);
// // 清空设备对象的初始化标志 // ClearFlag( newDeviceObject->Flags, DO_DEVICE_INITIALIZING);
//************************************************************************ // // 该例程创建设备对象,并绑定到指定的文件系统控制设备对象的对象栈上
//
// 例程描述:
//
将要附加到指定文件系统的控制设备对象的设备栈上,所以,我们知道

基于文件过滤驱动的病毒防范方法的实现

基于文件过滤驱动的病毒防范方法的实现
CHEN J i a n—x i o n g , J I E Sh e , ZHANG Xi n
( 1 . De p . o f N e t w o r k , E l e c t r o n i c E n g i n e e r i n g I n s t i t u t e o f He f e i , He f e i 2 3 0 0 3 7 , C h i n a ;
基 于文件 过滤驱 动 的文件 型病毒 防 护方法 。分 析 了文件 过滤 驱 动 原理 , 通 过 在文 件 系统 驱 动上 层 附加 一 层 过滤 驱 动 , 来 截 获上层 应用 对文件 的各 种操 作 , 阻 止可 疑应用 程序 对 可执 行 文件 的写操 作 , 达 到 主动 防 御文 件 型病 毒 的 目的。文 章从
陈建 熊 , 揭 摄 , 张 鑫
( I . 合肥 电子 工程 学 院 网络 系 , 安徽 合肥 2 3 0 0 3 7 ;
2 . 武警合 肥指挥 学院 院务部 , 安徽 舍 肥 2 3 0 0 3 1 )
摘 要: 计 算机 病毒 给 当今 社会 造成 了较 大危 害 , 为 了有 效 防止 病 毒蔓 延 , 针 对 当前 防病 毒 软件 存 在 的不 足 , 给 出 了一种
2 . D e p .o f L o g i s t i c s , He f e i C o mma n d C o l l e g e o f A r me d P o l i c e , He f e i 2 3 0 0 3 1 , C h i n a )
Ab s t r a c t : Co mp u t e r v i r u s i s h a r mf ul t O s o c i e t y. I n v i e w o f t h e d e f e c t o f t h e v i r u s d e t e c t i o n me ho t d e x i s t i n g, a n e w me t h o d o f v i us r p r e - v e n t i o n ba s e d o n il f e s y s t e m i f l er t d r i v e r i s b r o u g h t f o r wa r d O t p r e v e n t c o mp u t e r v i r u s p r o p a g a io t n. An a l y z e he t he t o r y o f il f e s y s t e m il f t e r d r i v e r . Wi h t a t t a c h i n g a il f t e r d r i v e r O t he t il f e s y s t e m d r i v e r O t o b t a i n u p p e r a p p l i c a t i o n o p e r a t i n g o n he t il f e o f he t d i s k, c a n p r e v e n t S U S - p i c i o u s a p p l i c a t i o n p r o g r a m t o wr it e o n e x e c u t a b l e il f e . Th u s i mp l e me n t he t im a o f a c t i v e d e f e n s e o f t h e c o mp u t e r v i r u s . P r e s e n t t h e d e t a i l i mp l e me n at t i o n o f t hi s me t h o d wi t l l o p e n i n g, wr it i n g, c l o s i n g he t e x e c u t a b l e il f e b y v i us r nd a c o mmu t a i t o n b e t we e n a pp l i c a t i on nd a d r i v — e r . Th e es r u l t i n d i c a t e s ha t t hi t s me ho t d C n a p ev r e n t he t c o mp u t e r v i us r s p r e a d i n g e ic f i e n t l y . Ke y wo r d s : il f e s y s t e m il f t e r d i r v e r ; c o mp u er t v i r u s ; a c t i v e d e f e n s e

WindowsTDI过滤驱动开发(学习资料)

WindowsTDI过滤驱动开发(学习资料)

[版权所有] 本文作者是楚狂人,代码来源于开源工程tdifw与DDK的例子, 有问题欢迎与我联系讨论。

mail:******************* QQ: 16191935 msn:************************----------------------------------------------------------- Windows TDI过滤驱动开发 目 录(0) TDI概要(1) 准备工作(2) TDI设备与驱动入手(3) 绑定设备(4) 简单的处理请求(5) 基础过滤框架(6) 主要过滤的请求类型(7) CREATE的过滤(8) 准备解析ip地址与端口(9) 获取生成的IP地址和端口(10) 连接终端的生成与相关信息的保存(11) TDI_ASSOCIATE_ADDRESS的过滤(12) TDI_CONNECT的过滤(13) TDI_SEND,TDI_RECEIVE,TDI_SEND_DATAGRAM,TDI_RECEIVE_DATAGRAM(14) 设置事件(15) TDI_EVENT_CONNECT类型的设置事件的过滤(16) 一个传说中的问题(17) 收尾与清理的工作(0) TDI概要 最早出现的网络驱动应该是网卡驱动,这是Windows的理所当然的需求,为了进一步分割应用程序的网络数据传输与下层协议直到下层硬件的关系,又出现了协议驱动,后来微软和硬件商联合制定了NDIS标准,作为从硬件到协议的内核驱动程序的调用接口标准,而协议驱动与应用层的API之间,则出现了TDI接口。

最近国内安全软件的开发兴起,网络驱动的开发在其中有不少的应用,如果我们学习TDI接口的话,可能有以下一些目的: 自己要开发协议驱动,向上提供TDI接口,这种可能性存在,但不广泛。

我们想自己调用TDI接口,来进行网络数据传输,意义不大。

我们对TDI进行协议层过滤,开发防火墙或类似安全监控软件,这种应用还是比较多的。

文件过滤驱动

文件过滤驱动


读写过滤

读操作
文件的长度: Length = IrpSp->Parameters.Read.Length;

文件的偏移量: Offser.QuadPart = IrpSp->Parameters.Read.ByteOffset.QuadPart

文件内容: Irp-> MdlAddress不为空,则使用Irp-> MdlAddress,缓冲区位置为MmGetSystemAddressForMdlSafe(Irp-> MdlAddres),否则直接使用Irp-> UserBuffer
重要技术难点

缓存管理


单缓存
合法进程打开存在文件,关闭文档,明文保存在缓存, 此时缓存没有刷 至硬盘,也没有清空内存中的资源。此时非法进程再打开文档,在 IRP_MJ_CREATE例程会刷新缓存操作,所以非法进程打开为乱码 合法进程打开存在文件,明文保存在缓存, 此时缓存没有刷至硬盘,也 没有清空内存中的资源。此时非法进程再打开文档,如果是word这种占着句 柄没有关闭的文档,判断为非法进程,禁止打开;如果是notedpad采用内存 映射文件的方式的,句柄关闭,则非法进程打开正在被合法进程打开的文档 ,在IRP_MJ_CREATE例程会刷新缓存操作,所以非法进程打开为乱码 非法进程打开未打开过的加密文档,密文。合法进程再打开加密文档,会先 刷新缓存。 合法进程打开加密文档,在关闭的时候在IRP_MJ_CLEANUP例程中对新 建的文件才刷新缓存
而且有些程序的文件格式没有定式,甚至可以保存为任意后缀,例如记 事本,这样加密指定的文件后缀就带来了安全漏洞。

2、加密不区分后缀: 加密不区分后缀是指保密程序对生成的所有文件都进行加密。这种加密

文件过滤驱动学习笔记1

文件过滤驱动学习笔记1

文件过滤驱动学习笔记1文件系统过滤驱动,是在驱动级别上实现的,对文件系统的一举一动进行检测的一种技术。

这里仅指windows操作系统。

过滤包括文件打开、读写、重命名、删除,目录的操作等。

文件过滤非常有用,大多数实时监控的杀毒软件都会利用到这个技术。

从今天开始,分享在学习过程中的一些心得。

Wdk提供了一个sfile例子,供我们参考。

微软的习惯很好,在抛出一个新的东西之后,它的文档肯定有一个同步的跟进。

并且文档做得非常好,msdn,各种help。

比起google的android,微软的脚步走得更加坚实。

言归正传。

源文件在我电脑的路径是C:\WinDDK\6001.18002\src\filesys\filter\sfilter。

这个目录下有乱七八糟8个文件,而真正的代码只有sfilter.c一个。

让我们开始揭开它神秘的面纱吧。

看代码一般从入口开始看起。

DriverEntry。

sfilter的DriverEntry 做了三件事。

1填充MajorFunction,2填充fastIoDispatch,3注册文件系统变化回调。

1.填充MajorFunction这个不多说了,上层应用程序调用驱动时,就是利用这些接口。

比如CreateFile时候,会调用IRP_MJ_CREATE。

我们要进行过滤,就需要在这些例程中做事情。

2.填充fastIoDispatch这个我至今没看懂啥意思。

不过看雪上的高人都说,这个东西没必要管它,最多只是速度上的损失。

3.注册系统变化回调status = IoRegisterFsRegistrationChange( DriverObject, SfFsNotification );SfFsNotification这个函数是绑定设备控制对象的关键所在。

其重要性就在于,它能探测动态加载的卷设备,包括u盘等。

这里着重说说这个东西。

我们知道,驱动中实现过滤的一般方法就是绑定。

绑定一个我们自己的设备对象到设备栈顶,所有的IRP信息到来后首先到达我们的设备对象,从而可以优先获取系统信息。

初探文件系统过滤驱动

初探文件系统过滤驱动

初探文件系统过滤驱动初探文件系统微过滤驱动文/图李旭昇文件系统微过滤驱动(File System Mini-Filter ,简称MiniFilter )是微软为了简化文件过滤驱动开发过程而设计的新一代文件过滤框架。

MiniFilter 通过向过滤管理器(Filter Manager ,简称FltMgr )注册想要过滤的I/O 操作来间接地附加到文件系统设备栈上。

FltMgr 是一个传统的文件过滤驱动,运行在内核模式,向第三方MiniFilter 提供文件过滤驱动的常用功能。

如图1所示是一个简化的I/O 设备栈,其中有一个FltMgr 和三个MiniFilter 。

图1 简化的I/O 设备栈针对每一种I/O 操作,MiniFilter 只需注册预处理回调(pre-operation callback )和后处理回调(post-operation callback )即可。

FltMgr 会恰当的处理IRP 并在I/O 操作的前、后调用上述两个回调。

与传统过滤驱动相比,MiniFilter 优势明显。

首先,MiniFilter 代码十分简洁,开发迅速。

除去一些必要的注册工作,我们只需提供两个回调就可以完成对一种I/O 操作的过滤(甚至可以只提供一个,将另一个设为NULL )。

对于我们不感兴趣的I/O 操作,FltMgr 将完成基本的处理并继续传递。

其次,MiniFilter 是微软文档化的方法,具有良好的稳定性与跨平台性,一份代码不需修改便可以在不同系统上工作。

另外,FltMgr 还提供了许多通用的函数,帮助我们获得文件名等有用的信息。

下面我们动手编写一个MiniFilter 。

DriverEntry 中通过FltRegisterFilter 注册MiniFilter ,再通过FltStartFiltering 开始过滤。

extern "C" NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject , _In_ PUNICODE_STRING RegistryPath ) {DriverObject ->DriverUnload=Unload;黑客防线 w w w .h a c ke r .c o m .cn转载请注明出处DbgPrint("Load!\n");NTSTATUS status;//注册MiniFilterstatus=FltRegisterFilter(DriverObject ,&FilterRegistration,&F ilte rHandle);if (!NT_SUCCESS (status)) {DbgPrint("Fail to Register.\n");DbgPrint("%d\n",status==STATUS_OBJECT_NAME_NOT_FO UND ); return STATUS_SUCCESS ; }//开始过滤status=FltStartFiltering(FilterHandle); if (!NT_SUCCESS (status)){//启动失败,取消注册,返回FltUnregisterFilter(FilterHandle); DbgPrint("Fail to Start.\n"); return STATUS_SUCCESS ; }DbgPrint("MiniFilter Started\n"); return STATUS_SUCCESS ; } FltRegisterFilter 的原型为: NTSTATUS FltRegisterFilter(_In_ PDRIVER_OBJECT Driver,_In_ const FLT_REGISTRATION *Registration, _Out_ PFLT_FILTER *RetFilter );第一个参数为驱动对象,即DriverEntry 中传入的参数;第二个参数指向FLT_REGISTRATION 结构,我们稍后详细介绍;第三个参数是返回的MiniFilter 句柄,需要保存在全局变量中,因为函数FltStartFiltering 和FltUnregisterFilter 都要用到它。

文件过滤的一点总结

文件过滤的一点总结

文件系统驱动文件系统驱动主要生成两类设备:文件系统控制设备,文件系统的卷设备文件系统控制设备:主要任务是修改整个驱动的内部配置文件系统的卷设备:一个卷对应一个逻辑盘发送给控制设备的请求(IRP),一般是文件系统控制IRP(主功能号为IRP_MJ_FILE_SYSTEM_CONTROL);发送给卷设备的IRP一般则是文件操作IRP。

过滤的目标最终是为了得到文件操作的IRP,但是控制设备的IRP,一般用来捕获卷设备的生成信息,所以我们要先绑定文件系统的控制设备,达到绑定文件系统的卷设备的目的~~(1)生成自己的一个控制设备,当然必须给控制设备指定名称(2)设置普通分发函数(3)设置快速IO分发函数(4)编写一个文件系统变动回调函数,在其中绑定刚激活的文件系统控制设备(动态绑定)(5)使用IoRegisterFsRegistrationChange调用注册这个回调函数文件系统控制设备的绑定过滤设备扩展typedef struct _SFILTER_DEVICE_EXTENSION {ULONG TypeFlag;//// 绑定的文件系统设备(真实设备)//PDEVICE_OBJECT AttachedToDeviceObject;//// 与文件系统设备相关的真实设备(磁盘),这个在绑定时使用////PDEVICE_OBJECT StorageStackDeviceObject;////// 如果绑定了一个卷,那么这是物理磁盘卷名;否则这是绑定的控制设备名////UNICODE_STRING DeviceName;//// 用来保存名字字符串的缓冲区//WCHAR DeviceNameBuffer[MAX_DEVNAME_LENGTH];//// The extension used by other user.//UCHAR UserExtension[1];} SFILTER_DEVICE_EXTENSION, *PSFILTER_DEVICE_EXTENSION;绑定文件系统控制设备SfAttachToFileSystemDevice文件系统控制设备已经被绑定,绑定的目的是为了获得发送给文件系统控制设备的文件系统控制请求。

文件过滤驱动加载过程

文件过滤驱动加载过程

文件过滤驱动学习笔记(二)1.概述刚学习文件系统过滤时只是做一些简单的应用也没有深究其中的细节;说起来对文件系统过滤也只是一知半解惭愧的很。

后与人讨论发现很多细节自己很模糊;比如其中涉及的驱动对象之间的区别、卷设备加载对文件过滤驱动的影响等。

自己还是需要仔细研究一下,最近查了一些官方及前辈们的资料似乎有些理解在此记录下来做个笔记。

2.相关对象说明在文件过滤驱动学习中会遇到几种设备对象总是混淆。

最近硬着头皮查阅DDK才有些理解。

2.1.存储设备(Storage Device)存储设备可以理解为一个磁盘、一个CD;它可以物理的也可以是逻辑的,它上边可以有一个或多个卷设备对象。

大多数存储设备是一个PnP设备,它们由PnP管理器加载。

存储设备表现为PnP设备树(PnP Device Tree)上的一个节。

注意:文件系统驱动和文件系统过滤驱动都不是PnP设备驱动。

2.2.存储卷(Storage Volume)存储卷是一个存储设备如固定磁盘,软盘,CD盘,格式化后存储的目录与文件。

一个很的大卷可以被分成一个或多个逻辑卷;每一个卷都会被格式化成指定的一种格式,如NTFS,FA T等。

它通常是一个物理设备对像(PDO)。

它与文件系统卷对象是不同的。

2.3.文件系统卷设备对象(File System VDO)一个存储卷被文件系统加载时就会产生一个文件系统卷设备对像(File System VDO);它总是与指定的逻辑或物理设备相联结(这里我理解应该是说它总是代表了一种数据存储及组织格式,也就是我们常说的FA T和NTFS)。

文件系统过滤驱动就是要附加到这种设备对象上过滤读写相关的操作。

DDK上说文件系统卷设备对象是不需要命名的,因为给它命名会带来安全隐患;这点没有太理解还需要再查阅一些资料。

2.4.文件系统控制设备对象(File System CDO )文件系统控制设备对象是一个文件系统的入口,它不是单个的卷并且它是存储在全局文件系统队列里的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

文件系统过滤驱动,是在驱动级别上实现的,对文件系统的一举一动进行检测的一种技术。

这里仅指windows操作系统。

过滤包括文件打开、读写、重命名、删除,目录的操作等。

文件过滤非常有用,大多数实时监控的杀毒软件都会利用到这个技术。

从今天开始,分享在学习过程中的一些心得。

Wdk提供了一个sfile例子,供我们参考。

微软的习惯很好,在抛出一个新的东西之后,它的文档肯定有一个同步的跟进。

并且文档做得非常好,msdn,各种help。

比起google的android,微软的脚步走得更加坚实。

言归正传。

源文件在我电脑的路径是C:\WinDDK\6001.18002\src\filesys\filter\sfilter。

这个目录下有乱七八糟8个文件,而真正的代码只有sfilter.c一个。

让我们开始揭开它神秘的面纱吧。

看代码一般从入口开始看起。

DriverEntry。

sfilter的DriverEntry做了三件事。

1填充MajorFunction,2填充fastIoDispatch,3注册文件系统变化回调。

1.填充MajorFunction
这个不多说了,上层应用程序调用驱动时,就是利用这些接口。

比如CreateFile 时候,会调用IRP_MJ_CREATE。

我们要进行过滤,就需要在这些例程中做事情。

2.填充fastIoDispatch
这个我至今没看懂啥意思。

不过看雪上的高人都说,这个东西没必要管它,最多只是速度上的损失。

3.注册系统变化回调
status = IoRegisterFsRegistrationChange( DriverObject, SfFsNotification );
SfFsNotification这个函数是绑定设备控制对象的关键所在。

其重要性就在于,它能探测动态加载的卷设备,包括u盘等。

这里着重说说这个东西。

我们知道,驱动中实现过滤的一般方法就是绑定。

绑定一个我们自己的设备对象到设备栈顶,所有的IRP信息到来后首先到达我们的设备对象,从而可以优先获取系统信息。

IRP类似于应用程序中的message。

比如我敲了一个键盘,在windows内部就是发出了若干个消息,我点了某个按钮,也是发送了某些message。

在应用程序中,接收消息的东西叫窗口,window,在内核中,接收“消息”的东西叫DeviceObject,设备对象。

驱动对象DriverObject在内核中唯一对应于一个驱动程序。

一个驱动对象DirverObject可以对应多个设备对象DeviceObject。

那这么多的设备对象,我怎么知道消息发送给我自己新建然后绑定到设备栈顶的那个设备对象了呢?
据我的理解,有两种方式可以让DriverObject找到自己的设备对象。

一个是利用全局变量,将新建的设备对象保存起来,比如
Static PDEVICE_OBJECT MyDeviceObject;//全局变量
NTSTATUS DriverCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) {
if(DeviceObject == MyDeviceObject)
{
//是我绑定的设备对象
}
}
另外一种是利用扩展设备对象。

DeviceExtension。

设备扩展是与设备对象关系很密切的一种数据结构,常常用来保存与特定设备相关的信息。

可以在程序中利用下面的语句判断是否是自己的设备对象:
#define IS_MY_DEVICE_OBJECT(_devObj) \ (((_devObj) != NULL) && \ ((_devObj)->DriverObject == gSFilterDriverObject) && \ ((_devObj)->DeviceExtension != NULL))。

相关文档
最新文档