APP下载

基于WinCE的网络嗅探器的设计与实现

2013-08-13胡昊南张治中

电视技术 2013年5期
关键词:链路层驱动程序网卡

胡昊南,张治中

(重庆邮电大学通信网与测试技术重点实验室,重庆 400065)

网络嗅探器是利用共享式的网络传输介质,能够捕获和解析来自数据链路层、网络层和传输层等底层网络数据包的工具。随着网络需求和网络规模的日益增大,保持网络的高性能运行难度增大,网络嗅探器能够监测网络的运行状况,快速定位和解决网络故障,保证网络高速有效运行。由于嵌入式设备在网络评估和监测中得到了广泛应用,在嵌入式系统中实现网络数据包的捕获和分析具有重要的意义[1-2]。

本文分析了Winpcap(Windows Packet Capture)库函数的架构和网络数据包的传递流程,研究了NDIS(Network Driver Interface Standard)网络驱动程序与该实现方案的联系,给出了一种基于WinCE嵌入式系统网络嗅探器的设计和实现方案,该方案具有良好的兼容性和适用性,能够满足实际网络监测的要求[3-4]。

1 网络嗅探器基本工作原理

1.1 网卡混杂模式

网卡混杂模式是网卡的一种特殊工作模式,在该工作模式下,网卡不对目的地址进行判断,而直接将收到的所有数据包传递给上层进行处理[5]。必须将网卡置于混杂模式才能实现网络嗅探器。

1.2 NDIS网络驱动程序

NDIS是网络驱动程序接口规范的简称。它横跨数据链路层、网络层和传输层,定义了网卡驱动程序与上层协议驱动程序之间的通信接口规范,屏蔽了底层物理硬件的不同所带来的影响,使上层协议驱动程序可以和底层任何型号的网卡进行通信[6]。NDIS支持三种类型的驱动程序,分别为协议驱动程序、中间驱动程序和微端口驱动程序。

1.3 Winpcap移植

Winpcap是Windows平台下一个免费为应用程序提供访问网络底层能力的系统。微软为WinCE系统提供了开源的 PacketCE。PacketCE由 DRIVER,DLL和 SampleApp三个工程组成,其依赖关系如图1所示。其中DRIVER工程是一个流驱动程序;DLL工程为上层应用程序提供流驱动程序的封装接口;SampleApp是可参照的示例程序。目前最高版本的PacketCE不能直接在操作系统WinCE5.0中使用,因此需要修改源码进行移植。

图1 PacketCE结构图

2 网络嗅探器软件结构设计

2.1 方案选择

实现网络嗅探器有两种方案。一种方案是使用Windows Socket编程中的原始套接字。原始套接字和其他套接字的不同之处在于它可工作在网络层或数据链路层,而其他类型的套接字只能工作在传输层,所以使用原始套接字能够监听数据链路层的数据。但操作系统WinCE5.0中不支持使用原始套接字。

另一种方案是使用微软提供的Winpcap函数库,在WinCE中微软提供的开源软件PacketCE,因目前最高版本的PacketCE不能直接在操作系统WinCE5.0中使用,需自己搭建编译环境、修改源码对其进行移植。Winpcap的核心是NDIS中间驱动程序,与Windows Socket相比,NDIS具备更高的效率和功能扩展性。在Windows平台下,使用NDIS是捕获网络数据包最好的方法[6]。

本文采用的是移植微软提供的Winpcap函数库的方案,即使用NDIS中间驱动程序实现网络嗅探器。

2.2 软件整体架构设计

软件部分主要由网卡驱动程序、NDIS网络驱动程序、操作系统和应用程序组成。其结构模型如图2所示。本系统所使用的网卡芯片型号为DM9000,嵌入式ARM芯片的型号为S3C2440。经分析知DM9000驱动程序由网卡驱动程序和NDIS微端口驱动程序组成,PacketCE由NDIS中间驱动程序、NDIS协议驱动程序和DLL接口组成。

网卡驱动程序通过处理网卡寄存器维持网卡的正常工作。中间驱动程序为微端口驱动程序提供协议驱动程序接口,为协议驱动程序提供微端口驱动程序接口[7]。DLL接口向上层应用程序提供驱动程序接口。数据包的捕获基于NDIS中间层驱动程序实现,并依据过滤准则实现数据包的接收过滤,向上层传递数据包。应用层程序进行过滤准则的设置和数据包的处理分析以及数据统计和结果显示。

2.3 软件模块设计

系统采用了模块化的设计方法,各模块之间相互独立,便于功能的修改和扩展,提高了系统的可移植性、可维护性和可升级性。其软件模块结构如图3所示。

图2 软件结构模型

图3 软件模块设计图

各个模块的的作用如下:

1)过滤模块

设置过滤准则,可选择性地接收网络数据包,屏蔽不关心的数据包,减轻对数据包的分析处理负担,提高系统的监听效率。

2)数据包捕获模块

数据包解析模块的基础,实现网络数据包的捕获。主要完成网卡信息列表的读取、打开指定网卡、抓包的开始和停止功能。

3)数据包解析模块

网络嗅探器系统的核心是实现数据包协议的解码并保存解码后的信息。保存的信息包括数据包捕获的时间、最高级协议类型、目的MAC地址和源MAC地址、目的IP地址和源IP地址、帧长度等信息。

4)控制模块

控制整个系统的开始与停止,协调各个模块之间的交互,完成对系统信息的设置,例如系统MAC地址、IP地址以及工作速率模式的设置。

5)显示模块

实现捕获结果及测试过程附加信息的呈现。能够显示数据包解析模块所保存的全部信息、接收的总包数量、测试起始时间和测试持续时间,并限制显示的包详细信息总数,节省占用的内存。

3 网络嗅探器的关键技术与模块

3.1 网络数据包传递流程

为了确保所捕获的网络数据包信息的正确性,了解网络数据包在系统中的传递流程,监测网络数据包在各个位置的信息正确性成为必要。本文主要分析了系统中网络数据包从网卡驱动,流经NDIS驱动程序,直至DLL接口的整个传递流程,如图4所示。

图4 网络数据包传递过程图

当网络数据包到达网卡时,因初始化中断,对网卡数据包的接收进行了监控,所以首先调用网卡驱动层中的Dm9LookupRxBuffer()函数,判断是否有有效的网络数据包到达,并且调用DeviceReadString()函数完成对网卡接收寄存器中的网络数据包内数据的读取,然后调用NDIS微端口驱动层中负责与NDIS中间驱动层交互的Ndis-MIndicateReceivePacket()函数,进而调用NDIS中间驱动层中的PacketRecieve()/ProtocalReceiveComplete()函数,完成数据从网卡寄存器到内核缓冲区的转移。这里的内存缓冲区是一个PNDIS_PACKET结构体类型的变量,该结构体类型是指向PNDIS_BUFFER结构体类型的一个链表。DLL接口向上层应用程序提供PackeRecievePacket()函数,该函数调用NDIS协议驱动层的PKTRead()函数,PKTRead()函数与PacketReceive()函数通过一个全局句柄进行交互,完成从内核缓冲区的数据拷贝至用户缓冲区的功能。

总结上述过程,当有网络数据包到达网卡时,先将网卡接收寄存器中的数据包复制到内核缓冲区中,然后通过上层调用,将内核缓冲区中的数据拷贝到用户缓冲区中,最后再交给应用程序加工提取出有用的信息。在实现过程中,可根据上述流程进一步分析验证网络数据包信息的正确性,定位网络数据包信息错误的原因,对理解NDIS网络驱动程序的工作流程具有指导意义。

3.2 网络数据包的捕获

通过PacketGetAdapterNames()函数获取网卡列表信息,所有信息以字符串的形式存储在字符数组中。选择并打开已选择的网卡接口,通过设置Packet结构体类型变量中缓存的大小、超时时间等信息,初始化接收参数设置。通过PacketRecievePacket()函数接收网络数据包,网络数据包的所有数据存储在Packet结构体类型变量的参数Buffer中。其捕获流程如图5所示。

图5 网络数据包捕获流程图

3.3 网络数据包的解析

利用NDIS中间驱动程序捕获的数据包处在数据链路层,依次经过了传输层、网络层和数据链路层的封装。因此,需要对所接收到的数据包进行进一步解析才能得到所需要的信息。本系统依次分析数据链路层、网络层和传输层的部分关键信息,不分析应用层的信息。

在数据包解析过程中,根据各种协议数据包包头的格式,读取接收网络数据包中相应位置的包头,分析出该协议的各个字段值。在数据链路层信息解析过程中,首先根据以太网帧结构的协议类型字段判断帧的类型,主要判断的类型有ARP,RARP以及IP[8]。如果帧类型是IP,则需继续根据IP数据报结构的协议类型字段判断该数据报的传输层信息,主要判断的类型是ICMP,IGMP,TCP以及UDP,再根据对应的包头格式获取有用的字段信息。

本系统中在接收的数据包信息前增加了20 byte的自定义信息(8 byte的帧接收时间信息、4 byte的Captured Portion Length信息、4 byte的Packet Original Length信息、2 byte的Bpf Header Length信息以及2 byte的边缘对齐填充数据),可直接从该自定义信息中获取所接收帧长度、帧接收时间的信息,需要考虑自定义信息对数据包解析过程所带来的影响。网络数据包解析显示结果如图6所示。

图6 网络嗅探器结果显示图(截图)

3.4 PacketCE在WinCE系统中的移植

分析PacketCE中DRIVER工程的OpenClose.c和Packet.c的源码可知,DRIVER是一个NDIS中间驱动程序,在本质上是一个流驱动程序,所以在Platform Builder5.0软件中搭建了PacketCE的编译环境。

在动态链接库被加载后,流接口驱动程序的入口函数会第一个被调用,入口函数主要完成硬件的初始化工作。该流接口驱动程序的入口函数DWORD PKT_Init()首先定义并初始化了NDIS_PROTOCOL_CHARACTERISTICS类型结构体变量ProtocalChar,然后通过调用Ndis-RegisterProtocol()函数完成了NDIS协议驱动程序的注册。网卡驱动程序不仅完成了对DM9000网卡芯片的驱动,还完成了对NDIS微端口驱动程序的实现和注册。

移植时需分析在DRIVER工程中会调用到的微端口驱动程序,然后在微端口驱动程序中增加适当的函数并注册,防止引起异常;在中间驱动程序中修改版本号等信息,并根据数据包交互流程,在对应的函数中作出相应的修改,重新编译生成Packet.dll和Winpcap.dll动态链接库,加载至WinCE操作系统中,配置好环境后,应用程序便可直接调用Winpcap库函数。

3.5 测试验证

在PC机端运行的Wireshark抓包软件和在WinCE嵌入式系统运行的网络嗅探器同时监测统计同一个实际网络中的数据包信息,以Wireshark的统计数据作为实际测试环境数据,将网络嗅探器的接收包数量测试结果与其对比,计算出丢包率,结果如表1所示。

表1 测试验证结果

从表中可得知,当发送包数量小于10000时,网络嗅探器未出现丢包的情况。当发送包数量大于10000时,由于硬件CPU频率和内存大小的限制,导致出现轻微的丢包现象。未出现丢包情况时,Wireshark测试结果和网络嗅探测试结果中对应编号的包协议类型、长度、源及目的MAC、源及目的IP均相同,所以该网络嗅探器能够基本满足实际网络中网络数据包捕获的正确性和性能要求。

4 结束语

网络嗅探器是多个模块组成的系统,能够监测网络运行状况,是分析网络性能、解决网络故障的基础。本文介绍了NDIS网络驱动程序的基本结构,通过对NDIS驱动和Winpcap库函数的分析,在WinCE嵌入式系统中实现了网络嗅探器的功能,着重阐述了网路数据包的传递流程、软件结构设计和Winpcap的移植。本方案可在保证获取信息正确的前提下修改移植的库函数,在数据包前增加自定义信息,具有良好的结构性、扩展性和效率性,并能够收发基于各层的各种协议数据包,接收获取网络中各层的信息。

[1]TANG Dongming,LI Juguang,LU Xianliang.Efficient packet capture on windows CE[C]//Proc.2nd International Conference on Intelligent Control and Information Processing.Harbin:IEEE Press,2011:110-114.

[2]SMITH M,LOGUINOV D.Enabling high-performance internet-wide measurements on windows[C]//Proc.11th International Conference on Passive and Active Measurement.Hammamet:IEEE Press,2001:686-693.

[3]宋雁辉.Widnows防火墙与网络封包截获技术[M].北京:电子工业出版社,2002.

[4]杨智君,马骏骁,田地,等.基于NDIS的IP安全协议的研究与实现[J]. 计算机工程,2007,33(22):166-168.

[5]QADEER M A,ZAHID M,IQBAL A,et al.Network Traffic Analysis and Intrusion Detection using Packet Sniffer[C]//Proc.2010 Second International Conference on Communication Software and Networks.Singapore:IEEE Press,2010:313-317.

[6]HU Yin,LIN Pei.Reserch and implementation of packet classification based on NDIS intermediate layer under windows platform[C]//Proc.2011 International Symposium on Intelligence Information Processing and Trusted Computing.Wuhan,Hubei:IEEE Press,2011:157-160.

[7]WANG Xiaoling,ZHOU Gang.Defence design for ARP spoofing based on NDIS intermediate driver[C]//Proc.2012 International Conference on Computer Distributed Control and Intelligent Environmental Monitoring.Changsha,Hunan:IEEE Press,2012:218-220.

[8]TANENBAUM A S,WETHERALL D J.计算机网络[M].5th ed. 北京:机械工业出版社,2011.

猜你喜欢

链路层驱动程序网卡
基于多空间内存共享的数据链路层网络包捕获方法
一种基于PCI接口的1394B总线的设计与实现
Server 2016网卡组合模式
计算机硬件设备驱动程序分析
基于FPGA全功能MVB网络从设备链路层IP核设计
挑战Killer网卡Realtek网游专用Dragon网卡
IEEE 1394事务层接口的设计与实现
RHEL7 Network Teaming(网卡绑定)配置与测试
USB故障又一原因
妙用鼠标驱动