第24卷 第6期黄 石 理 工 学 院 学 报Vol.24 No.6
2008年12月JOURNALOFHUANGSHIINSTITUTEOFTECHNOLOGYDec 2008
文章编号:1008-8245(2008)06-0022-04
基于Winpcap的网络嗅探器的设计与实现
成 俊 李 芳
(黄石理工学院计算机学院,湖北黄石435003)3
摘 要:针对网络管理中的安全问题,以Winpcap为开发平台,使用VisualC++为开发工具,设计了一个网络
嗅探器。分析了网络嗅探器的基本工作原理,描述了Winpcap捕获数据包的程序流程,最后给出具体实现的关键函数。结果表明,这种网络嗅探器结构简单,捕获数据快,对网络的安全管理具有重要意义。
关键词:数据包捕获;嗅探;Winpcap中图分类号:TP393.09 文献标识码:A
DesignandImplementationof
NetworkSnifferBasedonWinpcap
CHENGJun LIFang
(SchoolofComputerScience,HuangshiInstituteofTechnology,HuangshiHubei435003)
Abstract:Aimingatthesecurityproblemsofnetworkmanagement,thepaperproposesanetworksnifferwithWinpcapasdevelopmentplatformandVisualC
++
asdevelopmenttoolWinpcapandvisualC
++
.Thefundamentalprincipleof
thenetworksnifferisanalyzedandtheprocedureduringwhichWinpcapcapturesthepacketisintroduced.Thekeyfunctionisfinallygiven.Theresultsshowthatthenetworksnifferhassuchadvantagesassimplestructureandfastdatacapture,whichissignifanttothenetworksecurityandmanagement.Keywords:packetcapture;sniffer;Winpcap
随着Internet的迅猛发展,网络已日益成为工作和生活中不可或缺的工具。同时,网络的安全性与可靠性日益受到人们的重视。网络嗅探器可以有效完成对网络上传输数据包的捕获,从而收集与分析网络信息,是网络流量监控和故障检测所必不可少的工具之一,对网络管理与网络安全具有重要的意义。
物,是Win32环境下数据包捕获的开放代码函数库。Winpcap是第一个Win32开放式的捕获包的体系结构,能够支持大多数应用程序的需要。
Winpcap
[1]
包含了一个内核级的数据包过滤
器———NPF(NetgroupPacketFilter)、一个底层动态链接库(Packet.dll)和一个高层的于系统的库
(Wpcap.dll)。NPF模块过滤数据包,将数据包不
做任何改动的传递给用户。Packet.dll模块提供
1 Winpcap简介
Winpcap(windowspacketcapture)是Win32平
了Win32平台下的捕获包的驱动接口,基于Pack2
et.dll编写的程序可以不经过重新编译就在各种Win32平台下实现捕获数据包。Wpcap.dll库不
台下强大的、有较好扩展性的底层网络分析体系结构,是UNIX下的lipbcap移植到Windows下的产
收稿日期:2008-11-05
3基金项目:黄石理工学院2008年科研项目(08yjz18B)作者简介:成俊(1980— ),男,湖北大冶人,助教,本科。
依赖于操作系统,且它包含了一些其他高层的函数,如过滤器生成器,用户定义的缓冲区和高层特
第6期 成 俊 李 芳:基于Winpcap的网络嗅探器的设计与实现 23
性。Winpcap的主要功能在于于主机协议
(如TCP/IP)而发送和接收原始数据包。
3 网络嗅探器总体设计
网络嗅探器的整体结构按功能分为3个部分,自底向上分别是数据捕获模块、协议解析模块和用户显示模块。网络嗅探器的总体结构如图1所示。2 网络嗅探器的基本原理
网络嗅探器是一种常用的网络数据收集软件,简单地说,它是在广播式网络环境下利用计算机网络接口截获目的地为其它计算机的数据报文的一种工具。
在以太网中,信息是以明文的形式在网络上传输
[2]
,当将网络适配器设置为混杂模式时,由于
采用以太网广播信道争用的方式,使得监听系统与正常通信的网络能够并联连接,并可以捕获任何一个在同一冲突域上传输的数据包。
IEEE802.3标准的以太网采用的是持续CSMA的
方式,正是由于以太网采用这种广播信道争用的方式,使得各个站点可以获得其他站点发送的数据。运用这一原理使信息捕获系统能够拦截我们所要的信息,这是捕获数据包的物理基础。首先,抓包系统必须绕过操作系统的协议栈来访问在网络上传输的原始数据包,这就要求一部分运行在操作系统核心内部,直接与网络接口驱动交互。这个部分是系统依赖的,在Winpcap的解决方案里它被认为是一个设备驱动,称作NPF(Netgroup
PacketFilter)。
Winpcap提供了两个不同的库:Packet.dll和Wpcap.dll。Wpcap.dll提供了更加友好、功能更加
图1 网络嗅探器的总体结构
4 数据捕获模块的设计与实现
数据捕获模块的主要功能是进行数据采集,这是整个系统的基础和数据来源。程序使用Win2
pcap来捕获网络中原始数据包。具体数据包捕获
流程如图2所示
[3]
。
强大的函数调用。WinPcap的优势在于提供了一套标准的抓包接口,与libpcap兼容,可使得原来许多UNIX平台下的网络分析工具快速移植过来,便于开发各种网络分析工具,充分考虑了各种性能和效率的优化,包括对于NPF内核层次上的过滤器支持,支持内核态的统计模式,提供了发送数据包的能力。前者提供了一个底层API,伴随着一个于Microsoft操作系统的编程接口,这些
API可以直接用来访问驱动的函数;后者导出了
图2 数据包捕获流程图
一组更强大的与libpcap一致的高层抓包函数库
(captureprimitives)。这些函数使得数据包的捕获
以一种与网络硬件和操作系统无关的方式进行。
网络嗅探器工作在网络环境的底层,拦截所有正在网络上传送的数据,并且通过相应的解析处理,可以实时分析这些数据的内容,进而分析所处的网络状态和整体拓扑布局。
4.1 获得本地网络驱动器列表
获取一个已经绑定的网卡列表,然后Winpcap对捕获网络数据端口进行设定。
通过pcap引擎找出并设定监听的网络接口。Winpcap提供了pcap_findalldevs_ex()函数,这个函数返回一个指向pcap_if结构的链表,其中的每一项都包含了一个己经绑定的适配器(网卡)的全部信息。其中name和description这两项分别包
黄 石 理 工 学 院 学 报 2008年24
含了相应设备的名称和描述。取得网卡列表后就在屏幕上显示出来,如果网卡没有被发现就显示有关错误,pcap_findalldevs()同其他的libpcap函数一样有一个errbuf参数,当有异常情况发生时,这个参数会被pcap填充为某个特定错误字串。
程序功能示意如下:
#inelude”pcap.h”voidmain(){
Pcap_if_t3alldevs;://用于存储网卡信息Charerrbuf[PCAP_ERRBuF_SIZE];//用于存
是pcap-compile()和pcap_setfilter()来实现的。
//编译过滤规则
if(PcaP_compile(adhandle,&fcode,”ipandtcp”,l,netmask)<0)
{fprintf(stderr,”\\nUnabletocompilethePaeket);filter.Checkthesyntax.\\n”pcap_freealldevs(alldevs);//释放设备列表retum-1;}//设置过滤器if(pcap_setfilter(adhandle,&fcode)<0){{fprintf(stderr,”\\nErrorsettingthefilter.\\);}n”
储错误信息
if(pcap_findalldevs(&alldevs,errbuf)==-1)//这个API用来获得本机网卡列表{
fprintf(stderr,”ErrorinPcap_findalldevs:%s\\n”,errbuf);
exit(l);}
…
pcap_freealldevs(alldevs);//最后用pcap_free2alldevs()释放内存资源
4.4 捕获数据包
使用pcap_next_ex()从网络接口中读取一个数据包,该函数第一个参数是接口句柄,后两个参数由函数返回,分别为数据包的相关信息和数据
[5]
包本身。函数返回1表示正常接收一个数据包,返回0表示超时,-1表示发生错误。每捕获到一个数据包,就调用PacketHandler()函数对数据包进行后续解析处理。
//循环捕获数据包
while((res=Pcap_next_ex(adhandle,&header,&Pkt--data))>=0)
{//接收超时继续循环if(res==0)continue;//处理收到的数据包PacketHandler();}
4.2 打开网卡准备捕获数据包
获得网卡的信息后就可以按数据捕获的要求打开网卡。打开网卡的功能是通过pcap_open_
live()来实现的
[4]
。它的函数原型定义如下:
pcap_t3pcap_open_live(char3device,intsnaplen,intpromisc,intto_ms,char3ebuf)
device:前面制定的监听设备接口;
snaplen:制定pcap捕获的最大数目的网络数
5 协议解析模块的设计与实现
该模块的主要功能就是对捕获的数据包按照数据链路层、网络层、传输层和应用层的层次结构自底向上进行解析,最后将解析结果显示输出。
以解析UDP数据包为例,首先设置UDP过滤,用这种方法确保packet_handler()只接收到基于IPV4的UDP数据。同时,定义两个数据结构来描述IP和UDP的头部信息,packet_handler()用这两个结构来定位头部的各种字段。开始捕获之前,首先要用pcap_datalink()来检查MAC层,所以程序只能够工作在Ethernetnetworks上,再次确保MAC头为14bytes。MAC头之后是IP头,可以从中提取出了目的地址。IP之后是UDP,在确定
UDP的位置时有点复杂,因为IP的长度以版本的
据包;
promisc:此参数大于0,即指定device接口工
作在混杂模式(promiscousMode)。
在正常情况下网卡只接受去往它的包而去往其他主机的数据包则被忽略,相反当网卡处于混杂模式时它将接收所有的流经它的数据包,这就意味着在共享介质的情况下可以捕获到其它主机的数据包。大部分的包捕获程序都将混杂模式设为默认。
4.3 数据包的过滤设定
通过设置数据流过滤规则(filter)来实现。数据包过滤处理是嗅探技术中的难点和重点,Win2
pcap提供了最强大的数据流过滤引擎。它采用了
一种高效的方法来捕获网络数据流的某些数据且常常和系统的捕获机制相集成。过滤数据的函数
不同而不同,所以用头长字段来定位UDP,一旦确
第6期 成 俊 李 芳:基于Winpcap的网络嗅探器的设计与实现 25
定了UDP的起始位置,就可以解析出原和目的端口
[6]
S\",ltime);
//打印时间戳和数据报长度
printf(\"%s.%.6dlen:%d\",timestr,head-er->ts.tv_usec,header->len);
//找到IP头的位置
ih=(ip_header3)(pkt_data+14);//找到UDP的位置ip_len=(ih->ver_ihl&0xf)34;
uh=(udp_header3)((u_char3)ih+ip_len);
}
。
//定义处理包的函数Voidpacket_handler(u_
解析代码如下:
char3param,conststructpcap_pkthdr3header,constu_char3pkt_data)
{
structtm3ltime;chartimestr
[6]
;
ip_header3ih;udp_header3uh;u_intip_len;u_shortsport,dport;//将时间戳转换为只读格式ltime=localtime(&header->ts.tv_sec);
strftime(timestr,sizeoftimestr,\"%H:%M:%
6 测试结果
程序运行界面及捕包结果如图3所示。
图3 程序运行界面及捕包结果
7 结束语
本文简述了Winpcap的结构,分析了网络嗅探器的基本工作原理,给出了网络嗅探器总体结构,并在Windows平台上用VC
++
参考文献
[1] 吴功宜,董大凡,王珺,等.计算机网络高级软件编
程技术[M].北京:清华大学出版社,2008
[2] 谢小特,王勇军.基于Winpcap的捕包程序设计
[J].软件导刊,2007(11):71-72
[3] 胡晓元,史浩山.Winpcap包截获系统的分析及其应
编程实现了基于
Winpcap的网络嗅探器的基本功能。该网络嗅探
器具有结构简单、捕获数据快、协议识别率高等特点。可以在此基础上,根据不同的网络需求开发设计出不同的应用系统,对网络进行控制,通过对局域网中的数据包进行捕获和分析,实时地、动态地对局域网内的所有上网主机进行监视、控制与管理,从而可更好地保护网络的安全。
用[J].计算机工程,2005(1):96-97
[4] 孙萍,徐朝阳,鸣.基于Winpcap的以太网监听系
统的设计与实现[J].舰船电子对抗,2007(2):94-95
[5] 庄春兴,彭奇志.基于Winpcap的网络嗅探程序设
计[J].计算机与现代化,2002(5):11-13
[6] 赵辉,叶子青.VisualC
++
系统开发实例精粹[M].北
(责任编辑 梅军进)
京:人民邮电出版社,2005