网络嗅探器的工作原理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
网络嗅探器的工作原理
1 引言
网络嗅探器(Sniffer)是利用计算机网络接口截获所需网络内部数据报文的一种工具,他广泛地应用于流量分析、安全监控、网管分析、防火墙等的实现中。Sniffer主要被用来在网络上截获位于OSI协议模型中各个协议层次上的数据包,通过对截获数据包的分析,嗅探器可以掌握目标主机的信息。由于与具体平台的网络协议栈密切相关,并涉及网络安全的敏感问题,网络嗅探一般没有通用的实现方法。
随着计算机网络应用的普及,和Windows 2000/XP网络操作系统的广泛应用,使得在Window 2000/XP下保障网络通信安全成为一个迫切需要解决的问题。本文基于NDIS中间层驱动程序实现网络嗅探器,为满足上述需求提供了充分的可能。
2 网络嗅探器的基本工作原理
网络嗅探器利用的是共享式的网络传输介质。共享即意味着网络中的一台机器可以嗅探到传递给本网段(冲突域)中的所有机器的报文。例如最常见的以太网就是一种共享式的网络技术,以太网卡收到报文后,通过对目的地址进行检查,来判断是否是传递给自己的,如果是,则把报文传递给操作系统;否则,将报文丢弃,不进行处理;网卡存在一种特殊的工作模式,在这种工作模式下,网卡不对目的地址进行判断,而直接将他收到的所有报文都传递给操作系统进行处理,这种特殊的工作模式,就称之为混杂模式。网络嗅探器通过将网卡设置为混杂模式来实现对网络的嗅探。
一个实际的主机系统中,数据的收发是由网卡来完成的,当网卡接收到传输来的数据包时,网卡内的单片程序首先解析数据包的目的网卡物理地址,然后根据网卡驱动程序设置的接收模式判断该不该接收,认为该接收就产生中断信号通知CPU,认为不该接收就丢掉数据包,所以不该接收的数据包就被网卡截断了,上层应用根本就不知道这个过程。CPU如果得到网卡的中断信号,则根据网卡的驱动程序设置的网卡中断程序地址调用驱动程序接收数据,并将接收的数据交给上层协议软件处理。
3 NDIS中间层驱动程序
访问位于网络底层的传输协议是网络嗅探器的基本功能。网络嗅探器必须能够接收并分析来自数据链路层、网络层、传输层等底层的数据包,本文介绍的网络嗅探器采用了网络驱动程序接口规范(NDIS)中间层驱动程序技术设计。
NDIS是Windows网络协议栈构件间的接口规范,基于NDIS的核心态包过滤技术具有较高的结构性和可扩展性。从NDIS4.0开始,NDIS开始支持中间层驱动程序(Intermediate Driver),为NDIS体系带来了很多的灵活性,他是位于一个或者多个NIC驱动之上和传输层驱动之下的驱动程序,即位于链路层和协议层之间,对上面的协议层提供一个虚拟的微端口网卡驱动接口(MiniportDriver),而对下面的链路层则提供一个协议驱动接口(Protocol Driver)。所有经过网卡发送到网络和从网络接收的数据包都要由此通过,因此中间层驱动程序可以对所有网络数据包进行过滤和处理。从NDIS中间层在Windows中的位置来看,其处于核心层,处于与操作系统同等级别的核心态,如图1所示。
本文使用微软提供的驱动程序开发包DDK进行NDIS中间层驱动程序编程。具体流程为:
(1)NDIS驱动程序在主入口函数DirverEntry中调用NdisMinitializeWrapper函数注册输出函数集入口,得到设备句柄;
(2)输入(1)得到的句柄调用NdisIMRegisterLayeredMiniport,为NDIS中间层驱动程序注册一套Miniport回调函数,这样上层Protocol协议就认为中间层驱动程序是网卡,并通过NDIS库调用这些回调函数;
(3)调用NdisRegisterProtocol,为NDIS中间层驱动程序注册一套Protocol回调函数,这样下层网卡就认为中间层驱动程序是一个协议,并通过NDIS库调用这些函数;
(4)当操作系统发现NIC时,NDIS调用中间层驱动程序注册的ProtocolAdapterBind函数,该函数内部需要调用NdisOpenAdapt打开适配器,保证了网卡和中间层的绑定关系;
(5)调用PtReceivePacket接收网卡收到的数据包;
(6)数据包与所设置过滤规则进行比较,不满足规则时调用函数返回NDIS_STATUS_NOT_ACCEPTED,该宏在ndis.h中定义,这样就结束了本接收函数的调用。
4 基于NDIS中间层驱动程序的网络嗅探器实现
4.1 网络嗅探器的结构模型
本文实现的网络嗅探器主要由运行于Ring0层的NDIS中间层驱动程序模块和运行于Ring3层的应用层包处理模块构成。在Windows 2000平台下实现了对流经指定网络适配器的各种网络协议、任意/指定IP地址和端口的数据包的嗅探,如图2所示。
(1)应用层包处理模块:处于应用层,负责过滤准则的设置和数据包的处理分析。
(2)数据包捕获及过滤实现模块:基于NDIS中间层驱动程序完成底层数据的截获功能,并依据数据包过滤准则实现对数据包的接收过滤,向上层应用程序递交数据包。
4.2 应用层包过滤准则设置
网络嗅探器中采用包过滤技术的目的主要是为了有选择地接收网络数据包,屏蔽侦听者不关心的网络数据包,从而提高系统的监听效率,减轻高层应用对数据包的分析处理负担。数据包的过滤是对捕获的数据包的报头进行分析,依据过滤准则来决定数据包是否需要提交高层应用进行处理。
过滤准则的设置主要分为IP地址过滤、协议过滤、端口过滤三个方面,可分别进行设置,并通过CFile::Open(″../data/filter″,CFile::modeCreate|CFile::modeRead-Write)和CFiIe::Write(&m_Filter,sizeof(m_Filter))分别写入配置文件。过滤准则依照以下方式进行工作:
(1)当数据包到达NIC时,对数据包的各级包头进行协议分析。
(2)过滤准则无设置时,默认接收该准则权限内的所有数据包。
(3)若3个过滤准则中的任一个有设置,数据包将依次与IP地址过滤准则、协议过滤准则、端口过滤准则匹配,若存在一条准则拒绝接收该数据包,并丢弃。
(4)如果一个数据包满足所有数据包过滤准则,则该数据包被提交给高层应用。
4.3 数据包捕获及过滤实现
当过滤规则设置完成后,核心态的驱动程序就可以根据上层的要求来截获数据包。具体步骤为:
(1)用户态程序启动驱动服务程序;
(2)用户态程序调用CFile::Read(&m_Filter,sizeof(m_Filter))读取过滤准则;
(3)调用DeviceloControl(hFile,IOCTL_ENUM_ADAPTERS,NULL,0,buffer,MAX_ADAPTERS*256,&BytesTxd,NULL)从注册表中获取网络适配器的信息,并显示到用户界面;
(4)用户选择适配器绑定并设置适配器为混杂模式;
(5)创建事件对象,接收数据包线程ReadProcessProc()和发送读请求线程ReadRequestProc()使用事件机制来同步、协调工作,使得读队列不太长,也不为空;
(6)ReadRequestProc()调用WaitForSingleObject函数等待事件发生,当读请求队列长度小于设定的最小长度时,调用SetEvent没置事件为有信号状态,线程不断地发出读请求,保持驱动程序的读队列不为空,防止丢包发生;当读请求队列长度超出设定的最大长度时,调用ResetEvent设置事件为无信号状态,线程停止发送读请求;