,欢迎光临!
加入收藏设为首页请您留言
您当前位置:网站首页 >> 华中地区 >> 基于过滤器钩子驱动的数据包过滤研究与实现-上海联兵环保免费电话:400-600-5030

基于过滤器钩子驱动的数据包过滤研究与实现-上海联兵环保免费电话:400-600-5030

2011-09-13 15:09:57 来源:中国过滤器网 浏览:1

摘要:在对Windows 2000/XP操作系统下网络过滤器钩子驱动分析基础上,提出了一种在Windows 2000/XP操作系统下网络数据包拦截技术.该技术巧妙地将过滤器钩子挂接到系统默认的IP过滤器驱动上,实现数据包过滤,其主要依据是利用ipfiltdrv.sys所提供的功能来拦截网络数据包.
关键词:过滤器钩子;IP过滤器驱动;回调函数
中图分类号:TP393   文献标识码:A
计算机网络的快速发展给人们的生活带来了极大的便利,但同时也对网络安全问题提出了严峻的考验.如果不及时对网络内部终端采取有效的安全保护措施,势必对广大用户的利益造成严重的威胁,网络安全问题已经越来越成为大家关注的焦点.目前,在国内Windows是最为广泛使用的操作系统平台,而在PC机上使用个人防火墙,早已受到大家的青睐,在很大程度上成为广大用户的安全保护者. Windows下的个人防火墙都是采用对进出本机数据包的拦截技术实现的.总的来说可分为用户态(user-mode)和核心态(kernel-mode)数据拦截两类,它们在具体的实现方式上有很大的不同,其中用户态的过滤技术包括Winsocket SPI 2接口,替换系统自带的Winsock动态连接库等;很显然,在用户态下进行数据包拦截最致命的缺点就是只能在Winsock层次上工作,而对于网络协议栈中底层协议的数据包无法进行处理,对于一些木马和病毒来说很容易避开这个层次的防火墙;而核心态主要包括TDI过滤驱动程序,NDIS中间层驱动程序,过滤器钩子驱动程序等,我们主要介绍基于过滤器钩子驱动程序的包过滤实现.
1 过滤器钩子驱动工作原理
微软的Windows支持3种基本的内核模式网络驱动程序,依次为:微端口NIC驱动程序(MiniportNIC drivers)、中间层驱动程序(Intermediate drivers)和协议驱动程序(Protocol drivers).在Windows 2000/XP中,引入了一种新的驱动程序类型是过滤器钩子(filter hook)驱动程序,用来过滤数据包,该驱动程序主要是利用ipfiltdrv.sys所提供的功能来拦截网络数据包,它扩展了操作系统提供的网际协议(IP)过滤器驱动程序的功能,一个过滤器钩子驱动程序能够被安装在Windows 2000/XP操作系统上[1].
一般情况下,在Windows 2000/XP中数据包过滤主要是通过NDIS过滤驱动程序实现,其技巧比较高,而且烦琐,需要考虑很多细节.但对于很多应用而言,只需要能更方便地对IP包进行过滤处理. NDIS提供了一种通过建立过滤器钩子驱动过滤IP包的方法.具体步骤是:在过滤器钩子驱动中建立一个普通的设备,通过IOCTL-PF-SET-EXTENSION-POINTER操作将自己的内核模式过滤钩子挂接到系统默认的IP过滤器驱动上,这样就可以在自己的过滤钩子里面实现完整的基于数据包的各种分析和过滤处理了[2].此方法只能对IP包进行过滤,其他的协议不会经过这个过滤钩子进行处理.
在Windows 2000/XP中,System32 \ drivers目录下的ipfltdrv.sys是Microsoft提供的IP协议过滤驱动程序,它允许用户注册自己的IP数据包处理函数,操作系统提供的IP过滤驱动程序使用过滤钩子来判断IP数据包的处理方式,所注册的过滤钩子是用PacketFilterExtensionPtr数据类型定义的,由于是使用函数地址而不是函数名字注册过滤钩子的入口点,所以可以自由的为过滤钩子函数命名.
附图说明了过滤器钩子驱动程序iphook.sys的流程结构,这就给我们提供了拦截网络数据包的基本思路.内核中的过滤器钩子驱动将操作系统的网络传输中所有出入包,都流入到我们的虚拟设备中,按照一定的规则进行处理.安装在操作系统中的供IP过滤器驱动使用的只能是单独一个过滤器驱动程序.如果IP过滤器驱动的扩展钩子指针被设为空(NULL),则过滤器驱动程序就只能通过IP过滤器驱动来注册.一旦过滤器驱动程序通过IP过滤器驱动注册成功后,IP过滤器驱动就给其扩展钩子指派一个过滤器驱动程序的文件对象. IP过滤器驱动这样做的目的是为了确保自己能单独使用一个过滤器驱动程序.

2 过滤器钩子驱动技术实现
2.1 创建过滤器钩子驱动
首先过滤器钩子驱动程序设置过滤器钩子回调函数,它是这类驱动程序的主体,通过系统提供的IP过滤器驱动注册这些过滤器钩子回调函数,随后,IP过滤器驱动就可以使用过滤器钩子决定如何处理传入或传出的数据包.所注册的过滤钩子是用PacketFilterExtensionPtr数据类型定义的.该类型就是过滤钩子的回调函数,决定所有传来数据包的命运,是继续传递,还是丢掉,或者允许IP过滤驱动程序继续处理.
在过滤器钩子驱动通过系统提供的IP过滤器驱动注册其过滤钩子(filter hook)的入口点时,它给出了过滤器钩子的符号(可变)地址.由于过滤器驱动程序不是提供过滤器钩子入口点的名称,开发人员可以自由选择过滤器钩子名称.不过,一般情况下要根据过滤器钩子函数的基本功能来命名[3].
过滤器钩子对传入和传出的数据包做一些特殊处理动作.首先是把数据包的特定信息和IP过滤器驱动提供给过滤器钩子的信息加以比较,以此决定数据包下一步如何被处理.其次,在过滤器钩子检测完数据包后,它回复响应代码PF-FORWARD,PF-DROP或PF-PASS给IP过滤器驱动,通知IP过滤器驱动如何处理数据包.这3种回复响应代码所代表的含义描述如下:
·PF-FORWARD 表示IP过滤器驱动程序立即把数据包转发到IP协议栈中,如果该数据包是本机需要的数据包,IP协议将其转发给上层协议处理,否则,路由功能被打开,IP将路由该数据包.
·PF-DROP 表示IP过滤驱动程序将立刻向IP协议栈发出丢弃响应,IP协议将丢弃该数据包.
·PF-PASS 表示IP过滤驱动程序处理该数据包,并将结果动作回复给IP协议栈. IP过滤器驱动
如何过滤数据包由它本身和包过滤API接口的设置方式来决定;如果过滤器钩子认为自己不需要处理该数据包,而是让IP过滤器驱动过滤包,则应该返回该PF-PASS.
2.2 初始化和卸载过滤器钩子驱动
像所有的内核模式驱动程序一样,过滤器钩子驱动程序为驱动对象创建和初始化一个设备对象,除此以外,过滤器钩子驱动程序的DriverEntry例程通过IP过滤器驱动注册驱动的过滤器钩子.
如果用户模式应用程序或高层驱动程序通过向下层过滤钩子驱动程序发送一个I/O控制请求设置过滤钩,则DriverEntry函数必须设置和输出一个控制设备的入口点,这个入口点是指驱动程序的函数代码为IRP-MJ-DEVICE-CONTROL的Dispatch例程,如果DriverEntry以这种方式控制设备对象,则通过控制设备对象例程注册驱动过滤器钩子而不是通过DriverEntry来实现.D
riverEntry函数设置和输出卸载过滤器钩子驱动程序入口点.当操作系统卸载过滤器钩子驱动程序时,卸载例程移走在DriverEntry函数中已经创建的设备对象而不是清除先前已注册的过滤器钩子.
2.3 设置和清除过滤器钩子
在DriverEntry函数中定义了驱动初始化和卸载的部分.过滤器钩子驱动程序设置了过滤器钩子回调函数,并通知IP过滤器驱动为每个传入或者传出的IP数据包调用这个钩子回调函数.过滤器钩子有可能清除先前注册的钩子回调.为了记录或清除钩子回调函数,过滤器钩子驱动必须首先用设备对象的指针为IP过滤器驱动和IOCTL-PF-SET-EXTENSION-POINTER创建一个IRP,然后,过滤器钩子驱动把这个IRP提交给IP过滤器驱动,过滤器钩子驱动设置或清除钩子回调函数的过程描述是:为了获得IP过滤器驱动的设备对象指针,过滤器钩子驱动需要调用函数IoGetDeviceObjectPointer.在这次调用中,过滤器钩子驱动传递了指向缓冲区(含有IP过滤器驱动的名称字符串)的指针、数值(表示可以同时对提供的IP过滤器驱动进行读、写访问)以及容纳返回的文件和设备对象缓冲区的指针.
过滤器钩子驱动程序使用PF-SET-EXTENSION-POINTER控制码建立一个IRP,并将其提交给IP过滤钩子驱动程序,通常filter-hook驱动程序调用IoBuildDeviceIoControlRequest函数建立所需的IRP,
该控制码向IP过滤驱动程序注册过滤钩子回调函数.在这次调用中,过滤器钩子驱动传递了指定IOCTL-PF-SET-EXTENSION-POINTER值的参数、设备对象指针以及包含PF-SET-EXTEN-SION-HOOK-INFO结构的缓冲区.为了设置过滤器钩子,这个结构包含有设置过滤器钩子回调函数地址的信息.该控制码也用来从IP过滤驱动程序中清除回调函数,为了清除过滤器钩子,这个结构包括了空(NULL)值.借助I/O堆栈位置(根据已提供的参数设置),这次调用过程给IRP返回指针.当有数据包发送或者接收时,IP过滤驱动程序就要调用这些回调函数.
为了把IRP提交给IP过滤器驱动,过滤钩子驱动调用IoCallDriver函数.在这次调用中,过滤器钩子驱动传递了一个指向IP过滤驱动设备对象的指针,也就是先前已经创建的IRP指针.
过滤器驱动清除它的过滤钩子,是通过先前注册过滤钩子的入口来实现的,因此过滤器钩子驱动应该保存指向IP过滤器驱动的文件和设备对象的指针,也就是说,只有在过滤器钩子驱动从IP过滤器驱动清除它的过滤器钩子以后,过滤器钩子驱动程序才能调用ObDereferenceObject函数减小IP过滤器驱动的文件和设备对象的指针引用计数.
PF-SET-EXTENSION-HOOK-INFO结构的定义如下,其中包含回调函数的指针:
typedef struct-PF-SET-EXTENSION-HOOK-INFO
{
PacketFilterExtensionPtr ExtensionPointer;
} PF-SET-EXTENSION-HOOK-INFO, *PPF-SET-EXTENSION-HOOK-INFO;
成员ExtensionPointer是指向hook回调函数的指针.通过该结构完成向IP过滤驱动程序注册hook函数.如果ExtensionPointer为NULL,则从IP过滤驱动程序中清除回调函数.
2.4 实现过滤器钩子的I/O控制
当应用程序或者上层驱动程序通过向过滤器钩子驱动程序发送I/O控制请求建立过滤器钩子时,驱动程序自动会响应函数代码为IRP-MJ-DEVICE-CONTROL的Dispatch例程,这个Dispatch例程处理发来的I/O控制请求,在DriverEntry入口函数中为这个Dispatch例程设置和输出入口点.
驱动开发人员需要定义和公布所有的I/O控制请求信息和过滤器钩子运行时所处理的类型,应用程序和上层驱动程序就能够用已经公布的I/O控制请求建立过滤器钩子.
为了获得I/O控制请求,过滤钩子驱动程序的设备控制例程必须调用IoGetCurrentIrpStackLocation函数,在调用中,设备控制例程把一个IRP指针传递给IoGetCurrentIrpStackLocation函数,然后设备控制例程决定哪一个I/O控制请求已经收到并且做相应的处理.
一旦当前的I/O控制请求完成后,设备控制例程调用IoCompleteRequest函数并且传递其操作状态,这个状态已经返回给先前发送请求的应用程序或高层驱动程序.
下面是典型过滤器钩子驱动的设备控制例程处理两种I/O控制请求:
Set-Hook IOCTL表示注册一个过滤器钩子;
Clear-Hook IOCTL表示清除以前注册的过滤器钩子[2].
3 过滤器钩子驱动实例分析
3.1 实例介绍
下面以一个实际的过滤钩子驱动程序为例,说明在Windows下用DriverWorks创建一个IP过滤器钩子驱动工程文件IpFilterHook和处理Windows提供的与IP过滤驱动联系的网络数据包.IPFilterHook包含两个主要的例程函数,即发送函数和接收函数.当系统的IP过滤器驱动调用自己已注册的过滤器钩子时响应这两个函数.这两个函数实现的功能是:判断IP头中的协议是否为TCP协议(基于标准端口6),若是TCP协议,则通知IP堆栈停止该数据包的传输,否则,IP过滤器驱动程序立即把数据包转发到IP协议栈中.这个过滤器钩子设置了PF-FORWARD和PF-DROP响应代码,可以根据实际需求制定过滤规则和进行处理.
该程序提供了两个控制码: IPFILTERHOOK-IOCTL-SetHook和IPFILTERHOOK-IOCTL-ClearHook,前者是向IP过滤驱动程序注册过滤钩子回调函数,当有数据包发送或接收时,IP过滤驱动程序就要调用这些回调函数;而后者是从IP过滤器驱动程序中清除回调函数.
3.2 系统开销
当运行过滤器钩子驱动程序时,应该考虑使用这种类型驱动程序的可靠性和效率.像所有内核模式驱动程序一样,过滤器钩子驱动程序被认为是系统信任的组件,如果执行了一个不合法的指令或是引用一个无效的内存区域,过滤器钩子驱动程序就会可能使操作系统崩溃.由于在网络上传送数据的完整性可能是不可信任的或者是由于硬件有故障以及是其他驱动程序传递意想不到的和不正确格式的数据,所以过滤器钩子必须要检验这些数据格式的有效性.
当注册过滤器钩子时,相应的有系统开销,尤其是每一个传入和传出的数据包都会因为附加的函数调用而导致开销,因此,过滤器钩子必须限定其所处理的每一个包大小,设计过滤器钩子应该使它处理包所花费的平均时间达到最小.
4 结论
我们提出了一种Windows 2000/XP下的网络数据包拦截技术,分析了IP过滤器钩子驱动程序的原理和实现过程,利用IP过滤器钩子驱动拦截网络数据包技术不仅仅可以用来开发个人防火墙,而且还可以用来开发其他的网络安全产品,具有一定的应用前景.

 

上海联兵环保科技有限公司
地址:上海市松江区工业区茸北分区茸阳路69号
总机:021-51691929
传真:021-57784244
免费电话:400-600-5030
技术支持:13641659499
E-mail:zhanglianbing@126.com
http://www.shlbhb.com

发表评论
网名:
评论:
验证:
共有0人对本文发表评论查看所有评论(网友评论仅供表达个人看法,并不表明本站同意其观点或证实其描述)
赞助商链接
关于我们 - 联系我们 - 咨询联兵