WindowsNT文件系统过滤驱动的原理及应用
windowsfirewall authorization driver
windowsfirewall authorization driverWindows Firewall 是一个内置在Windows 操作系统中的防火墙软件,用于保护计算机免受恶意软件和网络攻击的威胁。
Windows Firewall 可以通过配置来控制网络通信的入站和出站流量,以确保计算机的安全性。
Windows Firewall Authorization Driver 是一个与Windows Firewall 相关的驱动程序,它允许Windows Firewall 控制网络通信的入站和出站流量。
这个驱动程序通过过滤和拦截网络数据包来实现对网络通信的控制,以确保计算机的安全性。
Windows Firewall Authorization Driver 的工作原理是通过过滤网络数据包来实现对网络通信的控制。
当一个应用程序尝试进行网络通信时,Windows Firewall 会检查该应用程序的网络请求,并决定是否允许或拒绝该请求。
如果请求被拒绝,则Windows Firewall 会阻止该应用程序的网络通信。
Windows Firewall Authorization Driver 的优点是它能够提供强大的网络通信控制功能,并有助于保护计算机免受恶意软件和网络攻击的威胁。
此外,由于它是Windows 操作系统的一部分,因此它与Windows 系统集成良好,易于使用和管理。
然而,Windows Firewall Authorization Driver 也有一些局限性。
例如,它可能无法检测到某些类型的恶意软件或网络攻击,也可能无法控制某些应用程序的网络通信。
此外,由于它是操作系统的一部分,因此其配置和设置可能较为复杂,需要具备一定的计算机知识和管理技能。
总的来说,Windows Firewall Authorization Driver 是Windows 操作系统中的一个重要组件,它有助于保护计算机免受恶意软件和网络攻击的威胁。
实现一个具有还原功能的磁盘卷过滤驱动
实现⼀个具有还原功能的磁盘卷过滤驱动磁盘过滤驱动的概念1.设备过滤和类过滤在之前的⽂章⾥,我们已经介绍过滤的概念,所谓过滤技术就是在本来已有的设备栈中加⼊⾃⼰的⼀个设备。
由于Windows向任何⼀个设备发送IRP请求都会⾸先发送给这个设备所在设备栈的最上层设备,然后再依次传递下去,这就使得加⼊的设备在⽬标设备之前获取Irp请求称为可能,这时候就可以加⼊⾃⼰的处理流程。
在这⾥把插⼊设备栈的⽤户设备叫做过滤设备,建⽴这个设备并使其具有特殊功能的驱动叫做过滤驱动。
在前⾯已经展⽰了如何去建⽴⼀个过滤设备并将其绑定在⼀个有名字的设备上,这叫做设备过滤,这是对某个特定设备加以过滤的⽅法。
但是在实际应⽤中,这种⽅法还存在⼀些问题,例如,Windows中有很多即插即⽤设备,如何在这些设备加⼊系统的时候就⾃动对他们进⾏绑定呢?实际上,在Windows的过滤驱动框架中,还有⼀种叫做类过滤驱动的驱动程序,能够在某⼀类特定的设备建⽴时有Pnp Manager调⽤指定的过滤驱动代码,并且允许⽤户对此时这⼀类设备进⾏绑定。
根据⽤户设备在整个设备栈中的位置可以分为上层过滤和下层过滤。
2.磁盘设备和磁盘卷设备过滤驱动在Windows的存储系统中,最底层的是磁盘,⽽在磁盘上⾯⼜有卷,卷虽然只是逻辑上的⼀个概念,但是Windows仍然为其建⽴了设备,所以在Windows的存储系统⾥有磁盘设备和磁盘卷设备两种类型的设备。
如果⼀个磁盘卷位于某个磁盘上,那么对于磁盘卷的访问最终也会体现在相应的磁盘上。
但是这并不意味着他们在⼀个设备栈上,irp不会原封不动从磁盘卷设备栈上⼀直传到磁盘设备栈上,更何况Windows中还存在着跨磁盘的卷,软RAID卷等不能对应到唯⼀磁盘上的卷。
从驱动的⾓度上来讲,这两种设备受到读/写请求都是针对与磁盘⼤⼩或者卷⼤⼩范围之内的请求,都是以扇区⼤⼩对齐,处理起来也没有什么太⼤的区别。
在此我们选⽤磁盘卷设备的上层类过滤驱动。
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 获取全路径时需要注意,不
隔离驱动的原理
隔离驱动的原理隔离驱动(Isolation Driver)是一种软件技术,在计算机系统中起到隔离和保护作用。
它通过对计算机硬件和软件资源的抽象和隔离,实现不同应用程序之间的资源隔离,确保它们能够独立运行,相互之间不会干扰或影响。
这篇文章将详细介绍隔离驱动的原理和实现方法。
隔离驱动的原理可以分为硬件隔离和软件隔离两部分。
硬件隔离是通过使用硬件资源,如CPU、内存、I/O设备等来实现不同应用程序之间的隔离。
现代计算机系统通常采用虚拟化技术来实现硬件隔离。
虚拟化是指将物理资源虚拟化为多个虚拟资源,在每个虚拟资源中运行一个独立的操作系统和应用程序。
虚拟化技术主要有三种形式:全虚拟化、半虚拟化和容器虚拟化。
全虚拟化是指在虚拟机中运行完整的操作系统,可以在虚拟机中加载任何操作系统和应用程序。
全虚拟化主要通过虚拟机监视器(VMM)来实现,VMM会对操作系统进行修改并拦截所有关键的指令,然后将它们翻译成底层计算机硬件能够理解和执行的指令。
全虚拟化可以实现完全隔离,不同的应用程序无法相互访问对方的数据或指令。
半虚拟化是指在虚拟机中运行修改过的操作系统,这些操作系统能够直接与VMM进行通信。
半虚拟化通常需要对操作系统进行修改,以便它能够使用一组特殊的超级指令集来与VMM进行通信。
半虚拟化比全虚拟化性能更好,但需要针对特定的操作系统进行修改,可移植性较差。
容器虚拟化是指在共享的操作系统内核上创建一个隔离的用户空间。
容器虚拟化可以在同一操作系统上运行多个相互隔离的应用程序,共享同一操作系统内核,但在用户空间中是彼此独立的。
容器虚拟化轻量且性能高效,但无法实现完全隔离。
软件隔离是通过软件技术来实现应用程序之间的隔离。
软件隔离主要通过可执行程序、进程和线程之间的隔离来实现。
操作系统会为每个应用程序分配独立的进程和线程,这样每个进程和线程都可以独立运行,相互之间不会干扰或影响。
此外,操作系统还通过进程间通信(IPC)机制来实现进程之间的通信和资源共享。
浅析WindowsNT内核下的病毒防火墙原理
并支持兼容 ; 在线程操作方面也很有特色 , 具备多线程多任务 器 设备之间设置一道安全措施 ,能有效 的拦截 病毒 , 防止 网络 的特 点外,还具有抢先式的功能 , 为用户提供 了多种 多样 地选 恶意攻击 。 择 ;采用 S MP 技术 ,并支持多处理器系 统;支持 C S ( IC 如 当病 毒防火墙运行的时候 , 内存 中会 自动存储着 一些用 以 Itl 统)和 R S 如 P we P 、R 4 0 )多种硬件平 台; 病毒特 征监控的程序 , ne 系 IC( o r C 4 0 等 对系统进行实 时的监控 ,随时观 察并发 如 提 供安全存取控制及容错 能力 , 可与各种 网络操 作系统协调合 现 系统运 行过程 中是否存在有病毒 的迹象 ; 果监控 病毒程序 作 ,如 :UN X I 、No e。W n o vl i d ws NT内核 的意义在于将用 户 的检 测结果表 明文件 中携带有病 毒或者 是具有携 带病毒 的痕 模式和 内核模式分离 ,这可使得系统更 安全 ,稳 定。 迹, 病毒 防火墙就会 自动启动激活, 对相 关文件进行对应处理 。 实际上 , 所有 的 W n o i d ws NT内核 的组件来 说其 本身都是 防火墙在 激活之后首要步骤就是 阻止病毒 的进 入过程 , 并且阻 DLP L 、 E格式的.X E E文件 以及 导入 导出函数 。 因此 , no s 止 携毒文件 的开启 或运行 ,紧 接着对 带毒的文件 进行二 次查 i W dw N T内核的主要组件可 以分 为以下一种: 杀 , 终将病 毒消灭 。 最 病毒防火的工作方式大致上就 是如上述 第 一种就是* ok . e Ntsm1 x ,其 作为系统的核心 ,因而系统 文字所描述 的那样 , 计算机系统进行保护 以此避 免其遭 受到 e 对 中所有 涉及到的执行 函数全部集 中在这里 , 与此 同时这些函数 病毒 的侵 袭而造成损失 。因此,从这个 角度来分析 , 毒防火 病 又 能够起 到调用 其它组件 的作用 。 对于这一部分 的核心组 件主 墙 的实 际作用 并不再是对网络环境 中的病毒进 行简单的监控 , 要包括有进 线程 创建、L C P 、对象管理器 、安全管理、文件 系 它会 对计算机 系统运行 过程 中的所 有涉及 到 的应用 软件进 行 统 、进 线程控制 、异 常处理、 内存 管理器 、V DM、输入输 出 湿湿 的监控 ,全方位、系统化的监控将从真正意义上保 障用 户 和L. 且这些组件 一般情况 下均位于大于 8 10 0 h的地址上 。 0 000 系统 的安全 ,使得用户系统能够长期处于 “ 毒”环境之 中。 无 第 二 种 就 是 作 为 硬 件 抽 象 层 ( ad ae A s at n H rw r b  ̄ ci o 就 当前 计算机 技术的 日益发展 , 病毒 的多样性 也是 其发 展 L yr ae )也就是处于硬件相 关的模块的 1 l Ha. l 隔离层主要 进程 中的一项衍 生产物 。 d 。该 并且有 许多的病毒 的主要传播途径 就 的任务就是将操 作系统中与硬件相关的部分进行 隔离 出来 , 以 是通过 网络 , 这也 就在 一定程度 上为涉及范畴不 同的两种 防火 此提高系统 的可移植性 。 主要的模块 的任务就是负责 实现程序 墙产 品( 毒防火墙和网络防火墙) 病 提供 了交叉使 用的可能性 。 控制 中断 以及硬件输入 输出等等非常底层的 函数 。 一般情况 下 除此之外 , 目前 而言有许多的网络防火墙也增加 了病 毒防火 就 同样是位于大 于 8 1 0 0 h的地址之上 的。 0000 墙所具有 的病 毒检 测和防御的功能 。 与此 同时, 对于一些 网络 第三种就是 * d . ,其作为某些 W n 2 AP NtUd U i 3 I的实现 函 入侵所特 有的后 门软件 ( 诸如木 马之类 的) ,也 同样被 是作为 数, 主要 负责提供核心 模式与用户模式之 间的接 口。 其一般情 “ 病毒 ”范畴,这也就导致其能够轻易地被 “ 毒防火墙 ”监 病 况下 是位 于用户 空间 ,即系统 函数 调用 的过 程就是 从这里 导 控到并实 时进行清 除。 目前的趋势而言 , 就 病毒 防火墙在 网络 出。 安全保护 中 占据着 不可或缺的地位 。 第 四种就是* en l2ml K re . ,其作为类似于 W n x的核心 的 3 i 9 3 w o sN dw T内核 下 的病毒 防 火墙 原理 i n 项组件主要是 负责 实现 一些 函数 , 并且其 中有很多 的函数封
#Windows文件系统过滤器之微过滤器驱动开发指南
微过滤器驱动开发指南0.译者序对我来说,中文永远是最美,最简洁,最精确和最高雅的文字。
本文翻译仅仅用做交流学习。
我不打算保留任何版权或者承担任何责任。
不要引用到赢利出版物中给您带来版权官司。
本文的翻译者是楚狂人,如果有任何问题,,或者是QQ16191935,或者是MSN 。
我翻译此文出于对文件系统技术的兴趣。
这就是新的文件系统过滤接口。
其实也不算什么新的东西,微软开发了另一个“旧模型的”过滤驱动,称之为过滤管理器<Filter Manager)。
从而提供了一系列新的接口来让你开发新的过滤器。
确实这套接口变简单清晰了。
你至少避免了包含无数个信息的IRP,避免了请求在各个部件中循环的发来发去,一个分发例程中处理无数中情况,一不小心系统崩溃。
我不知道花了多少时间才弄明白一个简单的缓冲读请求从用户到过滤到文件系统和缓冲管理器,虚拟内存管理器之间的关系!现在你也许不需要再管他们了,仅仅做好自己的过滤工作就可以。
这套接口强大吗?能实现你想要的功能吗?你很快就发现你没有研究过sfilter就看不懂Minifilter,或者是还得从sfilter开始做起更灵活一点。
微软就是这样,拿僵硬而且也不简单的东西来“简化”强大灵活但是设计上一团糟的东西,对于你来说是两者都必须学习,最后你的脑子被微软塞得满满的,不过没关系,我们已经习惯了.此文的原文是《Filter Driver Development Guide》,出自微软的网站。
我在以下这个地址下载得到此文:我尽量在翻译中使文章保持原貌。
如果您认为此文无法理解,建议您首先阅读旧的文件过滤驱动的相关资料。
我认为必须有文件系统和windows驱动的相关知识,才能阅读此文。
我未必总是使用规范的名词,但我总是使用最容易理解的名词。
一些常用的可能不翻译,比如IRP,MDL,有驱动开发经验的人应该可以理解。
另一些可能采用中文<英文)的方式。
一些解释如下:例程<Routine):我不懂得例程和函数有什么不同。
隔离驱动方案
隔离驱动方案1. 引言随着计算机技术的发展,驱动程序在操作系统中扮演着非常重要的角色。
驱动程序作为软件的一部分,负责与硬件设备进行交互,使得操作系统能够正确地识别、管理和控制各种硬件设备。
然而,驱动程序的错误或者恶意代码可能会导致系统的崩溃、性能下降或者安全漏洞。
因此,为了保证系统的稳定性和安全性,提出了一种隔离驱动方案。
2. 概述隔离驱动方案是一种通过软硬件相结合的方法,将驱动程序与操作系统进行隔离,从而保护系统的稳定性和安全性。
通过隔离驱动,可以实现以下目标:•防止驱动程序的错误或者恶意代码影响操作系统的正常运行;•提高系统的容错能力,保证系统的稳定性;•减小驱动程序对系统性能的影响;•防止恶意驱动程序对系统进行攻击。
3. 隔离驱动方案的实现隔离驱动方案的实现主要包括以下几个方面的工作:3.1 虚拟化技术虚拟化技术是隔离驱动方案的基础。
通过将驱动程序运行在虚拟机等隔离环境中,可以实现驱动程序与操作系统的隔离。
常见的虚拟化技术包括:•完全虚拟化:在虚拟机中运行完整的操作系统,使得驱动程序运行在虚拟机的环境中,与主机操作系统进行隔离。
•半虚拟化:在主机操作系统中运行一个修改过的驱动程序,使得驱动程序与操作系统进行隔离,但是性能较完全虚拟化有所下降。
•容器化技术:将不同的驱动程序运行在独立的容器中,每个容器都拥有独立的文件系统、网络等资源,实现驱动程序的隔离。
3.2 异步通信机制为了保证驱动程序与操作系统的正常交互,需要设计一种高效的异步通信机制。
该通信机制应当能够实时地获取驱动程序的状态,并将结果传递给操作系统进行处理。
常见的异步通信机制包括消息队列、事件通知等。
3.3 安全监控机制为了保证驱动程序的安全性,需要设计一种安全监控机制,对驱动程序进行实时监控和分析。
该监控机制可以检测到驱动程序的异常行为,并及时采取相应的措施,防止驱动程序对系统造成危害。
4. 隔离驱动方案的优势与挑战4.1 优势•提高系统的稳定性和安全性,减少由于驱动程序错误引起的系统崩溃和性能下降;•增加系统的容错能力,即使驱动程序出现错误也不会对系统造成严重影响;•减小驱动程序对系统性能的影响,提升系统的性能和响应能力;•增加系统的安全性,防止恶意驱动程序对系统进行攻击。
minifilter 通信的原理
Minifilter 是Windows 操作系统中的一种过滤驱动程序,用于在文件系统层面对文件和文件操作进行监控和控制。
它的通信原理主要涉及以下几个方面:1. 注册和加载:Minifilter 首先需要在系统中注册并加载,以便在文件系统层面进行拦截和处理。
注册时,Minifilter 需要提供一个唯一的名称,并指定它要监控的文件系统类型。
2. 过滤器函数:Minifilter 通过实现一系列的过滤器函数来拦截和处理文件操作。
这些过滤器函数包括预创建、创建、打开、关闭、读取、写入等等。
当文件系统执行这些操作时,Minifilter 可以在相应的过滤器函数中进行处理。
3. 通信接口:Minifilter 可以通过与用户模式的应用程序进行通信来实现更复杂的功能。
它提供了一些通信接口,如FltSendMessage、FltSendMessageAsync 等,用于在内核模式和用户模式之间传递数据和命令。
4. 通信方式:Minifilter 的通信方式可以是同步的或异步的。
同步通信是指应用程序发送请求后,等待Minifilter 处理完成并返回结果。
异步通信是指应用程序发送请求后,继续执行其他操作,而不需要等待Minifilter 处理完成。
5. 数据传递:Minifilter 通过数据结构来传递信息。
例如,当应用程序发送请求时,可以通过一个结构体来传递请求的类型和参数。
而当Minifilter 返回结果时,也可以通过一个结构体来传递处理结果。
总的来说,Minifilter 的通信原理是通过注册和加载、过滤器函数、通信接口和数据传递来实现的。
它可以在文件系统层面对文件和文件操作进行监控和控制,并与用户模式的应用程序进行通信,实现更复杂的功能。
IPSec原理与实践
IPSec原理与实践随着越来越多的企业、单位接入Internet与接入速度的不断提高,网络安全正日益成为网络管理的一个重要课题。
作为广泛部署的Windows(NT)Server系统自身的安全受到越来越多的关注。
市场上也出现了很多软、硬件防火墙产品来保证内网服务器的安全。
事实上,Windows(NT)Server系统自身便带有功能强大的防火墙系统-IPSec,其全面的安全保护功能并不输于其它商业防火墙产品。
本文将介绍基于Windows操作系统的防火墙系统-IPSec的原理与实现。
1TCP/IP过滤在深入探讨IPSec之前,我们首先来看一下Windows系统的TCP/IP过滤功能。
Windows 2000 Server系统内部集成了很多安全特性,这包含"本地安全及审核策略"、"加密文件系统"、"TCP/IP过滤"、"IP安全(IPSec)"等等。
其中的"TCP/IP过滤"为用户提供了一个简单、易于配置、易于使用的网络安全保障工具。
它是用于入站本地主机TCP/IP通讯的一组筛选器。
使用TCP/IP筛选能够为每个IP接口严格指定所处理的传入TCP/IP通讯类型。
这个功能设计用于隔离Internet或者Intranet服务器所处理的通信。
如图1所示,使用"TCP/IP"筛选,能够根据下列三种方式来限制本地主机的入站TCP/IP 通讯:●目标TCP端口●目标UDP端口●IP协议(号)"TCP/IP筛选"的使用有很多限制,如不能根据源地址来区别对待数据包的入站、不能对出站通信进行筛选、不能对已同意的通信进行加密等等。
假如想要实现更加灵活、安全的设计,则务必使用IPSec。
2IPSec原理使用internet协议安全(Internet Protocol Security,IPSec)是解决网络安全问题的长久之计。
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函数(不再继续往下调)。
基于磁盘过滤驱动的硬盘保护技术
基于磁盘过滤驱动的硬盘保护技术作者:魏希三,董巍来源:《电脑知识与技术》2009年第35期摘要:针对传统利用中断方式的磁盘保护有不少安全隐患,分析了一种基于磁盘过滤驱动的硬盘保护工作机制。
该机制的核心思想是在对上层操作系统透明的情况下,重定向对磁盘操作的I/O请求包,在重启系统后自动清除缓存数据。
由于工作在操作系统内核层增强了保护功能的安全性。
关键词:中断;过滤驱动;硬盘保护;I/ O 请求包中图分类号:TP334文献标识码:A文章编号:1009-3044(2009)35-10106-02The Technology of Hard-disk Protection Method Based on Disk Filter DriverWEI Xi-san1,2, DONG Wei2(puter School of Wuhan University, Wuhan 430072, China; puter Teaching Center, Xiangfan University, Xiangfan 441053, China )Abstract: The traditional method of disk protection using interrupted many security risks, analysis of a filter driver for hard disk-based protection mechanism. The core idea of the mechanism is operating in the upper transparent circumstances, the redirection operation of the disk I/O request packet, in the reboot the system automatically clear the cache data. As a result of the operating system kernel layer of enhanced security protection.Key words: INT; filter driver; hard-disk protection; IRP传统的硬盘保护软/硬件,主要是拦截和接管INT13H中断,比如现有常见的还原卡就是在引导系统前就预先修改中断表,用自己的处理函数替换了正常的INT13H,在上层系统对磁盘进行存取时,进行相应的偏移,这种保护技术几乎兼容所有的操作系统,并且对硬盘上的数据能起到完整的保护作用,但它消耗大量的存储空间(和被保护空间为1:1),不兼容特殊工作的硬盘(如SCSI硬盘),保护空间大小有限制(如DOS兼容模式的2.1G,LBA28位寻址的137G限制),并且容易被破解(找到原始的IHT13H的地址,修改即可)。
防火墙包过滤技术分析
防火墙包过滤技术分析[摘要] 随着计算机网络技术的突飞猛进,网络安全的问题已经日益突出地摆在各类用户的面前。
而防火墙已经成为一般企业用来保护自身网络安全的主要机制,因此对防火墙技术进行深入探讨是非常必要的。
防火墙技术主要分为包过滤和应用代理两类。
从数据包结构出发,分析包过滤技术,首先提出包过滤技术的核心问题;然后在分析传统包过滤技术缺陷的基础上,详细论述了包过滤技术的两种发展趋势。
[关键词] 防火墙包过滤动态包过滤深度包检测一、引言随着Internet的迅速发展,网络应用涉及到越来越多的领域,网络中各类重要的、敏感的数据逐渐增多;同时由于黑客入侵以及网络病毒的问题,使得网络安全问题越来越突出。
因此,保护网络资源不被非授权访问,阻止病毒的传播感染显得尤为重要。
就目前而言,对于局部网络的保护,防火墙仍然不失为一种有效的手段。
防火墙技术主要分为包过滤和应用代理两类。
其中包过滤作为最早发展起来的一种技术,其应用非常广泛。
所谓包过滤,就是对流经网络防火墙的所有数据包逐个检查,并依据所制定的安全策略来决定数据包是通过还是不通过。
包过滤最主要的优点在于其速度与透明性。
也正是由于此,包过滤技术历经发展演变而未被淘汰。
考虑包过滤技术的发展过程,可以认为包过滤的核心问题就是如何充分利用数据包中各个字段的信息,并结合安全策略来完成防火墙的功能。
二、包过滤防火墙工作原理包过滤防火墙工作在OSI网络参考模型的网络层和传输层,它根据数据包头源地址,目的地址、端口号和协议类型等标志确定是否允许通过。
只有满足过滤条件的数据包才被转发到相应的目的地,其余数据包则被从数据流中丢弃。
包过滤方式是一种通用、廉价和有效的安全手段。
之所以通用,是因为它不是针对各个具体的网络服务采取特殊的处理方式,适用于所有网络服务;之所以廉价,是因为大多数路由器都提供数据包过滤功能,所以这类防火墙多数是由路由器集成的;之所以有效,是因为它能很大程度上满足了绝大多数企业安全要求。
Windows文件系统过滤驱动开发教程
Windows文件系统过滤驱动开发教程(转载)Windows文件系统过滤驱动开发教程0. 作者,楚狂人自述我长期网上为各位项目经理充当“技术实现者”的角色。
我感觉Windows文件系统驱动的开发能找到的资料比较少。
为了让技术经验不至于遗忘和引起大家交流的兴趣我以我的工作经验撰写本教程。
我的理解未必正确,有错误的地方望多多指教。
有问题欢迎与我联系。
我们也乐于接受各种驱动项目的开发。
邮箱为MFC_Tan_Wen@,QQ为16191935。
对于这本教程,您可以免费获得并随意修改,向任何网站转贴。
但是不得剽窃任何内容作为任何赢利出版物的全部或者部分。
1. 概述,钻研目的和准备我经常在网上碰到同行请求开发文件系统驱动。
windows的pc机上以过滤驱动居多。
其目的不外乎有以下几种:一是用于防病毒引擎。
希望在系统读写文件的时候,捕获读写的数据内容,然后检测其中是否含有病毒代码。
二是用于加密文件系统,希望在文件写过程中对数据进行加密,在读的过程中进行解密。
三是设计透明的文件系统加速。
读写磁盘的时候,合适的cache算法是可以大大提高磁盘的工作效率。
windows本身的cache算法未必适合一些特殊的读写磁盘操作(如流媒体服务器上读流媒体文件)。
设计自己的cache算法的效果,我已在工作中有所感受。
如果你刚好有以上此类的要求,你可以阅读本教程。
文件系统驱动是windows系统中最复杂的驱动种类之一。
不能对ifsddk中的帮助抱太多希望,以我的经验看来,文件系统相关的ddk帮助极其简略,很多重要的部分仅仅轻描淡写的带过。
如果安装了ifsddk,应该阅读srcfilesysOSR_docs 下的文档。
而不仅仅是ddk帮助。
文件系统驱动开发方面的书籍很少。
中文资料我仅仅见过侯捷翻译过的一本驱动开发的书上有两三章涉及,也仅仅是只能用于9x的vxd驱动。
NT文件系统我见过一本英文书。
我都不记得这两本书的书名了。
如果您打算开发9x或者nt文件系统驱动,建议你去网上下载上文提及的书。
磁盘过滤驱动 原理
磁盘过滤驱动原理
磁盘过滤驱动(Disk Filter Driver)是一种在操作系统内核中
运行的驱动程序,用于对磁盘操作进行拦截、过滤和修改。
其原理可以简单概括为以下几个步骤:
1. 注册:磁盘过滤驱动在加载到系统内核之前需要先进行注册,以便于操作系统在启动时加载该驱动。
2. 拦截:磁盘过滤驱动通过拦截操作系统发出的磁盘相关的系统调用(如读取文件、写入文件等),将这些调用转发给自身处理。
3. 过滤:磁盘过滤驱动根据自身的逻辑对拦截到的磁盘操作进行过滤。
可以根据需求对文件进行加密、解密、压缩、解压缩等操作。
也可以对读取写入的数据进行修改、删除等操作。
4. 转发:磁盘过滤驱动在过滤后,可以将磁盘操作转发给下层的磁盘驱动程序,以完成实际的磁盘读写操作。
或者也可以直接向应用程序返回修改后的数据。
5. 反馈:磁盘过滤驱动可以向操作系统返回对磁盘操作的处理结果,以便操作系统进一步处理或通知相关的应用程序。
总的来说,磁盘过滤驱动通过在操作系统内核中的位置,拦截并过滤磁盘操作,以实现对磁盘数据进行修改、保护或监控的功能。
通过编写磁盘过滤驱动,可以实现诸如数据加密、文件压缩、行为监控等功能。
Minifilter过滤,功能实现对驱动目录的监控,包括创建,重命名,删除并实现hips
Minifilter过滤,功能实现对驱动⽬录的监控,包括创建,重命名,删除并实现hips 注意下:我的这套过滤只能⽤在nt6系统上原因是使⽤⼀个nt6上才有的函数见函数PsGetProcessFullName其实没必要⾃⼰来写获取全路径因为minifilter已经给我们提供了获取全路径的函数FltGetFileNameInformation我就不改了,哈哈说说遇到的问题吧在监控创建的时候,我是在post中监控,我拒绝后,会弹窗,2-3次吧,也就是会请求2-3次,我的解决⽅法是记录上⼀次拒绝的⽂件全路径,然后下⼀次来的时候来⽐对这⾥可以将处理过的⽂件加⼊链表或者hash,我偷懒了,就直接⽤这种⽅法来解决多重求情的问题,这⾥注意下,出现多次请求的原因是你第⼀次放⾏了,那么我们第⼆次的时候就知道⽐对的时候就直接放⾏了考虑过在pre中监控但根据MF周⽼师的意见说在这⾥拿到的信息是不准确的,可以⽤下⾯⼀句话总结:在pre中是对请求本⾝就⾏拦截,在post中是对请求完成结果的拦截.遵循周⽼师的意见,我还是在post中监控在拦截创建的时候,还有⼀个问题,就是如果创建的时候我拒绝了,那么返回给⽤户的会出现⼀个替换的框(⽂件已存在,但⼤⼩是0)针对这个情况,我直接对这个data设置⽂件属性有点像前⾯学习的IRP下发强删⽂件[cpp]1. //就算拒绝了也会创建⼀个空⽂件这⾥我们删除2. fdi.DeleteFile = TRUE;3. FltSetInformationFile(FltObjects->Instance, FltObjects->FileObject, &fdi, sizeof(FILE_DISPOSITION_INFORMATION), FileDispositionInformation);//就算拒绝了也会创建⼀个空⽂件这⾥我们删除fdi.DeleteFile = TRUE;FltSetInformationFile(FltObjects->Instance, FltObjects->FileObject, &fdi, sizeof(FILE_DISPOSITION_INFORMATION), FileDispositionInformation);在post中我们可以使⽤FltCancelFileOpen 或者FltCancelFileIrp(未)来取消前⾯的操作还有⼀点是,刚开始写的时候我直接对Create的回调函数进⾏过滤,没有判断⽂件打开的属性,或是⽂件还是⽂件夹然后⼀直弹窗,然后你懂得....然后就修复了对⽂件夹的判断和打开的判断这⾥其实是有BUG的为什么这么说呢,在CreateFile的函数中我们可以⽤FILE_OPEN_IF创建⽂件这⾥没有过滤这⾥不应该在内核中过滤原因是如果这⾥填写了对FILE_OPEN_IF的过滤,会不断弹窗,⽽且这个时候在这⾥已经不能判断⽂件是否存在了已经完成了已经⽣成了⼀个⽂件⼀个为空的⽂件那么怎么办呢,思路是得到此时⽂件的⼤⼩,如果是0则是新建,否则就是打开操作获取⼤⼩的⽅法我知道的是通过FltReadFile去读⽂件然后BytesRead就是⽂件的⼤⼩还有⼀个思路就是在pre中过滤,此时⽂件还没有创建,我们得到⽂件的全路径,然后打开,如果返回NO_FOUND就说明是新建操作下⾯是对⽂件夹的判断[cpp]1. if (!NT_SUCCESS( Data->IoStatus.Status ) ||2. (STATUS_REPARSE == Data->IoStatus.Status)) {3.4. return FLT_POSTOP_FINISHED_PROCESSING;5. }6.7. Options = Data->Iopb->Parameters.Create.Options;8.9. if (FlagOn(Options, FILE_DIRECTORY_FILE) ||10. FlagOn(FltObjects->FileObject->Flags, FO_VOLUME_OPEN) ||12. {13. return FLT_POSTOP_FINISHED_PROCESSING;14. }15.16. ulDisposition = (Data->Iopb->Parameters.Create.Options >> 24) & 0xFF;17. if (ulDisposition == FILE_CREATE || ulDisposition == FILE_OVERWRITE || ulDisposition == FILE_OVERWRITE_IF)18. {19. PopWindow = TRUE;20. }if (!NT_SUCCESS( Data->IoStatus.Status ) ||(STATUS_REPARSE == Data->IoStatus.Status)) {return FLT_POSTOP_FINISHED_PROCESSING;}Options = Data->Iopb->Parameters.Create.Options;if (FlagOn(Options, FILE_DIRECTORY_FILE) ||FlagOn(FltObjects->FileObject->Flags, FO_VOLUME_OPEN) ||FlagOn(Data->Flags, SL_OPEN_PAGING_FILE)){return FLT_POSTOP_FINISHED_PROCESSING;}ulDisposition = (Data->Iopb->Parameters.Create.Options >> 24) & 0xFF;if (ulDisposition == FILE_CREATE || ulDisposition == FILE_OVERWRITE || ulDisposition == FILE_OVERWRITE_IF){PopWindow = TRUE;}另外遇到的问题是删除删除分两种⼀种是直接删除也就是shift+Del的⽅式这种没什么问题另外⼀种普通的删除,右键⽂件-删除-或者直接按Del这其实⼀个发现 + 更名的操作这个发现具体我也不知道怎么说,因为你普通删除⽂件的时候,不是有⼀个正在发现⽂件吗,就是统计⽂件的⼤⼩操作然后就是更名的操作这是我第⼀次实验时出现的情况我的操作是普通删除->放⾏->然后就出现了这个框有了这个后就简单了,在PreSetInforMation中获得⽂件全路径,匹配如果中间有Recycle.Bin的字符串但这不是准确的,我也偷懒啦⾄于重命名⽆⾮就是拿到重命名后的路径两种⽅法1.直接在buffer中拿2.FltGetDestinationFileNameInformation获得不懂的是:重命名的路径能直接在buffer中拿到为什么还要使⽤FltGetDestinationFileNameInformation呢,知道的⼈可以回复下[cpp]1. pRenameInfo = (PFILE_RENAME_INFORMATION)Data->Iopb->Buffer;2.3. /*4. //这也是可⾏的5. wstrTest = ExAllocatePool(NonPagedPool,pRenameInfo->FileNameLength + 1);6. if(wstrTest == NULL)7. leave;8.9. memset(wstrTest,'\0',pRenameInfo->FileNameLength + 1);10.11. wcsncpy(wstrTest,pRenameInfo->FileName,pRenameInfo->FileNameLength);12. DbgPrint("%ws\n",wstrTest);*/13.14.15. status = FltGetDestinationFileNameInformation(Instance,Data->Iopb->TargetFileObject,pRenameInfo->RootDirectory,pRenameInfo->FileName,pRenameInfo->FileNameLength,FLT_FILE_NAME_NORMALIZED,&pOutReNameinfo);16. if(!NT_SUCCESS(status))17. {18. DbgPrint("FltGetDestinationFileNameInformation is faild! 0x%x",status);19. leave;20. }21. wcsncpy(¬ification->RePathName,pOutReNameinfo->Name.Buffer,pOutReNameinfo->Name.MaximumLength);22.23. DbgPrint("重命名:%wZ\n",&pOutReNameinfo->Name);24.25. FltReleaseFileNameInformation(pOutReNameinfo);pRenameInfo = (PFILE_RENAME_INFORMATION)Data->Iopb->Buffer;/*//这也是可⾏的wstrTest = ExAllocatePool(NonPagedPool,pRenameInfo->FileNameLength + 1);if(wstrTest == NULL)leave;memset(wstrTest,'\0',pRenameInfo->FileNameLength + 1);wcsncpy(wstrTest,pRenameInfo->FileName,pRenameInfo->FileNameLength);DbgPrint("%ws\n",wstrTest);*/status = FltGetDestinationFileNameInformation(Instance,Data->Iopb->TargetFileObject,pRenameInfo->RootDirectory,pRenameInfo->FileName,pRenameInfo->FileNameLength,FLT_FILE_NAME_NORMALIZED,&pOutReNameinfo); if(!NT_SUCCESS(status)){DbgPrint("FltGetDestinationFileNameInformation is faild! 0x%x",status);leave;}wcsncpy(¬ification->RePathName,pOutReNameinfo->Name.Buffer,pOutReNameinfo->Name.MaximumLength);DbgPrint("重命名:%wZ\n",&pOutReNameinfo->Name);FltReleaseFileNameInformation(pOutReNameinfo);其他没什么了就是R3的处理了,我对创建多次请求的判断是放在R3的核⼼⽂件:R0[cpp]1. #include <fltKernel.h>2. #include <dontuse.h>3. #include <suppress.h>4. #include "scanuk.h"5. #include "scanner.h"6.7. #pragma prefast(disable:__WARNING_ENCODE_MEMBER_FUNCTION_POINTER, "Not valid for kernel mode drivers")8.9.10. NTSTATUS11. PsReferenceProcessFilePointer (12. IN PEPROCESS Process,13. OUT PVOID *OutFileObject14. );15.16. SCANNER_DATA ScannerData;17.18. UNICODE_STRING g_LastDelFileName = {0};19.20. //21. // This is a static list of file name extensions files we are interested in scanning22. //23.24. const UNICODE_STRING ScannerExtensionsToScan[] =25. { RTL_CONSTANT_STRING( L"doc"),26. RTL_CONSTANT_STRING( L"txt"),27. RTL_CONSTANT_STRING( L"bat"),28. RTL_CONSTANT_STRING( L"cmd"),29. RTL_CONSTANT_STRING( L"inf"),30. /*RTL_CONSTANT_STRING( L"ini"), Removed, to much usage*/31. {0, 0, NULL}32. };33.34.35. //36. // Function prototypes37. //38.39. NTSTATUS40. ScannerPortConnect (41. __in PFLT_PORT ClientPort,42. __in_opt PVOID ServerPortCookie,43. __in_bcount_opt(SizeOfContext) PVOID ConnectionContext,44. __in ULONG SizeOfContext,45. __deref_out_opt PVOID *ConnectionCookie46. );47.48. VOID49. ScannerPortDisconnect (50. __in_opt PVOID ConnectionCookie51. );52.53. NTSTATUS54. ScannerpScanFileInUserMode (55. __in PFLT_INSTANCE Instance,56. __in PFILE_OBJECT FileObject,57. __out PBOOLEAN SafeToOpen58. );59.60. BOOLEAN61. ScannerpCheckExtension (62. __in PUNICODE_STRING Extension63. );64.66. MyScannerpScanFileInUserMode (67. __in PFLT_INSTANCE Instance,68. __in PFILE_OBJECT FileObject,69. __in PFLT_CALLBACK_DATA Data,70. __in ULONG Operation,71. __out PBOOLEAN SafeToOpen72. );73.74. //75. // Assign text sections for each routine.76. //77.78. #ifdef ALLOC_PRAGMA79. #pragma alloc_text(INIT, DriverEntry)80. #pragma alloc_text(PAGE, ScannerInstanceSetup)81. #pragma alloc_text(PAGE, ScannerPreCreate)82. #pragma alloc_text(PAGE, ScannerPostCreate)83. #pragma alloc_text(PAGE, ScannerPortConnect)84. #pragma alloc_text(PAGE, ScannerPortDisconnect)85. #pragma alloc_text(PAGE, ScannerPostSetInforMation)86. #pragma alloc_text(PAGE, ScannerPreSetInforMation )87. //IsPatternMatch88. //PsGetProcessFullName89. #endif90.91.92. //93. // Constant FLT_REGISTRATION structure for our filter. This94. // initializes the callback routines our filter wants to register95. // for. This is only used to register with the filter manager96. //97.98. const FLT_OPERATION_REGISTRATION Callbacks[] = {99.100. { IRP_MJ_CREATE,101. 0,102. ScannerPreCreate,103. ScannerPostCreate},104.105. { IRP_MJ_CLEANUP,106. 0,107. ScannerPreCleanup,108. NULL},109.110. { IRP_MJ_WRITE,111. 0,112. ScannerPreWrite,113. NULL},114.115. { IRP_MJ_SET_INFORMATION,116. 0,117. ScannerPreSetInforMation,118. ScannerPostSetInforMation},119.120. { IRP_MJ_OPERATION_END }121. };122.123.124. const FLT_CONTEXT_REGISTRATION ContextRegistration[] = {125.126. { FLT_STREAMHANDLE_CONTEXT,127. 0,128. NULL,129. sizeof(SCANNER_STREAM_HANDLE_CONTEXT),130. 'chBS' },131.132. { FLT_CONTEXT_END }133. };134.135. const FLT_REGISTRATION FilterRegistration = {136.137. sizeof( FLT_REGISTRATION ), // Size138. FLT_REGISTRATION_VERSION, // Version139. 0, // Flags140. ContextRegistration, // Context Registration.141. Callbacks, // Operation callbacks142. ScannerUnload, // FilterUnload143. ScannerInstanceSetup, // InstanceSetup144. ScannerQueryTeardown, // InstanceQueryTeardown145. NULL, // InstanceTeardownStart146. NULL, // InstanceTeardownComplete147. NULL, // GenerateFileName148. NULL, // GenerateDestinationFileName149. NULL // NormalizeNameComponent150. };151.152.153.154. BOOLEAN IsPatternMatch(PUNICODE_STRING Expression, PUNICODE_STRING Name, BOOLEAN IgnoreCase) 155. {156. return FsRtlIsNameInExpression(157. Expression,159. IgnoreCase,//如果这⾥设置为TRUE,那么Expression必须是⼤写的160. NULL161. );162.163. }164.165. PUNICODE_STRING PsGetProcessFullName(PEPROCESS pTargetProcess)166. {167. PFILE_OBJECT pFileObject=NULL;168. POBJECT_NAME_INFORMATION pObjectNameInfo=NULL;169. if(!NT_SUCCESS(PsReferenceProcessFilePointer(pTargetProcess,&pFileObject)))170. return NULL;171. if(!NT_SUCCESS(IoQueryFileDosDeviceName(pFileObject,&pObjectNameInfo)))172. return NULL;173. ObDereferenceObject(pFileObject);174. return &(pObjectNameInfo->Name);//尚未释放内存以及 ObDereferenceObject175. }176.177. ULONG g_Count = 0;178. NTSTATUS179. DriverEntry (180. __in PDRIVER_OBJECT DriverObject,181. __in PUNICODE_STRING RegistryPath182. )183. {184. OBJECT_ATTRIBUTES oa;185. UNICODE_STRING uniString;186. PSECURITY_DESCRIPTOR sd;187. NTSTATUS status;188.189. UNREFERENCED_PARAMETER( RegistryPath );190.191. g_LastDelFileName.Buffer = ExAllocatePool(NonPagedPool,MAX_PATH*2);192. g_LastDelFileName.Length = g_LastDelFileName.MaximumLength = MAX_PATH*2;193. memset(g_LastDelFileName.Buffer,'\0',MAX_PATH*2);194.195. //注册回调196. status = FltRegisterFilter( DriverObject,197. &FilterRegistration,198. &ScannerData.Filter );199.200.201. if (!NT_SUCCESS( status )) {202.203. return status;204. }205.206. //创建端⼝207. RtlInitUnicodeString( &uniString, ScannerPortName );208.209. //设置通信端⼝权限 ,只有管理员和系统进程才能操作210. status = FltBuildDefaultSecurityDescriptor( &sd, FLT_PORT_ALL_ACCESS );211.212. if (NT_SUCCESS( status )) {213.214. InitializeObjectAttributes( &oa,215. &uniString,216. OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,217. NULL,218. sd );219.220. //创建通信端⼝,并设置对应的回调函数221. status = FltCreateCommunicationPort( ScannerData.Filter,222. &ScannerData.ServerPort,223. &oa,//设置的名字224. NULL,225. ScannerPortConnect,//当R3连接时回调主要是记录R3的进程ID或EPROCESS以便放过本进程还有记录R3的通信端⼝,给后⾯主动通信的时候⽤226. ScannerPortDisconnect,//当R3离线时回调主要是关闭R3端⼝和设置R3的进程信息为NULL227. NULL,//处理R3主动函数⽐如R3下新的规则,228. 1 );//最后⼀个常为1229. //设置好后需要释放权限的设置230. FltFreeSecurityDescriptor( sd );231.232. if (NT_SUCCESS( status )) {233.234. //235. // Start filtering I/O.236. //237. //开始过滤238. status = FltStartFiltering( ScannerData.Filter );239.240. if (NT_SUCCESS( status )) {241.242. return STATUS_SUCCESS;243. }244. //失败就滚吧245. FltCloseCommunicationPort( ScannerData.ServerPort );246. }247. }248. //失败就滚吧249. FltUnregisterFilter( ScannerData.Filter );251. return status;252. }253.254.255. NTSTATUS256. ScannerPortConnect (257. __in PFLT_PORT ClientPort,258. __in_opt PVOID ServerPortCookie,259. __in_bcount_opt(SizeOfContext) PVOID ConnectionContext,260. __in ULONG SizeOfContext,261. __deref_out_opt PVOID *ConnectionCookie262. )263. {264. PAGED_CODE();265.266. UNREFERENCED_PARAMETER( ServerPortCookie );267. UNREFERENCED_PARAMETER( ConnectionContext );268. UNREFERENCED_PARAMETER( SizeOfContext);269. UNREFERENCED_PARAMETER( ConnectionCookie );270.271. ASSERT( ScannerData.ClientPort == NULL );272. ASSERT( erProcess == NULL );273.274. //设置本⾝进程和 R3的的通信端⼝给后⾯判断和通信时使⽤275. erProcess = PsGetCurrentProcess();276. ScannerData.ClientPort = ClientPort;277.278. DbgPrint( " scanner.sys --- connected, port=0x%p\n", ClientPort );279.280. return STATUS_SUCCESS;281. }282.283.284. VOID285. ScannerPortDisconnect(286. __in_opt PVOID ConnectionCookie287. )288. {289. UNREFERENCED_PARAMETER( ConnectionCookie );290.291. PAGED_CODE();292.293. DbgPrint( " scanner.sys --- disconnected, port=0x%p\n", ScannerData.ClientPort ); 294.295. //关闭R3通信端⼝296. FltCloseClientPort( ScannerData.Filter, &ScannerData.ClientPort );297.298. //设置R3进程为0299. erProcess = NULL;300. }301.302.303. NTSTATUS304. ScannerUnload (305. __in FLT_FILTER_UNLOAD_FLAGS Flags306. )307. {308. UNREFERENCED_PARAMETER( Flags );309.310. //311. // Close the server port.312. //313. if(g_LastDelFileName.Buffer)314. ExFreePool(g_LastDelFileName.Buffer);315.316. FltCloseCommunicationPort( ScannerData.ServerPort );317.318.319. //320. // Unregister the filter321. //322.323. FltUnregisterFilter( ScannerData.Filter );324.325. return STATUS_SUCCESS;326. }327.328. NTSTATUS329. ScannerInstanceSetup (330. __in PCFLT_RELATED_OBJECTS FltObjects,331. __in FLT_INSTANCE_SETUP_FLAGS Flags,332. __in DEVICE_TYPE VolumeDeviceType,333. __in FLT_FILESYSTEM_TYPE VolumeFilesystemType334. )335. {336. UNREFERENCED_PARAMETER( FltObjects );337. UNREFERENCED_PARAMETER( Flags );338. UNREFERENCED_PARAMETER( VolumeFilesystemType );339.340. PAGED_CODE();341.342. ASSERT( FltObjects->Filter == ScannerData.Filter );345. // Don't attach to network volumes.346. //347.348. if (VolumeDeviceType == FILE_DEVICE_NETWORK_FILE_SYSTEM) { 349.350. return STATUS_FLT_DO_NOT_ATTACH;351. }352.353. return STATUS_SUCCESS;354. }355.356. NTSTATUS357. ScannerQueryTeardown (358. __in PCFLT_RELATED_OBJECTS FltObjects,359. __in FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags360. )361. {362. UNREFERENCED_PARAMETER( FltObjects );363. UNREFERENCED_PARAMETER( Flags );364.365. return STATUS_SUCCESS;366. }367.368.369. FLT_PREOP_CALLBACK_STATUS370. ScannerPreCreate (371. __inout PFLT_CALLBACK_DATA Data,372. __in PCFLT_RELATED_OBJECTS FltObjects,373. __deref_out_opt PVOID *CompletionContext374. )375. {376. UNREFERENCED_PARAMETER( FltObjects );377. UNREFERENCED_PARAMETER( CompletionContext );378.379. PAGED_CODE();380.381. //382. // See if this create is being done by our user process.383. //384. //DbgPrint("Pre Creta!\n");385.386. if (IoThreadToProcess( Data->Thread ) == erProcess) { 387.388. DbgPrint( " scanner.sys -- allowing create for trusted process \n" ); 389.390. return FLT_PREOP_SUCCESS_NO_CALLBACK;391. }392.393. return FLT_PREOP_SUCCESS_WITH_CALLBACK;394. }395.396. BOOLEAN397. ScannerpCheckExtension (398. __in PUNICODE_STRING Extension399. )400. {401. const UNICODE_STRING *ext;402.403. if (Extension->Length == 0) {404.405. return FALSE;406. }407.408. //409. // Check if it matches any one of our static extension list410. //411.412. ext = ScannerExtensionsToScan;413.414. while (ext->Buffer != NULL) {415.416. if (RtlCompareUnicodeString( Extension, ext, TRUE ) == 0) {417.418. //419. // A match. We are interested in this file420. //421.422. return TRUE;423. }424. ext++;425. }426.427. return FALSE;428. }429.430. //处理打开,创建时(⼀般这个时候提⽰的话就是已经被感染了)431. FLT_POSTOP_CALLBACK_STATUS432. ScannerPostCreate (433. __inout PFLT_CALLBACK_DATA Data,434. __in PCFLT_RELATED_OBJECTS FltObjects,435. __in_opt PVOID CompletionContext,438. {439. FLT_POSTOP_CALLBACK_STATUS returnStatus = FLT_POSTOP_FINISHED_PROCESSING;440. PFLT_FILE_NAME_INFORMATION nameInfo;441. NTSTATUS status;442. BOOLEAN safeToOpen, scanFile;443. UNICODE_STRING ustrRule = {0};444. ULONG Options;445. ULONG ulDisposition;446. BOOLEAN PopWindow = FALSE;447. FILE_DISPOSITION_INFORMATION fdi;448.449. UNREFERENCED_PARAMETER( CompletionContext );450. UNREFERENCED_PARAMETER( Flags );451. //UNREFERENCED_PARAMETER( Flags );452.453. //454. // If this create was failing anyway, don't bother scanning now.455. //456.457. //DbgPrint("Pos Creta!\n");458.459. if (!NT_SUCCESS( Data->IoStatus.Status ) ||460. (STATUS_REPARSE == Data->IoStatus.Status)) {461.462. return FLT_POSTOP_FINISHED_PROCESSING;463. }464.465. Options = Data->Iopb->Parameters.Create.Options;466.467. if (FlagOn(Options, FILE_DIRECTORY_FILE) ||468. FlagOn(FltObjects->FileObject->Flags, FO_VOLUME_OPEN) ||469. FlagOn(Data->Flags, SL_OPEN_PAGING_FILE))470. {471. return FLT_POSTOP_FINISHED_PROCESSING;472. }473.474. ulDisposition = (Data->Iopb->Parameters.Create.Options >> 24) & 0xFF;475. if (ulDisposition == FILE_CREATE || ulDisposition == FILE_OVERWRITE || ulDisposition == FILE_OVERWRITE_IF) 476. {477. PopWindow = TRUE;478. }479.480. status = FltGetFileNameInformation( Data,481. FLT_FILE_NAME_NORMALIZED |482. FLT_FILE_NAME_QUERY_DEFAULT,483. &nameInfo );484.485. if (!NT_SUCCESS( status )) {486.487. return FLT_POSTOP_FINISHED_PROCESSING;488. }489.490. FltParseFileNameInformation( nameInfo );491.492. //493. // Check if the extension matches the list of extensions we are interested in494. //495.496. RtlInitUnicodeString(&ustrRule, L"\\*\\*\\WINDOWS\\SYSTEM32\\*\\*.SYS");497.498. scanFile = IsPatternMatch(&ustrRule,&nameInfo->Name,TRUE);499. //DbgPrint("%wZ\n",&nameInfo->Name);500. //scanFile = ScannerpCheckExtension( &nameInfo->Extension );501.502. //503. // Release file name info, we're done with it504. //505.506. FltReleaseFileNameInformation( nameInfo );507.508. if (!scanFile) {509.510. //511. // Not an extension we are interested in512. //513.514. return FLT_POSTOP_FINISHED_PROCESSING;515. }516.517. if(PopWindow)518. {519. MyScannerpScanFileInUserMode( FltObjects->Instance,520. FltObjects->FileObject,521. Data,522. 1,523. &safeToOpen );524.525. if (!safeToOpen) {526.527. //528. // Ask the filter manager to undo the create.531. DbgPrint( " scanner.sys -- foul language detected in postcreate \n" );532.533. DbgPrint( " scanner.sys -- undoing create \n" );534.535. //就算拒绝了也会创建⼀个空⽂件这⾥我们删除536. fdi.DeleteFile = TRUE;537. FltSetInformationFile(FltObjects->Instance, FltObjects->FileObject, &fdi, sizeof(FILE_DISPOSITION_INFORMATION), FileDispositionInformation); 538.539. FltCancelFileOpen( FltObjects->Instance, FltObjects->FileObject );540.541. Data->IoStatus.Status = STATUS_ACCESS_DENIED;542. Data->rmation = 0;543.544. returnStatus = FLT_POSTOP_FINISHED_PROCESSING;545.546. }547. }548.549. return returnStatus;550. }551.552. //处理打开时有写权限但打开成功时是安全的,等它关闭的时候的我们来扫描它553. //触发这个回调的条件是⽂件引⽤技术为0,这个包括内核+R3的计数,⼀般是在上层使⽤了ZwClose或者CloseHandle时调⽤554. FLT_PREOP_CALLBACK_STATUS555. ScannerPreCleanup (556. __inout PFLT_CALLBACK_DATA Data,557. __in PCFLT_RELATED_OBJECTS FltObjects,558. __deref_out_opt PVOID *CompletionContext559. )560. {561.562. UNREFERENCED_PARAMETER( Data );563. UNREFERENCED_PARAMETER( FltObjects );564. UNREFERENCED_PARAMETER( CompletionContext );565.566.567. return FLT_PREOP_SUCCESS_NO_CALLBACK;568. }569.570.571.572.573. //处理写关闭574. FLT_PREOP_CALLBACK_STATUS575. ScannerPreWrite (576. __inout PFLT_CALLBACK_DATA Data,577. __in PCFLT_RELATED_OBJECTS FltObjects,578. __deref_out_opt PVOID *CompletionContext579. )580. {581. FLT_PREOP_CALLBACK_STATUS returnStatus = FLT_PREOP_SUCCESS_NO_CALLBACK;582. UNREFERENCED_PARAMETER( CompletionContext );583. UNREFERENCED_PARAMETER( FltObjects );584. UNREFERENCED_PARAMETER( Data );585.586. //587. // If not client port just ignore this write.588. //589. //如果R3进程退出了590. if (ScannerData.ClientPort == NULL) {591.592. return FLT_PREOP_SUCCESS_NO_CALLBACK;593. }594. return returnStatus;595. }596.597. BOOLEAN isNeedWatchFile(PFLT_CALLBACK_DATA Data)598. {599. BOOLEAN Ret = FALSE;600. UNICODE_STRING ustrRule = {0};601. PFLT_FILE_NAME_INFORMATION nameInfo = {0};602. NTSTATUS status = STATUS_SUCCESS;603.604. status = FltGetFileNameInformation( Data,605. FLT_FILE_NAME_NORMALIZED |606. FLT_FILE_NAME_QUERY_DEFAULT,607. &nameInfo );608.609. if (!NT_SUCCESS( status )) {610.611. return FALSE;612. }613.614. FltParseFileNameInformation( nameInfo );615.616. RtlInitUnicodeString(&ustrRule, L"\\*\\*\\WINDOWS\\SYSTEM32\\*\\*.SYS");617.618. Ret = IsPatternMatch(&ustrRule,&nameInfo->Name,TRUE);619.620. FltReleaseFileNameInformation( nameInfo );621.624.625. VOID UnicodeToChar(PUNICODE_STRING src, char *dst)626. {627. ANSI_STRING string;628. RtlUnicodeStringToAnsiString(&string,src,TRUE);629. strcpy(dst,string.Buffer);630. RtlFreeAnsiString(&string);631. }632.633. BOOLEAN isRecycle(PFLT_CALLBACK_DATA Data ,PCFLT_RELATED_OBJECTS FltObje)634. {635. BOOLEAN Ret = FALSE;636. PFLT_FILE_NAME_INFORMATION nameInfo = {0};637. PFILE_RENAME_INFORMATION pRenameInfo = {0};638. NTSTATUS status = STATUS_SUCCESS;639. char *temp = (char*)ExAllocatePool(NonPagedPool,MAX_PATH*2);640.641. if(temp == NULL)642. return TRUE;643.644.645. memset(temp,'\0',MAX_PATH*2);646.647. //特殊情况,当字符串中包含$Recycle.Bin时是普通删除,实际上删除只是更名⽽已648. pRenameInfo = (PFILE_RENAME_INFORMATION)Data->Iopb->Buffer;649.650. status = FltGetDestinationFileNameInformation(FltObje->Instance,Data->Iopb->TargetFileObject,pRenameInfo->RootDirectory,pRenameInfo->FileName,pRenameInfo->FileNameLength,FLT_FILE_NAME_NORMALIZED,&nameInfo);651. if(!NT_SUCCESS(status))652. {653. DbgPrint("FltGetDestinationFileNameInformation is faild! 0x%x",status);654. return TRUE;655. }656.657. UnicodeToChar(&nameInfo->Name,temp);658. if(strstr(temp,"Recycle.Bin"))659. Ret = TRUE;660. else661. Ret = FALSE;662.663. FltReleaseFileNameInformation(nameInfo);664.665. ExFreePool(temp);666.667. return Ret;668. }669.670. FLT_PREOP_CALLBACK_STATUS671. ScannerPreSetInforMation(672. __inout PFLT_CALLBACK_DATA Data,673. __in PCFLT_RELATED_OBJECTS FltObjects,674. __deref_out_opt PVOID *CompletionContext675. )676. {677. FLT_PREOP_CALLBACK_STATUS status = FLT_PREOP_SUCCESS_NO_CALLBACK;678. ULONG Options = 0;//记录操作类型 1创建,2重命名,3删除679. BOOLEAN isAllow = TRUE;//是否放⾏680. UNREFERENCED_PARAMETER(Data);681. UNREFERENCED_PARAMETER(FltObjects);682. UNREFERENCED_PARAMETER(CompletionContext);683. //UNREFERENCED_PARAMETER(FltObjects);684.685. if(ScannerData.ClientPort == NULL)686. {687. return FLT_PREOP_SUCCESS_NO_CALLBACK;688. }689.690. if(erProcess == PsGetCurrentProcess())691. {692. return FLT_PREOP_SUCCESS_NO_CALLBACK;693. }694.695.696. /*697. lpIrpStack->Parameters.SetFile.FileInformationClass == FileRenameInformation ||//重命名698. lpIrpStack->Parameters.SetFile.FileInformationClass == FileBasicInformation || //设置基础信息699. lpIrpStack->Parameters.SetFile.FileInformationClass == FileAllocationInformation ||700. lpIrpStack->Parameters.SetFile.FileInformationClass == FileEndOfFileInformation ||//设置⼤⼩701. lpIrpStack->Parameters.SetFile.FileInformationClass == FileDispositionInformation)//删除702.703. */704.705. if(Data->Iopb->Parameters.SetFileInformation.FileInformationClass == FileRenameInformation ||706. Data->Iopb->Parameters.SetFileInformation.FileInformationClass == FileDispositionInformation )707. {708. switch (Data->Iopb->Parameters.SetFileInformation.FileInformationClass)709. {710. case FileRenameInformation:711. Options = 2;712. break;713. case FileDispositionInformation:715. break;716. default:717. Options = 0;//爆炸啦718. break;719. }720.721. //判断是不是我们要监控的722. if(!isNeedWatchFile(Data))723. {724. return FLT_PREOP_SUCCESS_NO_CALLBACK;725. }726.727. if(Options == 2)728. {729. if(isRecycle(Data,FltObjects))730. {731. return FLT_PREOP_SUCCESS_NO_CALLBACK;732. }733. }734.735.736. //进程路径,操作类型,原路径,重命名后路径737. MyScannerpScanFileInUserMode(FltObjects->Instance,FltObjects->FileObject,Data,Options,&isAllow); 738.739. if(!isAllow)740. {741. DbgPrint("ReName in PreSetInforMation !\n");742. Data->IoStatus.Status = STATUS_ACCESS_DENIED;743. Data->rmation = 0;744. status = FLT_PREOP_COMPLETE;745. }else746. {747. status = FLT_PREOP_SUCCESS_NO_CALLBACK;748. }749.750. }751.752. return status;753. }754.755.756. FLT_POSTOP_CALLBACK_STATUS757. ScannerPostSetInforMation (758. __inout PFLT_CALLBACK_DATA Data,759. __in PCFLT_RELATED_OBJECTS FltObjects,760. __in_opt PVOID CompletionContext,761. __in FLT_POST_OPERATION_FLAGS Flags762. )763. {764. //FLT_POSTOP_CALLBACK_STATUS status = FLT_POSTOP_FINISHED_PROCESSING;765. //ULONG Options = 0;//记录操作类型 1创建,2重命名,3删除766. //BOOLEAN isAllow = TRUE;//是否放⾏767. UNREFERENCED_PARAMETER(Flags);768. UNREFERENCED_PARAMETER(Data);769. UNREFERENCED_PARAMETER(FltObjects);770. UNREFERENCED_PARAMETER(CompletionContext);771.772. /*773. lpIrpStack->Parameters.SetFile.FileInformationClass == FileRenameInformation ||//重命名774. lpIrpStack->Parameters.SetFile.FileInformationClass == FileBasicInformation || //设置基础信息775. lpIrpStack->Parameters.SetFile.FileInformationClass == FileAllocationInformation ||776. lpIrpStack->Parameters.SetFile.FileInformationClass == FileEndOfFileInformation ||//设置⼤⼩777. lpIrpStack->Parameters.SetFile.FileInformationClass == FileDispositionInformation)//删除778.779. */780. //if(Data->Iopb->Parameters.SetFileInformation.FileInformationClass == FileRenameInformation || 781. // Data->Iopb->Parameters.SetFileInformation.FileInformationClass == FileDispositionInformation ) 782. //{783. // switch (Data->Iopb->Parameters.SetFileInformation.FileInformationClass)784. // {785. // case FileRenameInformation:786. // Options = 2;787. // break;788. // case FileDispositionInformation:789. // Options = 3;790. // break;791. // default:792. // Options = 0;//爆炸啦793. // break;794. // }795.796. // //判断是不是我们要监控的797. // if(!isNeedWatchFile(Data))798. // {799. // return FLT_POSTOP_FINISHED_PROCESSING;800. // }801.802. // if(Options == 2)803. // {804. // if(isRecycle(Data,FltObjects))805. // {806. // return FLT_POSTOP_FINISHED_PROCESSING;807. // }。
netfilter2.sys 实现原理
文章标题:深度探析netfilter2.sys实现原理一、netfilter2.sys概述netfilter2.sys作为网络过滤器的重要组成部分,其实现原理是网络安全与网络性能保障的关键。
它通过对网络数据包进行实时监控和处理,以实现对网络流量的灵活控制和管理。
在本文中,将从netfilter2.sys的实现原理、功能特点和应用场景等方面展开详细介绍,并结合个人观点进行深入探讨。
二、netfilter2.sys实现原理的核心技术netfilter2.sys的实现原理涉及到多种核心技术,包括数据包过滤、NAT(网络位置区域转换)、连接跟踪、防火墙等。
在netfilter2.sys 中,数据包过滤是其最基本的功能之一,它通过对网络数据包的源位置区域、目的位置区域、端口号等信息进行匹配和过滤,从而实现对网络流量的精细化控制。
NAT技术可以对网络数据包的位置区域信息进行动态转换,为多台主机共享一个公网IP位置区域提供了可能。
而连接跟踪技术则可以追踪网络连接的状态,实现对网络连接的状态管理和维护。
三、netfilter2.sys的功能特点netfilter2.sys具有以下几个显著的功能特点:1. 灵活的配置和管理:netfilter2.sys可以通过配置规则表来实现对网络流量的灵活管理,管理员可以根据实际需求对网络流量进行合理的过滤和控制。
2. 高效的数据包处理:netfilter2.sys通过进行内核空间和用户空间的数据包处理,可以实现对网络数据包的高效处理和转发。
3. 多种扩展功能:netfilter2.sys支持多种扩展模块,如iptables和ip6tables等,这些扩展模块可以为网络过滤器提供更多的功能和灵活性。
四、netfilter2.sys的应用场景netfilter2.sys在网络安全、网络管理和网络性能优化等方面有着广泛的应用场景。
在网络安全领域,netfilter2.sys可以被用于实现防火墙、入侵检测和应急响应等功能;在网络管理领域,netfilter2.sys可以被用于实现流量控制、负载均衡和内容过滤等功能;在网络性能优化领域,netfilter2.sys可以被用于实现数据包的加速和优化,提升网络通信的效率和性能。
文件系统过滤驱动教程
创建一个简易的文件系统过滤驱动
开始之前
要想编译一个驱动,你需要 WDK 或者 IFS 开发包。 你可以从微软的网站获取它们。另外,你 不得不设置一个环境变量%WINDDK%来指向你安装 WDK/IFS 开发包的路径。 注意:每一个小的错误可能导致蓝屏死机或者系统不稳定。
Main.c
Driver entry
这是如何驱动的入口点。我们要做的第一件事是存储到 DriverObject 一个全局变量中(我 们一会儿就要使用它)。
Collapse code snippet Copy Code
//////////////////////////////////////////////////////// // Global data
{ ...
for (;;) { IoEnumerateDeviceObjectList( DriverObject, devList, sizeof(devList), &numDevices);
if (0 == numDevices) { break; }
numDevices = min(numDevices, RTL_NUMBER_OF(devList));
Collapse Copy Code
////////////////////////////////////////////////////////////////////////// // Global data
FAST_IO_DISPATCH g_fastIoDispatch = { sizeof(FAST_IO_DISPATCH), FsFilterFastIoCheckIfPossible, ... }; ////////////////////////////////////////////////////////////////////////// // DriverEntry - Entry point of the driver
WindowsNT内核下文件系统过滤驱动程序开发
WindowsNT的I/O 管理器是一个可扩展的 结构,通过开发过滤驱动程序可以扩展I/O 子系 统的功能.I/O 管理器支持分层驱动程序模型,每
个I/O 请求包(IRP)的处理分别经过各层驱动程 序,直到某层驱动程序完成这个请求.这样第三方 开发的驱动程序就有机会插入到这个层次结构中
第31卷 第1期 2003年 1月
华 中 科 技 大 学 学 报(自然科学版) J.HuazhongUniv.ofSci.& Tech(.NatureScienceEdition)
Vol.31 No.1 Jan. 2003
WindowsNT 内核下文件系统过滤 驱动程序开发
李 凡 刘学照 卢 安
谢四江
insideWindowsNTkernel
Lifan LiuXuezhao LuAn XieSijiang Abstract:Theanalysisoftheprinciple,processandapplicationofthedevelopmentofFileSystem Filter Driver(FSFD)insideWindowsNT∖2000∖XPoperatingsystembasedon WindowsNTkernelweremade toachievedynamicvirusscan,transparentfileencryption/decryption,fileprotection,systemrecoveryand ensuretheinformationsecurityoffilesystem.Aninstanceofrealizingtransparentencryption/decryptionof
( ) ( ) 华中科技大学 计算机科学与技术学院
文件过滤驱动加载过程
文件过滤驱动学习笔记(二)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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信息安全与通信保密·2007.9 115
学术研究
Academi c Research
操作并将响应信息发给代理行。 (7) 代理行主机接收到信息后将是否允许交易的指令发
给 A T M 机。 (8) ATM 接收到指令信息,作出相应响应。 (9) 交易结束,用户取款后拔卡离去。
4 结语
此,商业银行在建立 HHS安全信息体系中需充分考虑各种可 能导致安全泄密的细节。
参考文献 [1] 约翰森. 信息技术风险管理的目标[N]. 英国:金融时报, 2006,11,29. [2] Glaessner T,Kellermann T. Valerie McNevin Electronic
Security:Risk Mitigation In Financial Transactions[R] The World Bank working paper,2002,(6):43~49. [3] Glaessner T,Kellermann T. Valerie McNevin Electronic Safety and Soundness:A Four Pillar Approach[R]. The World Bank working The World Bank working paper,2003,(10):12~15. [4] 中国银行业监督管理委员会. 银行业金融机构信息系统 风险管理指[EB]. http://www.cbrc.gov.cn,2006 11. [5] The World Bank Global Dialogue Electronic Safety and Soundness[R]. The World Bank working paper, 2003,(10):5~13. [6] 孙玉冰,林作铨. 层次安全体系及其在银行 ATM 网络 中的应用[J]. 计算机应用研究,1999,(6):34~40.
但是,HSS解决商业银行信息系统安全问题要付出较高的 成本,并且由于交易的随时性,对HSS的执行效率也提出了较 高要求。另外,在 LSS 中,LLS-CA 一般需由 LSS 中处于上级 的机构担任或由信任度较高的第三方担任。这一点尤显关键, 因为一旦 LLS-CA 出现问题,银行可能会蒙受巨大损失。因
solving the security problem of files. This paper focuses on the operating principle and exploitation process of file system
filter driver which is based on Windows NT core, and discusses the applications of file system filter driver in such fields
1 Windows NT文件系统过滤驱动工作原理
1.1 Windows NT文件系统驱动 Windows NT 文件系统驱动是存储管理子系统的一个重
收稿日期:2 0 0 7 - 0 3 - 1 2 作者简介:张静,1982 年生,女,硕士研究生,主要研究方 向:信息安全。
要组成部分,它向用户提供在磁盘或光盘等非易失性媒介信息 的存储、转发,同时和存管理器、高速缓冲管理器紧密结合, 不但保证了应用程序可以准确地提取数据文件的内容,而且提 高了访问效率[1]。用户进程对磁盘上文件的创建、打开、读、写 等操作由WIN 32子系统调用相应的服务来代表该进程发出请 求操作。I/O管理器接收到上层传来的I/O请求,通过构造输 入输出请求包IRP(I/O Request Package)来描述这个请求[2], 然后向下传递给文件系统驱动、存储设备驱动做后续处理,低 层驱动处理完毕后把结果依次向上返回,最后经过I/O管理 器,由WIN 32子系统把结果返回给发出请求的应用进程,整 个对文件的操作请求执行完毕,如图1所示。
【关键词】Windows NT 文件系统;文件系统过滤驱动;IRP;安全 【中图分类号】TP391 【文献标识码】A 【文章编号】1009-8054(2007) 09-0114-02
Principle and Application of Windows NT File System Filter Driver
Windows NT 的 I/O 管理器是可扩展结构,支持分层 驱动模型,这样按照我们的需求开发具有某种功能的驱动程 序插入到这个层次结构当中,截获所需处理的IRP进行处理, 然后再继续向下传递或直接向上返回结果。
1.2 Windows NT文件系统过滤驱动 文件系统过滤驱动是针对文件系统而言,它既可以位于 文件系统驱动之上,也可以被插在文件系统驱动和存储设备 驱动之间。I/O管理器在发送文件操作请求到目标设备对象
0 引言
文件安全性问题已成为当今信息科学领域最重要的课题 之一。目前,解决这个问题的主要技术手段有两种:一是利用 应用层 HOOK(钩子)技术,对 Windows 提供的文件操作函数 (API)及由文件操作所触发的 Windows 消息进行 HOOK,经过 适当的处理达到预期目的,缺点是效率低、稳定性和一致性 差,不适合于大型系统的开发;另一种是开发文件过滤驱动程 序,文件过滤驱动作为一种内核态中间层驱动,不需要改变下 层驱动或用户程序而增加新的功能,具有效率高、可靠性强、 可扩充等特点,成为现阶段信息安全技术研究的热点。
在DriverEntry中首先调用系统函数IoCreateDevice生成 一个控制设备对象 CDO,作用是修改整个驱动的内部配置。 接着对所要监控的目标设备对象进行绑定,过程如下:调用 ZwCreateFile函数获得设备对象句柄ntFileHandle,再通过
3 Windows NT文件过滤驱动在信息安全领 域的应用
上边的绑定是对系统本地卷的绑定,称为静态绑定。当一 个 U 盘插入 USB 端口,一个名为“J”的卷动态产生时,要求 能够生成一个设备来绑定它,称这种绑定为动态绑定。一个新 的存储媒质被系统发现并在文件系统中生成一个Volume的过程 称为 Mounting。过程开始时,文件系统 CDO 收到一个 Major Function Code 为 IRP_MJ_FILE_SYSTEM_CONTROL,Mi- nor Function Code 为 IRP_MN_MOUNT 的 IRP。如果已绑定 了文件系统CDO,则可以得到这样的 IRP,在其中知道一个新 的 Volume 正在 Mounting,这时再按照上边的静态绑定方法来 绑定这个新生成的卷设备对象。微软为我们提供了一个有用的 系统调用IoRegisterFsRegistrationChange,用它来注册一个回 调函数,当系统中有任何文件系统被激活或撤消时,注册过的 回调函数就会被调用,在回调函数中绑定刚激活的文件系统的 控制设备对象,在的分发例程中绑定这个新卷设备对象。
图 2 文件系统过滤驱动工作原理
ObReferenceObjectByHandle函数生成该ntFileHandle描述 的文件设备对象指针FileObject(Windows NT把每个设备当 作一个文件来看待,并用一个 FILE_OBJECT 结构描述其属 性);调用IoGetRelatedDeviceObject得到该文件对象对应的设 备对象fileSysDevice,即我们最后要绑定到目标设备对象上的 附加设备对象;最后我们调用AttachTOTargegDeviceObject 把刚生成的附加设备对象fileSysDevice绑定到目标设备对象 上。成功绑定后,在过滤驱动中截获所关注的 IRP,设置分 发例程,对于不关注的 IRP 调用默认例程直接向下传递。以 上所有工作完成后,清除DeviceObject初始化标记,整个过 滤驱动构造完毕,可以加载使用。
学术研究
Academi c Research
Windows NT 文件系统 过滤驱动的原理及应用
张 静 (北京交通大学计算机与信息技术学院,北京 100044)
【摘 要】文件系统过滤驱动技术是解决文件安全性问题的一种稳定、高效、可靠的技术实现手段。文章重点介绍了 基于Windows NT分层驱动程序模型的文件系统过滤驱动的工作原理及开发过程,并分析了文件系统过滤驱动在文 件加解密、病毒防护、进程控制、文件访问事后审计信息安全方面的应用。
2 Windows NT文件系统过滤驱动开发过程
和其他应用程序一样,驱动函数也有一个主函数,称为 入口函数 DriverEntry,格式为:NTSTATUS DriverEntry ( I N P D R I V E R _ O B J E C T D r i v e r O b j e c t ,I N PUNICODE_STRING RegistryPath)。DriverObject 是驱动 对应的驱动对象,是系统在加载驱动时分配的。 RegistryPath是专用于记录驱动相关参数的注册表路径,也 是由系统所分配。DriverObject驱动对象拥有一组函数指针, 称为dispatch functions,在IRP发送给目标设备之前,编 写这组函数,在dispatch functions中按照功能需求处理这 些 IRP,可以让 IRP 失败掉,或使其成功返回,或对其进行 修改,甚至可以自己构造 IRP 向下层驱动程序发送。
本文在界定信息系统安全及信息系统风险基础之上,引 入 HSS 体系并以 ATM 机交易流程说明 HSS 体系在商业银行 信息系统安全管理中的具体运用。HSS体系作为一种综合数 据加密、信息鉴证、密钥管理、SET 安全地址及交易等技术 的新型层次安全体系,在商业银行信息系统中的广泛运用, 能极大地提高银行内部数据的安全性、信息系统的可靠性, 并具有很强的防抵赖性及预防假冒能力,可以充分满足商业 银行信息系统安全管理之需。
ZHANG Jing
(School of Computer and Information Technology, Beijing Jiaotong University, Beijing 100044, China) 【Abstract】Nowadays, file system filter driver is one kind of technology means, which is stable, high-effect, reliable for