winpcap网络嗅探器课程设计报告_第1页
winpcap网络嗅探器课程设计报告_第2页
winpcap网络嗅探器课程设计报告_第3页
winpcap网络嗅探器课程设计报告_第4页
winpcap网络嗅探器课程设计报告_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-.z.课程设计题目:基于WinPcap的网络嗅探器设计与实现专业班级:网络工程完成时间:2015年1月目录目录2一引言11.1编写目的11.2问题背景1二需求分析12.1需求规定12.1.1用户需求12.1.2功能需求12.1.3性能需求12.2开发平台1三概要设计13.1TCP/IP协议族和WinPcap简介13.1.1TCP协议族13.1.2WinPcap简介13.2系统总体分析与设计1系统总体结构分析与设计13.2.2系统总体流程1系统数据结构分析与设计1四系统详细设计与实现14.1数据捕获模块的设计与实现14.2协议解析模块的设计与实现14.3用户界面模块的设计与实现1控件写数据的基本操作14.3.2根据不同协议显示不同颜色1对数据格式化显示1五结语1六附录16.1参考文献16.2主要函数代码1-.z.一引言1.1编写目的本需求的编写是为了研究基于WinpCap网络嗅探(网络抓包)程序的开发途径和应用方法。同时它也是进行项目策划、概要设计和详细设计的基础,是维护人员进行部维护,信息更新,验收和测试的依据,是用户操作说明的指导文档,是开发人员和用户交互的良好界面。1.2问题背景随着网络技术的飞速发展,加速了全球信息化的进程,各种重要数据在网上的传播日益普遍,使得网络安全问题越来越为人们所关注。网络嗅探(网络抓包)工具作为一种网络数据监听程序,在网络安全攻防方面扮演了很重要的角色,目前已经有不少网络嗅探(网络抓包)工具,譬如在Windows环境下,最富盛名的工具是Net*ray、WireShark(原Ethereal)。网络嗅探(网络抓包)工具实际上是一把双刃剑,通过使用网络嗅探(网络抓包)工具,可以把网卡设置于混杂模式,并可实现对网络上传输的数据包的捕获与分析,此分析结果可供网络安全分析之用,也可为黑客发动进一步的攻击提供有价值的信息。而在网络安全方面,目前使用最广泛的TCP/IP协议存在许多安全缺陷,网络嗅探(网络抓包)工具可以有效地探测在网络上传输的数据包信息,通过对这些信息的分析是有助于网络安全维护的。根据《网络安全技术发展分析》一文中的数据,2007年以来网络监听技术出现了新额重要特征,传统的Sniffer技术是被动地监听网络通信、用户名和口令,而新的Sniffer技术则主动地控制通信数据。我们通过对网络嗅探(网络抓包)工具的数据包的捕获与分析功能的进一步了解,才能做到知己知彼,有针对性地获取所需要的信息,利用这些信息进行网络安全分析的网络威胁应对。因此对网络嗅探(网络抓包)技术的研究具有重要的意义。计算机网络的设计为嗅探器的使用创造了最基本的条件。在目前的网络环境中,所有计算机节点都是共享传输介质,任意节点发出或发往任意节点的数据帧必将经过网每一个节点的网络接口,此时只需对嗅探节点的网络接口(网卡)进行适当的设置便可为实现嗅探的做好准备工作。在计算机网络系统中,网卡是用来接收网络上其他节点发来的数据帧,其嵌的单片处理程序会检测数据帧来源的MAC地址,并根据网卡所设置的接收方式来是否接收处理数据,如果认为应该处理,则网卡就会产生中断信号通知中央处理器,接收该数据帧并传输给操作系统处理。否则就简单丢弃,所对应节点的网卡就截断,计算机的中央处理器并不参与。网卡是网络中节点主机的关键硬件设备。对数据的接收一般有四种设置模式:广播模式:接收在网络中进行广播数据信息。组播模式:接收组播数据信息。单播模式:只有匹配的目的网卡才能接收数据信息。混杂模式:网卡能够可以接收一切通过它的数据信息。二需求分析2.1需求规定2.1.1用户需求网络嗅探(网络抓包)是一种利用计算机的网络接口截获其它计算机数据报文的工具。使用网络嗅探(网络抓包)工具的主要人群是黑客或网络安全技术人员,从攻击的角度,黑客可以使用网络嗅探(网络抓包)程序非法获取网络中传输的大量敏感信息,如账号和口令等,对网路安全极具威胁;从防守的角度,网络嗅探(网络抓包)技术是居于网络的入侵检测系统的最底层环节,是整个系统的数据来源,为技术人员提供重要的依据。无论是黑客还是安全人员,他们对抓包技术的利用途径都是一样的,即对网络上传输的数据包进行捕获与分析,获取不要的信息,但是他们的目的是不一样的,前者是专门利用计算机网络搞破坏或恶作剧,而后者是通过对这些信息的分析利用。维护网络安全与稳定。因此用户提出了以下要求:(1)能够捕获网络数据包,并能对数据包进行简单的分析。(2)精确的设置捕捉规则和灵活的过滤策略,能使用户方便、准确地捕获所需要的信息。(3)界面友好,操作简单。2.1.2功能需求尽管网络嗅探(网络抓包)工具作为网络安全方面最常见的工具被广泛使用,但是它的基本原理其实很简单,就是先把同卡设备设为混杂模式,然后直接接收链路层的数据。为了实现用户所提出的各种需求,抓包工具必需达到以下功能:(1)运行于数据链路层,监视网络状态,对数据帧进行捕捉和统计,为优化网络性能、增强系统安全性提供充分有效的依据。此时的工作网卡处于混杂模式。(2)能够对网络中捕捉的数据包解码,用于故障分析。如数据包的编号、长度、硬件地址类型、协议地址类型、MAC地址长度、IP地址长度、操作代码、发送者硬件地址、目标硬件地址、源IP、目的IP等相关信息。(3)友好的图形化界面,不需要复杂的命令,大部分功能通过鼠标点击就可达到,操作简单、方便。(4)用户能够自定义过滤规则,使数据包的捕获更加精准和具有灵活性,增强了软件功能以及与用户的交互能力。2.1.3性能需求一个程序除了能正常运行并且达到相应的功能外,对程序性能也有严格的要求,性能需求决定了整个系统的性能档次、所采用的技术和设备档次,本程序除了达到常用软件对响应时间以及差错控制的要求外,还提出以下要求:(1)数据精确性:捕获到的数据包并不仅仅是单纯的数据信息,而是包含有IP头、TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌,为分析网络信息提供了重要资料。(2)适应围:优秀的抓包工具能够分析几百种协议。一般情况下,大多数的抓包工具至少能够分析下面的协议:IP、TCP、UDP、ICMP、ARP等。2.2开发平台开发平台:Windows7开发语言:C++集成开发环境:VisualStudio2010辅助开发工具:WinPcap开发包()三概要设计3.1TCP/IP协议族和WinPcap简介本系统使用的开发包WinPcap是Windows平台下的专业网络数据包捕获开发包。3.1.1TCP协议族TCP协议和IP协议指两个用在Internet上的网络协议(或数据传输的方法)。它们分别是传输控制协议和互联网协议。这两个协议属于众多的TCP/IP协议族的一部分。在TCP/IP协议族中,有很多种协议。图2-1给出了TCP/IP协议族中不同层次的协议。图2-1TCP/IP协议族中不同层次的协议TCP数据报格式传输控制协议TCP(transmissioncontrolprotocol)是专门用于在不可靠的因特网上提供可靠的、端到端的字节流通信协议。TCP虽然是面向字节流的,但TCP传送的数据单元却是报文段。一个TCP报文段分为首部和数据两部分,而TCP的全部功能都体现在它首部中各字段的作用。图2-2给出了TCP报文段的首部格式。图2-2TCP报文段的首部格式(2)UDP数据报格式用户数据报UDP有两个字段:数据字段和首部字段。首部字段很简单,只有8个字节(图2-3),由四个字段组成,每个字段的长度都是两个字节。图2-3UDP用户数据报的首部和伪首部(3)IP数据报格式IP是TCP/IP协议族中最为核心的协议。所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。图2-4是IP数据报的完整格式。图2-4IP数据报格式(4)ICMP数据报格式ICMP报文是在IP数据报部被传输的。ICMP报文的格式如图2-5所示。所有的报文的前4个字节都是一样的,但是剩下的其他字节则互不相同。类型字段可以有15个不同的值,以描述特定类型的ICMP报文。*些ICMP报文还使用代码字段的值来进一步描述不同的条件。检验和字段覆盖整个ICMP报文。图2-5ICMP报文格式(5)ARP数据报格式在以太网上解析IP地址时,ARP请求和应答分组的格式如图2-6所示(ARP可以用于其他类型的网络,可以解析IP地址以外的地址。紧跟着帧类型字段的前四个字段指定了最后四个字段的类型和长度)。图2-6用于以太网的ARP请求或应答分组格式3.1.2WinPcap简介WinPcap(WindowsPacketCapture)是Windows平台下一个免费,公共的网络访问系统。是Libpcap在Windows平台下的版本,针对Windows进行了优化处理和扩展。WinPcap驱动有如下功能:1、捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交换的数据WinPcap结构包。2、在数据包发往应用程序之前,按照自定义的规则将*些特殊的数据包过滤掉。3、在网络上发送原始的数据包。4、收集网络通信工程中的统计信息。WinPcap的主要功能在于独立于主机协议(如TCP/IP)而发送和接收原始数据包。也就是说,WinPcap不能阻塞、过滤或控制其他应用程序数据包的发收,它仅仅只是监听共享网络上传送的数据包。WinPcap提供给用户两个不同级别的编程接口:一个基于Libpcap的wpcap.dll,另一个是较底层的packet.dll。WinPcap的配置过程如下(以MicrosoftVisualC++6.0为例):1、添加头文件目录:工具选项目录Includefiles添加…\WpdPack\Include目录。2、添加库文件目录:工具选项目录Libraryfiles添加…\WpdPack\Lib目录。3、添加预处理定义WPCAP和HAVE_REMOTE:工程设置C/C++预处理程序定义添加WPCAP和HAVE_REMOTE。4、添加wpcap.lib库函数:工程设置连接对象/库模块添加wpcap.lib。5、添加pcap.h头文件在每个使用了WinPcap函数的源文件中添加pcap.h。3.2系统总体分析与设计在以太网中,信息是以明文的形式在网络上传输的,当将网络适配器设置为混杂模式时,由于采用以太网广播信道争用的方式,使得监听系统与正常通信的网络能够并联连接,并可以捕获任何一个在同一冲突域上传输的数据包。运用这一原理使信息捕获系统能够拦截我们所要的信息,这是捕获数据包的物理基础。首先抓包系统必须绕过操作系统的协议栈来访问在网络上传输的原始数据包。WinPcap提供了两个不同的库:packet.dll和wpcap.dll。wpcap.dll提供了更加友好、功能更加强大的函数调用。系统总体结构分析与设计本系统基于WinPcap捕获和分析网络数据包的思想和方法进行设计,整体结构按功能分为3个部分,分别是数据捕获模块、协议解析模块和用户显示模块。系统的总体结构如图2-7所示。网络嗅探器网络嗅探器用户界面协议解析模块数据捕获模块用户界面协议解析模块数据捕获模块图2-7系统的总体结构3.2.2系统总体流程用户可以根据需要选择指定的检测网卡,对要侦听的报文类型、IP地址和传输方向进行设置(即过滤设置)。捕获后系统简要显示每个报文的标识,源、目的地址,长度和类型信息。当选中一报文时,系统显示该报文的结构解析树和完整十六进制信息。系统总体流程如图2-8所示。开始开始得到网卡句柄得到网卡句柄选择监听的网卡选择监听的网卡设置过滤器设置过滤器选择数据包选择数据包定位、初始化定位、初始化打开网卡打开网卡接受并显示数据接受并显示数据分析数据包分析数据包释放设备、缓冲区释放设备、缓冲区结束结束图2-8系统总体流程系统数据结构分析与设计系统每捕获到一个数据包,就要对数据包进行协议解析。解析过程需要构造相应类型的报文对象。系统基于对TCP/IP协议族数据报格式的分析,对各个报文类都有详细的描述。(1)pcap抓到都是数据链路层的数据包(即以太帧),要对数据包进行协议分析,首先要构造以太帧头部对象。以太帧头部的类描述如下://Mac帧头占14个字节structethhdr{ u_chardest[6]; //6个字节目标地址u_charsrc[6]; //6个字节源地址u_shorttype; //2个字节类型};(2)以太帧的数据部分可能是ARP数据报或者是IP数据报等等。系统在对其进行进一步的协议解析的过程中,就要根据以太帧头部的类型字段进行构造相应类型的数据报对象。IP数据报的描述如下://定义IP头structiphdr{*ifdefined(LITTLE_ENDIAN) u_charihl:4;u_charversion:4;*elifdefined(BIG_ENDIAN) u_charversion:4; u_charihl:4;*endif u_chartos; //TOS服务类型u_shorttlen; //包总长u_short占两个字节u_shortid; //标识u_shortfrag_off; //片位移u_charttl; //生存时间u_charproto; //协议u_shortcheck; //校验和u_intsaddr; //源地址u_intdaddr; //目的地址u_int op_pad; //选项等};ARP数据报的描述如下://ARP头structarphdr{ u_shortar_hrd; //硬件类型u_shortar_pro; //协议类型u_charar_hln; //硬件地址长度u_charar_pln; //协议地址长度u_shortar_op; //操作码,1为请求2为回复u_charar_srcmac[6]; //发送方MAC u_charar_srcip[4]; //发送方IP u_charar_destmac[6]; //接收方MAC u_charar_destip[4]; //接收方IP};(3)对IP数据报的数据部分分析可能的情况:TCP数据报、UDP数据报和ICMP数据报等。系统在进行协议解析时要根据IP数据报的协议字段进行构造对应类型的数据报对象。TCP数据报的描述如下://定义TCP头structtcphdr{ u_shortsport; //源端口地址16位u_shortdport; //目的端口地址16位u_intseq; //序列号32位u_intack_seq; //确认序列号*ifdefined(LITTLE_ENDIAN) u_shortres1:4, doff:4, fin:1, syn:1, rst:1, psh:1, ack:1, urg:1, ece:1, cwr:1;*elifdefined(BIG_ENDIAN) u_shortdoff:4, res1:4, cwr:1, ece:1, urg:1, ack:1, psh:1, rst:1, syn:1, fin:1;*endif u_shortwindow; //窗口大小16位u_shortcheck; //校验和16位u_shorturg_ptr; //紧急指针16位u_intopt; //选项};UDP数据报的描述如下://定义UDP头structudphdr{ u_shortsport; //源端口16位u_shortdport; //目的端口16位u_shortlen; //数据报长度16位u_shortcheck; //校验和16位};ICMP数据报的描述如下://定义ICMPstructicmphdr{ u_chartype; //8位类型u_charcode; //8位代码u_charseq; //序列号8位u_charchksum; //8位校验和};四系统详细设计与实现4.1数据捕获模块的设计与实现数据捕获模块的主要功能是进行数据采集,这是整个系统的基础和数据来源。系统使用WinPcap来捕获网络中的原始数据包。系统首先调用pcap_findalldevs()函数,初始化网卡选择界面,用户选择要检测的网卡、设置好过滤条件并单击”开始”菜单项(或工具栏项)后,系统调用pcap_open_live()函数将网卡设置为混杂模式。接下来,系统调用pcap_loop()函数,循环捕获网络数据包。每捕获一个数据包就调用设计好的回调函数来检测数据包是否符合过滤条件,符合就给显示界面发送信息,通知其显示数据包信息。一旦用户单击”停止”菜单项(或工具栏项),系统就调用pcap_close()函数,关闭Winpcap操作,并销毁相应资源。数据捕获主要代码如下://开始捕获intCMy44174413snifferDlg::My44174413sniffer_startCap(){ intif_inde*,filter_inde*,count; u_intnetmask; structbpf_programfcode; My44174413sniffer_initCap(); //获得接口和过滤器索引if_inde*=this->m_boBo*.GetCurSel(); filter_inde*=this->m_boBo*Rule.GetCurSel();if(0==if_inde*||CB_ERR==if_inde*) { MessageBo*(_T("请选择一个合适的网卡接口")); return-1; } if(CB_ERR==filter_inde*) { MessageBo*(_T("过滤器选择错误")); return-1; } /*获得选中的网卡接口*/ dev=alldev; for(count=0;count<if_inde*-1;count++) dev=dev->ne*t; if((adhandle=pcap_open_live(dev->name, //设备名65536, //捕获数据包长度1, //混杂模式(非0意味着是混杂模式) 1000, //读超时设置errbuf //错误信息))==NULL) { MessageBo*(_T("无法打开接口:"+CString(dev->description))); pcap_freealldevs(alldev); return-1; }4.2协议解析模块的设计与实现由于pcap每次抓到一个数据包,都会提交其信息,方式为以unsignedchar*指向的一段缓冲区。现将缓冲区前14个字节读入,按以太帧格式构造以太帧头部的对象。然后根据以太帧头部中的Type字段,决定接下来应该构造IP、ARP或者RARP。假设是IP,则把缓冲区中第15个字节开始直到这块缓冲区最后的所以字节读入,按IP报文格式构造IP的对象,根据IP的Protocol字段,决定接下来构造TCP,UDP还是ICMP。假设是TCP,则将IP的数据容读入,按TCP格式构造TCP的对象。系统首先显示捕获的数据包的简要信息,若用户对该数据包感兴趣,只要单击选中该数据包,系统就会显示该数据包的详细信息。若数据包中是IP数据报,则简要显示该数据包的主要代码如下:if(0*0800==local_data->ethh->type){ //IP HTREEITEMip=this->m_treeCtrl.InsertItem(_T("IP协议头"),data); str.Format(_T("版本:%d"),local_data->iph->version); this->m_treeCtrl.InsertItem(str,ip); str.Format(_T("IP头长:%d"),local_data->iph->ihl); this->m_treeCtrl.InsertItem(str,ip); str.Format(_T("服务类型:%d"),local_data->iph->tos); this->m_treeCtrl.InsertItem(str,ip); str.Format(_T("总长度:%d"),local_data->iph->tlen); this->m_treeCtrl.InsertItem(str,ip); str.Format(_T("标识:0*%02*"),local_data->iph->id); this->m_treeCtrl.InsertItem(str,ip); str.Format(_T("段偏移:%d"),local_data->iph->frag_off); this->m_treeCtrl.InsertItem(str,ip); str.Format(_T("生存期:%d"),local_data->iph->ttl); this->m_treeCtrl.InsertItem(str,ip); str.Format(_T("协议:%d"),local_data->iph->proto); this->m_treeCtrl.InsertItem(str,ip); str.Format(_T("头部校验和:0*%02*"),local_data->iph->check); this->m_treeCtrl.InsertItem(str,ip); str.Format(_T("源IP:")); structin_addrin; in.S_un.S_addr=local_data->iph->saddr; str.AppendFormat(CString(inet_ntoa(in))); this->m_treeCtrl.InsertItem(str,ip); str.Format(_T("目的IP:")); in.S_un.S_addr=local_data->iph->daddr; str.AppendFormat(CString(inet_ntoa(in))); this->m_treeCtrl.InsertItem(str,ip);解析数据包主要通过analyze_frame()这个函数实现的,实际上并非这个函数完成了所有的功能,其实从名字就可以看出,它只是完成了对“帧”的解析,也就是链路层数据的解析,还有analyze_arp()、analyze_ip()、analyze_ip6()、analyze_icmp()……等来完成其他协议层的解析工作。需要特别说明的一点是,网络中的字节顺序跟主机中的字节顺序是完全不一样的,所以特别是要获得数字的值的时候,一定要先调用ntohs()函数(networktohostshort)或ntohl()函数(networktohostlong)将数据包的网络字节顺转换为主机字节序,这样在做一些判断的时候才是准确的。由协议栈工作流程可知,数据是由应用层把数据加上应用层协议头后给传输层,传输层在最外面加上它的头部后给网络层,网络层在外面加上它的头部后再给链路层……所以当数据包被捕获到之后最外面的就是链路层的协议头,因此首先要解析的就是链路层协议,这也就是为什么首先要调用analyze_frame()这个函数了,然后再一层一层把它“剥开”,最终获得里面的数据。每一层的上层可能有多种协议在工作,比如IP上层就有TCP和UDP等之分,所以在解析数据包的时候需要根据不同的特征来判断上层协议到底是什么,然后再来调用相关的函数对其进行解析,下面将列出一些主要的判断特征:(1)链路层--网络层网络层可能会有arp、ipv4、ipv6这三种不同的情况,在链路层定义了一个type字段,专门用于指示网络层数据包是什么类型。type==0*0806表示这是一个arp包type==0*0800表示这是一个ipv4包type==0*86dd表示这是一个ipv6包(2)网络层(IP层)--传输层IP层之上可能会有tcp、udp、icmp等IPv4协议定义了proto字段来指示传输层协议是什么。还记得上一章的Protocol.h文件中的这段定义不?proto什么值对应什么协议很明白了吧?*definePROTO_ICMP1*definePROTO_TCP6*definePROTO_UDP17IPv6使用nh字段来标明传输层协议,如下:nh==0*3a表示上层是icmpv6nh==0*06表示上层是tcpnh==0*11表示上层是udp(3)传输层之上就是应用层了,这里我们的应用层只支持http协议,判断方法很简单,就是看目的或源端口是不是80。余下的工作就是一个字段一个字段地获取数据包的值了。4.3用户界面模块的设计与实现用户设计界面如图4-1所示:图4-1设计界面要写在GUI上的数据主要有五个部分:(1)参数设置:网卡接口、过滤项(2)数据包捕获列表,显示数据包简要信息(3)树形目录,显示被选中的数据详细信息(4)文本框,显示被选中的数据包十六进制信息(5)统计信息:各类包的数量控件写数据的基本操作由于我们选择的是对话框的形式的界面,所以主界面只有一个,放置在主界面上的各个控件都可以通过主界面的this指针调用,并设置控件的值,例如:this->m_listCtrl.SetItemTe*t(nItem,2,buf);其中m_listCtrl是放置于主界面上的一个列表控件,各种控件上的数据也就基本通过这样的方式调用。程序中我们新开了一个线程来处理数据,线程中每收到一个数据包都需要更新一下界面,这样就可以实时看到捕获的数据及统计信息了,这需要我们把主界面的this指针传递给线程,如下:m_ThreadHandle=CreateThread(NULL,0,sinffer_CapThread,this,0,threadCap);线程处理函数原型如下:DWORDWINAPIsinffer_CapThread(LPVOIDlpParameter);这里的lpParameter就是刚刚传递进来的this指针了,在函数中使用如下:Cmcf6Dlg*pthis=(Cmcf6Dlg*)lpParameter;4.3.2根据不同协议显示不同颜色从图4-2可以看到,List控件有一个事件是NM_CUSTOMDRAW,每次有新的一行加入的时候,都触发该事件,然后调用相关的处理函数进行自定义绘制,可以注册一个该事件。图4-2首先通过下面这段代码获得新加入到List列表中的数据位置POSITIONpos=this->m_localDataList.FindInde*(pNMCD->nmcd.dwItemSpec);然后通过下面代码获得新加入行中存储的数据structdatapkt*local_data=(structdatapkt*)this->m_localDataList.GetAt(pos);最后根据数据中对应的协议设置不同的显示颜色。这样,一个界面友好的列表就设置好了。对数据格式化显示主要通过下面这个函数实现,下面这个函数主要做了两件事:(1)将数据是16进制的形式显示;(2)将数据以字符形式显示。voidprint_packet_he*(constu_char*pkt,intsize_pkt,CString*buf){ inti=0,j=0,rowcount; u_charch; chartempbuf[256]; memset(tempbuf,0,256); for(i=0;i<size_pkt;i+=16) { buf->AppendFormat(_T("%04*:"),(u_int)i); rowcount=(size_pkt-i)>16"16:(size_pkt-i); for(j=0;j<rowcount;j++) buf->AppendFormat(_T("%02*"),(u_int)pkt[i+j]); //不足16,用空格补足if(rowcount<16) for(j=rowcount;j<16;j++) buf->AppendFormat(_T("")); for(j=0;j<rowcount;j++) {ch=pkt[i+j];ch=isprint(ch)"ch:'.'; buf->AppendFormat(_T("%c"),ch); } buf->Append(_T("\r\n")); if(rowcount<16) return; }}选中报文时运行效果如图4-3所示。图4-3运行界面五结语本次程序是在WinPcap库的基础上对网络数据进行捕获,不需要编写复杂的设备驱动程序和代码就可以实现抓包,使得其编写过程比较简便、有效率。从选择抓包程序,到查阅资料,思考课题的解决的方案,再到程序的实现,是一个集中学习的过程,是一个灵活运用知识的过程,是一个由量变到质变的过程。感觉到自己进步了,感觉到自己学到一些东西了,感觉到自己求知的态度了。在编写程序的过程中,我每每为自己的一些新的感悟而欣喜,为排除每一个错误而兴奋。编程序需要功夫,调试程序更需要有耐心和技巧。期间,我不断地拓展自己的思路,尽可能地为程序添加新的功能,当然,这中间是少不了错误的发生的。也正是在编写一调试一再编写的过程中,我理解了MFC框架机制,知道了如何在程序中添加自己的代码,如何自定义自己的消息,如何实现多线程的运行。就最终的成果而言,程序实现了抓包的基本功能,通过对过滤条件的设置,实现了对特定源和目的IP地址、端口的数据包的捕获,并显示数据包的容,诸如协议类型、长度、时间戳等信息等。随着网络技术的迅猛发展,网络安全将被人们越来越重视,抓包技术作为网络安全攻防中最基础的技术,抓包工具的发展将向着集成化和易用型发展这两个方向发展,我相信这也是绝大部分软件的发展趋势。网络安全是我们绝大部分人必须警惕关注的一个问题,当今社会信息流通量越来越大,高科技人才也越来越多,高频率的网络犯罪让人们防不胜防。我们不但要正确使用抓包工具.还要合理防抓包工具的危害。抓包工具能够造成很大的安全危害,主要是因为它们不容易被发现。鉴于目前的网络安全现状,我们应该进一步挖掘网络监听技术的细节,从技术基础上掌握先机,才能在与入侵者的斗争中取得胜利。六附录6.1参考文献[1]小特,王勇军.基于WinPcap的捕包程序设计[J].软件导刊.2007,(21)[2]TheWinPcapTeam.WinPcap中文技术文档[J/OL].2007. .ferris*u./WinPcap/html/inde*.html[3]辉,叶子青•VisualC++系统开发实例精粹[M]•:人民邮电,2005[4]吴功宜,董大凡,王珺等.计算机网络高级软件编程技术[M]•:清华大学,20086.2主要函数代码//初始化winpcapintCMy44174413snifferDlg::My44174413sniffer_initCap(){ devCount=0; if(pcap_findalldevs(&alldev,errbuf)==-1) return-1; for(dev=alldev;dev;dev=dev->ne*t) devCount++; return0;}DWORDWINAPIsniffer_CapThread(LPVOIDlpParameter){ intres,nItem; structtm*ltime; CStringtimestr,buf,srcMac,destMac; time_tlocal_tv_sec; structpcap_pkthdr*header; //数据constu_char*pkt_data=NULL,*pData=NULL;//网络中收到的字节流数据u_char*ppkt_data; CMy44174413snifferDlg*pthis=(CMy44174413snifferDlg*)lpParameter; if(NULL==pthis->m_ThreadHandle) { MessageBo*(NULL,_T("线程句柄错误"),_T("提示"),MB_OK); return-1; } while((res=pcap_ne*t_e*(pthis->adhandle,&header,&pkt_data))>=0) { if(res==0) //超时continue; structdatapkt*data=(structdatapkt*)malloc(sizeof(structdatapkt)); memset(data,0,sizeof(structdatapkt)); if(NULL==data) { MessageBo*(NULL,_T("空间已满,无法接收新的数据包"),_T("Error"),MB_OK); return-1; } //分析出错或所接收数据包不在处理围if(analyze_frame(pkt_data,data,&(pthis->npacket))<0) continue; //将数据包保存到打开的文件中if(pthis->dumpfile!=NULL) { pcap_dump((unsignedchar*)pthis->dumpfile,header,pkt_data); } //更新各类数据包计数pthis->My44174413sniffer_updateNPacket(); //将本地化后的数据装入一个链表中,以便后来使用ppkt_data=(u_char*)malloc(header->len); memcpy(ppkt_data,pkt_data,header->len); pthis->m_localDataList.AddTail(data); pthis->m_netDataList.AddTail(ppkt_data); /*预处理,获得时间、长度*/ data->len=header->len; //链路中收到的数据长度local_tv_sec=header->ts.tv_sec; ltime=localtime(&local_tv_sec); data->time[0]=ltime->tm_year+1900; data->time[1]=ltime->tm_mon+1; data->time[2]=ltime->tm_mday; data->time[3]=ltime->tm_hour; data->time[4]=ltime->tm_min; data->time[5]=ltime->tm_sec; /*为新接收到的数据包在listControl中新建一个item*/ buf.Format(_T("%d"),pthis->npkt); nItem=pthis->m_listCtrl.InsertItem(pthis->npkt,buf); /*显示时间戳*/ timestr.Format(_T("%d/%d/%d%d:%d:%d"),data->time[0], data->time[1],data->time[2],data->time[3],data->time[4],data->time[5]); pthis->m_listCtrl.SetItemTe*t(nItem,1,timestr); //pthis->m_listCtrl.setitem /*显示长度*/ buf.Empty(); buf.Format(_T("%d"),data->len); pthis->m_listCtrl.SetItemTe*t(nItem,2,buf); /*显示源MAC*/ buf.Empty(); buf.Format(_T("%02*-%02*-%02*-%02*-%02*-%02*"),data->ethh->src[0],data->ethh->src[1], data->ethh->src[2],data->ethh->src[3],data->ethh->src[4],data->ethh->src[5]); pthis->m_listCtrl.SetItemTe*t(nItem,3,buf); /*显示目的MAC*/ buf.Empty(); buf.Format(_T("%02*-%02*-%02*-%02*-%02*-%02*"),data->ethh->dest[0],data->ethh->dest[1], data->ethh->dest[2],data->ethh->dest[3],data->ethh->dest[4],data->ethh->dest[5]); pthis->m_listCtrl.SetItemTe*t(nItem,4,buf); /*获得协议*/ pthis->m_listCtrl.SetItemTe*t(nItem,5,CString(data->pktType)); /*获得源IP*/ buf.Empty(); if(0*0806==data->ethh->type) { buf.Format(_T("%d.%d.%d.%d"),data->arph->ar_srcip[0], data->arph->ar_srcip[1],data->arph->ar_srcip[2],data->arph->ar_srcip[3]); }elseif(0*0800==data->ethh->type){ structin_addrin; in.S_un.S_addr=data->iph->saddr; buf=CString(inet_ntoa(in)); }elseif(0*86dd==data->ethh->type){ intn; for(n=0;n<8;n++) { if(n<=6) buf.AppendFormat(_T("%02*:"),data->iph6->saddr[n]); else buf.AppendFormat(_T("%02*"),data->iph6->saddr[n]); } } pthis->m_listCtrl.SetItemTe*t(nItem,6,buf); /*获得目的IP*/ buf.Empty(); if(0*0806==data->ethh->type) { buf.Format(_T("%d.%d.%d.%d"),data->arph->ar_destip[0], data->arph->ar_destip[1],data->arph->ar_destip[2],data->arph->ar_destip[3]); }elseif(0*0800==data->ethh->type){ structin_addrin; in.S_un.S_addr=data->iph->daddr; buf=CString(inet_ntoa(in)); }elseif(0*86dd==data->ethh->type){ intn; for(n=0;n<8;n++) { if(n<=6) buf.AppendFormat(_T("%02*:"),data->iph6->daddr[n]); else buf.AppendFormat(_T("%02*"),data->iph6->daddr[n]); } } pthis->m_listCtrl.SetItemTe*t(nItem,7,buf); /*对包计数*/ pthis->npkt++; } return1;}/*设置数据包存储路径*/ CFileFindfile; charthistime[30]; structtm*ltime; memset(filepath,0,512); memset(filename,0,64); if(!file.FindFile(_T("SavedData"))) { CreateDirectory(_T("SavedData"),NULL); } time_tnowtime; time(&nowtime); ltime=localtime(&nowtime); strftime(thistime,sizeof(thistime),"%Y%m%d%H%M%S",ltime); strcpy(fi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论