您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > winpcap网络嗅探器开发
winpcap网络嗅探器开发摘要:随着计算机技术的发展,网络的应用迅速普及,网络已日益成为生活中不可或缺的工具。同时,网络的安全性与可靠性日益受到人们的重视,安全性指的是网络上的信息不被泄露、更改和破坏,可靠性指的是网络系统能够连续、可靠地运行,网络服务不被中断。网络数据包捕获、监听与分析技术是网络安全维护的一个基础技术同时也是网络入侵的核心手段。所以研究有关数据包捕获和分析技术对保证网络的健康、安全运行是很有意义的。关键词:数据包,捕获,函数库,过滤1绪论随着计算机技术的发展,网络的应用迅速普及,网络已日益成为生活中不可或缺的工具。同时,网络的安全性与可靠性日益受到人们的重视,安全性指的是网络上的信息不被泄露、更改和破坏,可靠性指的是网络系统能够连续、可靠地运行,网络服务不被中断。网络数据包捕获、监听与分析技术是网络安全维护的一个基础技术同时也是网络入侵的核心手段。所以研究有关数据包捕获和分析技术对保证网络的健康、安全运行是很有意义的。2设计需求随着网络技术的飞速发展和网络时代的到来,互联网的影响己经渗透到国民经济的各个领域和人民生活的各个方面,全社会对网络的依赖程度越来越大,但由于计算机网络具有联结形式多样性、终端分布不均匀性和网络的开放性、互联性等特征,致使网络易受黑客、恶意软件和其他不轨的攻击。如何更有效地保护重要的信息数据、提高计算机网络系统的安全性已经成为所有计算机网络应用必须考虑和必须解决的一个重要问题。本课题详细地阐述了Winpcap网络数据捕获函数库的工作机理和内部架构,对其内部的功能函数做了介绍,并对它们在数据包捕获和分析上的实现过程做了总结和概括。最后,具体分析了目的在于网络数据包捕获和分析的程序的层次结构,给出了具体的通过调用Winpcap来捕获和分析数据包的程序的设计与实现方法,并通过编程实现了基于winpcap的网络数据捕获和分析系统。3设计思想一个较为完整的基于Winpcap的网络数据包捕获程序包括内核部分和用户分析部分,其中内核部分负责从网络中捕获和过滤数据;用户分析部分负责界面、数据转化与处理、格式化、协议分析等。打开网络设备作为包捕获描述符Pcap.open.live()查找可用的网络设备Pcap.lookup.dev()关闭并返回Pcap.close()捕包并处理pcap.loop()或pcap.dispatch()判断与网络设备相关的网络号及掩码Pcap.lookupnet()设置过滤器Pcap.setfilter()编译过滤规则为内核过滤码Pcap.compile()开始命令行中指定要监视的网络设备?结束NY4Winpcap主要数据结构和功能函数4.1网络接口的地址structpcap_addr{structpcap_addr*next;/*指向下一个地址节点*/structsockaddr*addr;/*网络接口地址*/structsockaddr*netmask;/*掩码*/structsockaddr*broadaddr;/*广播地址*/structsockaddr*dstaddr;/*目标地址*/}4.2Winpcap存储文件类型struckpcap_file_header{bpf_u_int32magic;/*文件类型*/u_shortversion_major:/*主版本号*/u_shortversion_minor:/*次版本号*/bpf_int32thiszone:/*区域时间*/bpf_u_int32sigfigs:/*时间截*/bpf_u_int32snaplen:/*捕获长度*/bpf_int32linktype:/*链路层类型*/}4.3网络接口链表中的一个结点structpecp_if{structpcap_if*next:/*下一个网络接口节*/char*name;/*网络接口名称*/char*description:/*描述信息*/structpcap_addr*address:/*网络接口地址*/bpf_iint32flags;/*标记*/}4.4捕获的数据包基本信息structpcap_pkthdr{structtimevalts;/*时间截*/bpf_int32caplen:/*捕获长度*/bpf_int32len;/*数据包长度*/}4.5Winpcap的状态信息structpcap_stat{u_intps_recv:/*捕获到的数据包的个数*/u_intps_drop;/*丢失的数据包的个数*/u_intps_ifdrop;/*未用*/#ifdefWIN32u_intba_capt/*数据包到达应用层的个数*/#endif}4.6Winpcap主函数相关功能pcap_t*pcap_open_live();用于打开一个网络接口进行数据包捕获。char*pcap_lookupnet();功能是获得本机的网络接口intpcap_lookupnet():功能是获取的网络地址和掩码。intpcap_dispatch()或intpcap_loop():功能是(循环)获取网络数据包。voidpcap_dump();用于将包内容输出到由pcap_dump_open()打开的文件中。intpcap_compileO;用于将过滤规则字符串编译成一个BPF内核过滤程序。intpcap_setfilter();功能是设置BpF过滤规则。intpcap_datalink();功能是获取数据链路层类型,如l0M以太网、SLIP、PPP、FDDI、ATM、IEEE802.3等。voidpcap_close();功能是关闭Winpcap关联文件操作并回收资源。5详细设计5.1获得本地网络驱动器列表基本上所有基于Winpcap的应用程序所做的第一件事情都是获取一个已经绑定的网卡列表,然后Winpcap再对捕获网络数据端口进行设定,一般有两种设定方式:(l)用户在命令行指定监听的网络接口,这样就要对命令行参数进行判断,本课题不采用此方式。(2)通过pcap引擎找出并设定监听的网络接口。Winpcap提供了pcap_findalldevs_ex()函数,这个函数返回一个指向pcap_if结构的链表,其中的每一项都包含了一个己经绑定的适配器(网卡)的全部信息,尤其是字段名字和含有名字的描述以及有关驱动器的易读信息。其中name和description这两项分别包含了相应设备的名称和描述。取得网卡列表后就在屏幕上显示出来,如果网卡没有被发现就显示有关错误,pcap_findalldevs()同其他的libpcap函数一样有一个errbuf参数,当有异常情况发生时,这个参数会被pcap填充为某个特定的错误字串。程序功能示意如下:#include”pcap.h”main(){Pcap_if_t*alldevs://用于存储网卡信息Charerrbuf[PCAP_ERRBUF_SIZE]://用于存储错误信息if(pcap_findalldevs(&alldevs,errbuf)==-1//这个API用来获得本机网卡列表{fprintf(stderr,”Errorinpcap_findalldevs:%s\n,,,errbuf):exit(l);}…pcap_freealldevs(alldevs)://最后用pcap_freealldevs()释放内存资源5.2获得已安装的网络驱动器的高级信息前面的流程获得己存在网络适配器(网卡)的静态信息,实际上Winpcap同样也提供其他的高级信息,特别是pcap_findalldevs()这个函数返回的每个pcap_if结构体都同样包含一个pcap_addr结构的列表,内容包含:一个地址列表,一个掩码列表,一个广播地址列表和一个目的地址列表。通过一个ifprintO函数可以打印pcap_if结构的的所有字段信息,本课题的程序就采用了对每一个pcap_findalldevs()所返回的pcap_if结构循环调用ifprint()来显示详细的字段信息。5.3打开网卡准备捕获数据包获得网卡的信息后就可以按数据捕获的要求打开网卡。打开网卡的功能是通过pcap_open_live()来实现的。它的函数原型定义如下:pcap_t*pcap_open_live(char*deviee,intsnaplen,intpromise,intto_ms,char*ebuf)device:前面制定的监听设备接口;snaplen:制定pcap捕获的最大数目的网络数据包;promise:此参数大于0即指定deviee接口工作在混杂模式(promiseousMode)。前面表述过,在正常情况下网卡只接受去往它的包而去往其他主机的数据包则被忽略相反当网卡处于混杂模式时它将接收所有的流经它的数据包:这就意味着在共享介质的情况下可以捕获到其它主机的数据包。大部分的包捕获程序都将混杂模式设为默认;to_ms:此参数指定读数据的超时控制,超时以毫秒计算。当在超时时间内网卡上没有数据到来时对网卡的读操作将返回(如pcap_dispatch()orpcap_next_ex()等函数)。还有,如果网卡处于统计模式下to_ms还定义了统计的时间间隔。如果该参数为“O”那么意味着没有超时控制,对网卡的读操作在没有数据到来是将永远堵塞。如果为“一1”那么对网卡的读操作将立即返回不管有没有数据可读。ebuf:制定用来存储出错信息的字符串pcap_t:一:返回值为用于监听的pcap会话。5.4数据包的过滤设定通常一般人只对特定网络通信感兴趣。比如只想监听Telnet服务(port23)以捕获用户名和口令信息。或只对FTP(port21)或DNS(UDPport53)数据流感兴趣。这就要通过设置数据流过滤规则(filter)来实现。数据包过滤处理是监听技术中的难点和重点,winpcap或libpcap最强大的特点之一就是数据流的过滤引擎。它提供一种高效的方法来只捕获网络数据流的某些数据而且常常和系统的捕获机制相集成。过滤数据的函数是pcap_compile()和pcap_setfilter()来实现的。(l)pcap_compile()来编译一个过滤设备,它通过一个高层的布尔(boolean)型变量和字串产生一系列的能够被底层驱动所解释的二进制编码。boolean表示语法能够在这个件的过滤表示语法中找到。其函数原型如下:Intpcap_compile(pcap_t*p,structbpf_program*fp,char*str,intoptimize,bpf_u_32netmask)p:表示pcap会话句柄;fp:存放编译以后的规则;str:规则表达式格式的过滤规则(filter),同tepdump中的filter;optimize:制定优化选项:0false,1true;netmask:监听接口的网络掩码;返回值:一1表示操作失败,其他值表示成功。(2)pcap_setfilter()绑定一个过滤器到一个在核心驱动中的捕获进程中。一旦peap_setfilter()被调用,这个过滤器就会对网络来的所有数据包进行过滤,所有符合件的数据包(按照布尔表达式来计算出结果是真的数据包)都会被拷贝给进行捕获的用程序。其函数原型如下:Intpcap_setfilter(pcap_t*p,structbpf_rogram*fp)P:表示pcap的会话句柄;fp:表示经过编译后的过滤规则;返回值:一1表示操作失败,其他值表示成功。下面的代码展示了如何编译并设定一个过滤设备。注意必须从peap_if结构中获掩码,因为一些被pcap-compile()生成的过滤器的创建需要这个参数。下面的代码段的pcap_compile()的”ipandtcp”参数说明只有Ipv4和TCP数据才会被内核保存并被交到应用程序:…if(d一addresses!=NULL)//获得第一个接口地址的掩码netmask=oxfffffff;//编译过滤规则if(pcap_compile(adhandle,&fcode,”ipandt
本文标题:winpcap网络嗅探器开发
链接地址:https://www.777doc.com/doc-3396962 .html