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

下载本文档

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

文档简介

1、课程设计题 目:基于WinPcap的网络嗅探器设计与实现专业班级:网络工程完成时间:2015年1月目录目录2一弓I言11.1 编写目的11.2 问题背景1二需求分析32.1 需求规定32.1.1 用户需求32.1.2 功能需求42.1.3 性能需求42.2 开发平台5三概要设计63.1 TCP/IP协议族和 WinPcap简介 63.1.1 TCP 协议族63.1.2 WinPcap 简介93.2 系统总体分析与设计.1 系统总体结构分析与设计 .2 系统总体流程 系统数据结构分析与设计1.2.四 系统详细设计与实现 184.1 数据捕获模块的设计与

2、实现 协议解析模块的设计与实现 2Q.4.3 用户界面模块的设计与实现 控件写数据的基本操作 根据不同协议显示不同颜色 对数据格式化显示 27.五结语30六附录326.1 参考文献326.2 主要函数代码32Word资料一引言1.1 编写目的本需求的编写是为了研究基于 WinpCap网络嗅探(网络抓包)程序的开发 途径和应用方法。同时它也是进行项目策划、概要设计和详细设计的基础,是维 护人员进行部维护,信息更新,验收和测试的依据,是用户操作说明的指导文档, 是开发人员和用户交互的良好界面。1.2 问题背景随着网络技术的飞速发展,

3、加速了全球信息化的进程,各种重要数据在网上 的传播日益普遍,使得网络安全问题越来越为人们所关注。 网络嗅探(网络抓包) 工具作为一种网络数据监听程序,在网络安全攻防方面扮演了很重要的角色,目前已经有不少网络嗅探(网络抓包)工具,譬如在 Windows环境下,最富盛名 的工具是Netxray、WireShark (原Ethereal)。网络嗅探(网络抓包)工具实际 上是一把双刃剑,通过使用网络嗅探(网络抓包)工具,可以把网卡设置于混杂 模式,并可实现对网络上传输的数据包的捕获与分析,此分析结果可供网络安全分析之用,也可为黑客发动进一步的攻击提供有价值的信息。而在网络安全方面, 目前使用最广泛的T

4、CP/IP协议存在许多安全缺陷,网络嗅探(网络抓包)工具 可以有效地探测在网络上传输的数据包信息,通过对这些信息的分析是有助于网络安全维护的。根据网络安全技术发展分析一文中的数据,2007年以来网络监听技术出现了新额重要特征,传统的 Sniffer技术是被动地监听网络通信、用户名和口令,而新的Sniffer技术则主动地控制通信数据。我们通过对网络嗅探(网络抓包)工具的数据包的捕获与分析功能的进一步了解, 才能做到知己知彼,有针对 性地获取所需要的信息,利用这些信息进行网络安全分析的网络威胁应对。因此 对网络嗅探(网络抓包)技术的研究具有重要的意义。计算机网络的设计为嗅探器的使用创造了最基本的条

5、件。在目前的网络环境中,所有计算机节点都是共享传输介质,任意节点发出或发往任意节点的数据帧 必将经过网每一个节点的网络接口,此时只需对嗅探节点的网络接口(网卡)进行适当的设置便可为实现嗅探的做好准备工作。在计算机网络系统中,网卡是用 来接收网络上其他节点发来的数据帧,其嵌的单片处理程序会检测数据帧来源的 MAC地址,并根据网卡所设置的接收方式来是否接收处理数据,如果认为应该 处理,则网卡就会产生中断信号通知中央处理器,接收该数据帧并传输给操作系统处理。否则就简单丢弃,所对应节点的网卡就截断,计算机的中央处理器并不 参与。网卡是网络中节点主机的关键硬件设备。 对数据的接收一般有四种设置模式 广播

6、模式:接收在网络中进行广播数据信息。组播模式:接收组播数据信息。单 播模式:只有匹配的目的网卡才能接收数据信息。混杂模式 :网卡能够可以接收 一切通过它的数据信息。二需求分析2.1 需求规定2.1.1 用户需求网络嗅探(网络抓包)是一种利用计算机的网络接口截获其它计算机数据报 文的工具。使用网络嗅探(网络抓包)工具的主要人群是黑客或网络安全技术人 员,从攻击的角度,黑客可以使用网络嗅探(网络抓包)程序非法获取网络中传 输的大量敏感信息,如账号和口令等,对网路安全极具威胁;从防守的角度,网 络嗅探(网络抓包)技术是居于网络的入侵检测系统的最底层环节,是整个系统的数据来源,为技术人员提供重要的依据

7、。无论是黑客还是安全人员,他们对抓 包技术的利用途径都是一样的,即对网络上传输的数据包进行捕获与分析, 获取 不要的信息,但是他们的目的是不一样的,前者是专门利用计算机网络搞破坏或 恶作剧,而后者是通过对这些信息的分析利用。 维护网络安全与稳定。因此用户 提出了以下要求:(1)能够捕获网络数据包,并能对数据包进行简单的分析。(2)精确的设置捕捉规则和灵活的过滤策略,能使用户方便、准确地捕获所 需要的信息。(3)界面友好,操作简单。2.1.2 功能需求尽管网络嗅探(网络抓包)工具作为网络安全方面最常见的工具被广泛使用, 但是它的基本原理其实很简单,就是先把同卡设备设为混杂模式,然后直接接收 链路

8、层的数据。为了实现用户所提出的各种需求,抓包工具必需达到以下功能:(1)运行于数据链路层,监视网络状态,对数据帧进行捕捉和统计,为优化 网络性能、增强系统安全性提供充分有效的依据。此时的工作网卡处于混杂模式。(2)能够对网络中捕捉的数据包解码,用于故障分析。如数据包的编号、长度、硬件地址类型、协议地址类型、MAC地址长度、IP地址长度、操作代码、发送者硬件地址、目标硬件地址、源IP、目的IP等相关信息。(3)友好的图形化界面,不需要复杂的命令,大部分功能通过鼠标点击就可达到,操作简单、方便。(4)用户能够自定义过滤规则,使数据包的捕获更加精准和具有灵活性,增 强了软件功能以及与用户的交互能力。

9、2.1.3 性能需求一个程序除了能正常运行并且达到相应的功能外,对程序性能也有严格的要求,性能需求决定了整个系统的性能档次、 所采用的技术和设备档次,本程序除 了达到常用软件对响应时间以及差错控制的要求外,还提出以下要求:(1)数据精确性:捕获到的数据包并不仅仅是单纯的数据信息, 而是包含有IP 头、TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原 貌,为分析网络信息提供了重要资料。(2)适应围:优秀的抓包工具能够分析几百种协议。一般情况下,大多数的抓包工具至少能够分析下面的协议:IP、TCP、UDP、ICMP、ARP等。2.2 开发平台开发平台:Windows 7开发语言

10、:C+集成开发环境:Visual Studio 2010辅助开发工具: WinPcap开发包(WinPcap 4.0.2)Word资料三概要设计3.1 TCP/IP协议族和 WinPcap简介本系统使用的开发包 WinPcap是Windows平台下的专业网络数据包捕获开 发包。3.1.1 TCP协议族TCP协议和IP协议指两个用在Internet上的网络协议(或数据传输的方法)。它们分别是传输控制协议和互联网协议。这两个协议属于众多的TCP/IP协议族的一部分。在TCP/IP协议族中,有很多种协议。图2-1给出了 TCP/IP协议族中不同层次的协议。硬件接口”链路层媒体图2-1 TCP/IP协

11、议族中不同层次的协议(1) TCP数据报格式传输控制协议TCP (transmission control protocol )是专门用于在不可靠的因特网上提供可靠的、端到端的字节流通信协议。TCP虽然是面向字节流的,但TCP传送的数据单元却是报文段。一个 TCP报文段分为首部和数据两部分,而TCP的全部功能都体现在它首部中各字段的作用。图 2-2给出了 TCP报文段的首部格式。32比特源端口I目的口 7WWWord资料确认号U R GA C KTCP 头 长窗口大小紧急指针可选项(长度可变)一填充TCP首部TCP报文段的数据部分IP首部IP报文段的数据部分图2-2 TCP报文段的首部格式(2

12、) UDP数据报格式用户数据报UDP有两个字段:数据字段和首部字段。首部字段很简单,只有8个字节(图2-3),由四个字段组成,每个字段的长度都是两个字节。41124字节图2-3 UDP用户数据报的首部和伪首部(3) IP数据报格式IP是TCP/IP协议族中最为核心的协议。所有的 TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。图2-4是IP数据报的完整格式。位可变部分固定部分(2咛节)版本首部长度区分服务总长度标识标志片偏移生存时间协议首部检验和源力也址目的地址可选字段(长度可变)填充数据部分1948162431图2-4IP数据报格式(4) ICMP数据报格式ICMP报文是在IP

13、数据报部被传输的。ICMP报文的格式如图2-5所示。所 有的报文的前4个字节都是一样的,但是剩下的其他字节则互不相同。类型字段可以有15个不同的值,以描述特定类型的ICMP报文。某些ICMP 报文还使用代码字段的值来进一步描述不同的条件。检验和字段覆盖整个ICMP报文。位 07815163188位代码16位检验和(/、同类型和代他有不同的内容)图2-5 ICMP报文格式(5) ARP数据报格式在以太网上解析IP地址时,ARP请求和应答分组的格式如图2-6所示(ARP可以用于其他类型的网络,可以解析IP地址以外的地址。紧跟着帧类型字段的前四个字段指定了最后四个字段的类型和长度)以太网 目的地址以

14、太网 源地址帧 类型硬件 类型协议 类型op、辛上山 发送我以太网地址/、.、斗上山 发送我IP地址目的太网地址目的IP地址66222112L640|64一以太阙首部28字节ARP请求/应答产硬件地址长度硬件地址长度图2-6 用于以太网的ARP请求或应答分组格式3.1.2 WinPcap 简介WinPcap(Windows Packet Capture)是 Windows 平台下一个免费,公共的网络访问系统。是Libpcap在Windows平台下的版本,针对 Windows进行了优化 处理和扩展。WinPcap驱动有如下功能:1、捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交

15、 换的数据WinPcap结构包。2、在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过 滤掉。3、在网络上发送原始的数据包。4、收集网络通信工程中的统计信息。WinPcap的主要功能在于独立于主机协议(如TCP/IP)而发送和接收原始数据包。也就是说,WinPcap不能阻塞、过滤或控制其他应用程序数据包的发收, 它仅仅只是监听共享网络上传送的数据包。WinPcap提供给用户两个不同级别的 编程接口: 一个基于 Libpcap的wpcap.dll,另一个是较底层的 packet.dll。WinPcap 的配置过程如下(以 Microsoft Visual C+ 6.0 为例):1、添

16、加头文件目录:工具 选项 目录 Include files 添力口 'WpdPackInclude目录。2、添加库文件目录:工具 选项 目录 Library files 添加 WpdPackLib目录。3、添力口预处理定义WPCAP和HAVE_REMOTE工程 设置 C/C+ 预处理程序定义 添力口 WPCAP和HAVE_REMOTE4、添加wpcap.lib库函数:工程 设置 连接 对象/库模块 添加wpcap.lib o5、添加pcap.h头文件在每个使用了 WinPcap函数的源文件中添加pcap.h。3.2系统总体分析与设计在以太网中,信息是以明文的形式在网络上传输的,当将网络

17、适配器设置为 混杂模式时,由于采用以太网广播信道争用的方式,使得监听系统与正常通信的网络能够并联连接,并可以捕获任何一个在同一冲突域上传输的数据包。运用这一原理使信息捕获系统能够拦截我们所要的信息,这是捕获数据包的物理基础。首先抓包系统必须绕过操作系统的协议栈来访问在网络上传输的原始数据包。WinPcap提供了两个不同的库:packet.dll和wpcap.dll。wpcap.dll提供了更加友好、功能更加强大的函数调用。3.2.1 系统总体结构分析与设计本系统基于WinPcap捕获和分析网络数据包的思想和方法进行设计,整体 结构按功能分为3个部分,分别是数据捕获模块、协议解析模块和用户显示模

18、块 系统的总体结构如图2-7所示。网络嗅探器数据捕获模块用户界面协议解析模块图2-7 系统的总体结构3.2.2 系统总体流程用户可以根据需要选择指定的检测网卡, 对要侦听的报文类型、IP地址和传输方向进行设置(即过滤设置)。捕获后系统简要显示每个报文的标识,源、目的地址,长度和类型信息。当选中一报文时,系统显示该报文的结构解析树和完整十六进制信息系统总体流程如图2-8所示得到网卡句柄选择监听的网卡设置过滤器选择数据包定位、初始化打开网卡接受并.示数据分析数据包释放设备、缓冲区(结;)图2-8 系统总体流程3.2.3 系统数据结构分析与设计系统每捕获到一个数据包,就要对数据包进行协议解析。解析过

19、程需要构造 相应类型的报文对象。系统基于对 TCP/IP协议族数据报格式的分析,对各个报 文类都有详细的描述。(1) pcap抓到都是数据链路层的数据包(即以太帧),要对数据包进行协议分析, 首先要构造以太帧头部对象。以太帧头部的类描述如下:/Mac帧头占14个字节struct ethhdru_char dest6;/6个字节目标地址u_char src6;/6个字节源地址u_short type;/2个字节类型;(2)以太帧的数据部分可能是 ARP数据报或者是IP数据报等等。系统在对其 进行进一步的协议解析的过程中,就要根据以太帧头部的类型字段进行构造相应 类型的数据报对象。IP数据报的描述

20、如下:定义IP头struct iphdr#if defined(LITTLE_ENDIAN)u_char ihl:4;u_char version:4;#elif defined(BIG_ENDIAN)u_char version:4;u_char ihl:4;#endifu_char tos;/TOS 服务类型u_short id;/ 标识u_short frag_off; /片位移u_char ttl;/生存时间u_char proto;/ 协议u_short check;/ 校验和u_int saddr;/ 源地址u_int daddr;/ 目的地址u_int op_pad;/ 选项等;

21、ARP数据报的描述如下:/ARP 头struct arphdr/硬件类型/协议类型/硬件地址长度/协议地址长度/操作码,1为请求2为回复u_short ar_hrd;u_short ar_pro;u_char ar_hln;u_char ar_pln;u_short ar_op;u_char ar_srcmac6;/发送方MACu_char ar_srcip4;u_char ar_destmac6;/发送方IP/接收方MACu_char ar_destip4;/接收方IP;(3)对IP数据报的数据部分分析可能的情况:TCP数据报、UDP数据报和ICMP数据报等。系统在进行协议解析时要根据IP数

22、据报的协议字段进行构造对应类型的数据报对象。TCP数据报的描述如下:/定义TCP头struct tcphdru_short sport;源端口地址 16位u_short dport;目的端口地址16位u_int seq;序列号32位u_int ack_seq;确认序列号#if defined(LITTLE_ENDIAN)u_short res1:4,doff:4,fin:1,syn:1,rst:1,psh:1,ack:1,urg:1,ece:1,Word资料cwr:1;#elif defined(BIG_ENDIAN) u_short doff:4,res1:4, cwr:1, ece:1,

23、urg:1, ack:1, psh:1, rst:1, syn:1, fin:1;#endif窗口大小16位校验和16位紧急指针16位/选项u_short window;u_short check;u_short urg_ptr;u_int opt;UDP数据报的描述如下:/定义UDP头struct udphdru_short sport;u_short dport;u_short len;u_short check;;ICMP数据报的描述如下:定义ICMPstruct icmphdru_char type;u_char code;u_char seq;u_char chksum;源端口16位

24、目的端口 16位数据报长度16位校验和16位/8位类型/8位代码序列号8位/8位校验和;四系统详细设计与实现4.1数据捕获模块的设计与实现数据捕获模块的主要功能是进行数据采集,这是整个系统的基础和数据来源。系统使用WinPcap来捕获网络中的原始数据包。系统首先调用pcap_findalldevs()函数,初始化网卡选择界面,用户选择要检测的网卡、设置好过滤条件并单击“开始”菜单项(或工具栏项)后,系统调用pcap_open_live()函数将网卡设置为混杂模式。接下来,系统调用 pcap_loop()函数,循环捕获网络数据包。每捕获一个数据包就调用设计好的回调函数来检测数据包是否符合过滤条件

25、,符合就给显示界面发送信息,通知其显示数据包信息。一旦用户单击“停止”菜单项(或工具栏项),系统就调用pcap_close()函数,关闭Winpcap操作,并销毁相应资源。数据捕获主要代码如下:/开始捕获int CMy44174413snifferDlg二My44174413sniffer_startCap()int if_index,filter_index,count;u_int netmask;struct bpf_program fcode;My44174413sniffer_initCap();获得接口和过滤器索引if_index = this->m_comboBox.GetC

26、urSel();filter_index = this->m_comboBoxRule.GetCurSel();if(0=if_index | CB_ERR = if_index)MessageBox(_T(情选择一个合适的网卡接口 ");return -1;if(CB_ERR = filter_index)MessageBox(_TC过滤器选择错误");return -1;/*获得选中的网卡接口 */dev=alldev;for(count=0;count<if_index-1;count+)dev=dev->next;if (adhandle= pca

27、p_open_live(dev->name, /设备名65536"/捕获数据包长度1, /混杂模式(非0意味着是混杂模式)1000, 读超时设置 errbuf /错误信息 )=NULL) MessageBox(_T('无法打开接 口 : "+CString(dev->description); pcap_freealldevs(alldev);return -1;4.2协议解析模块的设计与实现由于pcap每次抓到一个数据包,都会提交其信息,方式为以unsigned char* 指向的一段缓冲区。现将缓冲区前 14个字节读入,按以太帧格式构造以太帧头 部的

28、对象。然后根据以太帧头部中的Type字段,决定接下来应该构造IP、ARP或者RARR假设是IP,那么把缓冲区中第15个字节开始直到这块缓冲区最后 的所以字节读入,按IP报文格式构造IP的对象,根据IP的Protocol字段,决定 接下来构造TCP, UDP还是ICMP。假设是TCP,则将IP的数据容读入,按TCP 格式才造TCP的对象。系统首先显示捕获的数据包的简要信息,若用户对该数据包感兴趣,只要单 击选中该数据包,系统就会显示该数据包的详细信息。若数据包中是IP数据报,则简要显示该数据包的主要代码如下:if(0x0800 = local_data->ethh->type)/IP

29、HTREEITEM ip = 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("

30、;服务类型: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(标识:0x%02x"),local_data->iph->id);this->m_treeCtrl.InsertItem(str,ip);str.Format(_T("

31、;段偏移: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

32、("头部校马和:0x%02x"),local_data->iph->check);this->m_treeCtrl.InsertItem(str,ip);str.Format(_T("源 IP: ");struct in_addr in;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:

33、");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() 等来完成其他协议层的解析工作。需要特别

34、说明的一点是,网络中的字节顺序跟主机中的字节顺序是完全不一 样的,所以特别是要获得数字的值的时候,一定要先调用ntohs()函数(networkto host short )或ntohl()函数(network to host long )将数据包的网络字节顺转 换为主机字节序,这样在做一些判断的时候才是准确的。由协议栈工作流程可知,数据是由应用层把数据加上应用层协议头后给传输 层,传输层在最外面加上它的头部后给网络层,网络层在外面加上它的头部后再 给链路层所以当数据包被捕获到之后最外面的就是链路层的协议头,因此首 先要解析的就是链路层协议,这也就是为什么首先要调用analyze_frame(

35、)这个函 数了,然后再一层一层把它“剥开”,最终获得里面的数据。每一层的上层可能有多种协议在工作,比如IP上层就有TCP和UDP等之分, 所以在解析数据包的时候需要根据不同的特征来判断上层协议到底是什么,然后再来调用相关的函数对其进行解析,下面将列出一些主要的判断特征:(1)链路层-网络层网络层可能会有arp、ipv4、ipv6这三种不同的情况,在链路层定义了一个type字段,专门用于指示网络层数据包是什么类型。type = 0x0806 表示这是一个arp包type = 0x0800 表示这是一个ipv4包type = 0x86dd 表示这是一个ipv6包(2)网络层(IP层)-传输层IP层

36、之上可能会有tcp、udp、icmp等IPv4协议定义了 proto字段来指示传输层协议是什么。还记得上一章的Protocol.h文件中的这段定义不? proto什么值对应什么协议很明白了吧?#definePROTO_ICMP 1#define PROTO_TCP 6#define PROTO_UDP 17IPv6使用nh字段来标明传输层协议,如下:nh= 0x3a 表示上层是icmpv6nh= 0x06表示上层是tcpnh= 0x11表示上层是udp(3)传输层之上就是应用层了,这里我们的应用层只支持http协议,判断方法很简单,就是看目的或源端口是不是80o余下的工作就是一个字段一个字段地

37、获取数据包的值了。4.3用户界面模块的设计与实现用户设计界面如图4-1所示:图4-1设计界面要写在GUI上的数据主要有五个部分:(1) 参数设置:网卡接口、过滤项(2) 数据包捕获列表,显示数据包简要信息(3) 树形目录,显示被选中的数据详细信息(4) 文本框,显示被选中的数据包十六进制信息(5) 统计信息:各类包的数量4.3.1 控件写数据的基本操作由于我们选择的是对话框的形式的界面, 所以主界面只有一个,放置在主界面上的各个控件都可以通过主界面的this指针调用,并设置控件的值,例如:this->m_listCtrl.SetItemText(nItem,2,buf);其中m_list

38、Ctrl是放置于主界面上的一个列表控件,各种控件上的数据也就 基本通过这样的方式调用。程序中我们新开了一个线程来处理数据,线程中每收到一个数据包都需要更 新一下界面,这样就可以实时看到捕获的数据及统计信息了, 这需要我们把主界 面的this指针传递给线程,如下:m_ThreadHandle=CreateThread(NULL,0,sinffer_CapThread,this,0,threadCap);线程处理函数原型如下:DWORD WINAPI sinffer_CapThread(LPVOID IpParameter);这里的lpParameter就是刚刚传递进来的this指针了,在函数中使

39、用如下:Cmcf6Dlg*pthis = (Cmcf6Dlg*) lpParameter;4.3.2 根据不同协议显示不同颜色从图4-2可以看到,List控件有一个事件是 NM_CUSTOMDRAW,每次有新的一行加入的时候,都触发该事件,然后调用相关的处理函数进行自定义绘制,可以注册一个该事件。图4-2首先通过下面这段代码获得新加入到List列表中的数据位置POSITION pos=this->m_localDataList.FindIndex(pNMCD->nmcd.dwItemSpec);然后通过下面 代码获得新加入行中存储的数据structdatapkt * local_d

40、ata = (struct datapkt*)this->m_localDataList.GetAt(pos);最后根据数据中对应的协议设置不同的显示颜色。这样,一个界面友好的列表就设置好了。4.3.3 对数据格式化显示主要通过下面这个函数实现,下面这个函数主要做了两件事:(1)将数据是 16进制的形式显示;(2)将数据以字符形式显示。void print_packet_hex(const u_char* pkt,int size_pkt,CString *buf)int i=0,j = 0,rowcount; u_char ch;char tempbuf256;memset(tempb

41、uf,0,256);for(i = 0;i<size_pkt;i+=16) buf->AppendFormat(_T("%04x: "),(u_int)i);rowcount = (size_pkt-i) > 16 ? 16 : (size_pkt-i);for (j = 0; j < rowcount; j+)buf->AppendFormat(_T("%02x "),(u_int)pkti+j);不足16,用空格补足if(rowcount <16)for(j=rowcount;j<16;j+) buf->

42、;AppendFormat(_T(" ");for (j = 0; j < rowcount; j+)ch = pkti+j;ch = isprint(ch) ? ch :'.'buf->AppendFormat(_T("%c"),ch);buf->Append(_T("rn");if(rowcount<16)return;选中报文时运行效果如图4-3所示图4-3运行界面五结语本次程序是在WinPcap库的基础上对网络数据进行捕获,不需要编写复杂 的设备驱动程序和代码就可以实现抓包,使得其编写过

43、程比较简便、有效率。从 选择抓包程序,到查阅资料,思考课题的解决的方案,再到程序的实现,是一个 集中学习的过程,是一个灵活运用知识的过程,是一个由量变到质变的过程。感 觉到自己进步了,感觉到自己学到一些东西了,感觉到自己求知的态度了。在编写程序的过程中,我每每为自己的一些新的感悟而欣喜, 为排除每一个 错误而兴奋。编程序需要功夫,调试程序更需要有耐心和技巧。期间,我不断地 拓展自己的思路,尽可能地为程序添加新的功能,当然,这中间是少不了错误的 发生的。也正是在编写一调试一再编写的过程中,我理解了MFC框架机制,知道了如何在程序中添加自己的代码,如何自定义自己的消息,如何实现多线程的 运行。就最

44、终的成果而言,程序实现了抓包的基本功能,通过对过滤条件的设置, 实现了对特定源和目的IP地址、端口的数据包的捕获,并显示数据包的容,诸 如协议类型、长度、时间戳等信息等。随着网络技术的迅猛发展,网络安全将被人们越来越重视,抓包技术作为网 络安全攻防中最基础的技术,抓包工具的发展将向着集成化和易用型发展这两个 方向发展,我相信这也是绝大部分软件的发展趋势。网络安全是我们绝大部分人必须警惕关注的一个问题,当今社会信息流通量 越来越大,高科技人才也越来越多,高频率的网络犯罪让人们防不胜防。 我们不 但要正确使用抓包工具.还要合理防抓包工具的危害。抓包工具能够造成很大的安全危害,主要是因为它们不容易被

45、发现。 鉴于目前的网络安全现状,我们应该 进一步挖掘网络监听技术的细节,从技术基础上掌握先机,才能在与入侵者的斗 争中取得胜利。六附录6.1 参考文献1小特,王勇军.基于WinPcap的捕包程序设计J.软件导刊.2007, (21)2The WinPcap Team.WinPcap 中文技术文档J/OL.2007.ferrisxu./WinPcap/html/index.html3辉,叶子青?VisualC+系统开发实例精粹M?:人民邮电,20054吴功宜,董大凡,王瑞等.计算机网络高级软件编程技术M?:清华大学, 20086.2 主要函数代码初始化winpcapint CMy44174413

46、snifferDlg:My44174413sniffer_initCap()devCount = 0;if(pcap_findalldevs(&alldev, errbuf) =-1)return -1;for(dev=alldev;dev;dev=dev->next)devCount+;return 0;DWORD WINAPI sniffer_CapThread(LPVOID IpParameter)int res,nItem ;struct tm *ltime;CString timestr,buf,srcMac,destMac;time_t local_tv_sec;st

47、ruct pcap_pkthdr *header;/ 数据const u_char *pkt_data=NULL,*pData=NULL;/ 网络中收到的字节流数据u_char *ppkt_data;CMy44174413snifferDlg *pthis = (CMy44174413snifferDlg*) lpParameter; if(NULL = pthis->m_ThreadHandle) MessageBox(NULL,_T(线程句才丙错误"),_T('提示"),MB_OK);return -1;while(res = pcap_next_ex(

48、pthis->adhandle, &header, &pkt_data) >= 0) if(res = 0)超时continue;struct datapkt *data = (struct datapkt*)malloc(sizeof(struct datapkt);memset(data,0,sizeof(struct datapkt);if(NULL = data) MessageBox(NULL,_T("空间已满,无法接收新的数据包 "),_T("Error"),MB_OK);return -1;/分析出错或所接收数据

49、包不在处理围if(analyze_frame(pkt_data,data,&(pthis->npacket)<0) continue;将数据包保存到打开的文件中if(pthis->dumpfile!=NULL)pcap_dump(unsigned char*)pthis->dumpfile,header,pkt_data);/更新各类数据包计数pthis->My44174413sniffer_updateNPacket();将本地化后的数据装入一个链表中,以便后来使用ppkt_data = (u_char*)malloc(header->len);m

50、emcpy(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->time0 = ltime->tm_year+1900;data-&g

51、t;time1 = ltime->tm_mon+1;data->time2 = ltime->tm_mday;data->time3 = ltime->tm_hour;data->time4 = ltime->tm_min;data->time5 = ltime->tm_sec;/*为新接收到的数据包在listControl中新建一个item*/buf.Format(_T("%d"),pthis->npkt);nItem = pthis->m_listCtrl.InsertItem(pthis->npk

52、t,buf);/*显示时间戳*/timestr.Format(_T("%d/%d/%d %d:%d:%d"),data->time0,data->time1,data->time2,data->time3,data->time4,data->time5);pthis->m_listCtrl.SetItemText(nItem,1,timestr);/pthis->m_listCtrl.setitem/*显示长度*/buf.Empty();buf.Format(_T("%d"),data->len);p

53、this->m_listCtrl.SetItemText(nItem,2,buf);/*显示源MAC*/buf.Empty();buf.Format5"%02X-%02X-%02X-%02X-%02X-%02X"),data->ethh->src0,data->ethh->src1,data->ethh->src2,data->ethh->src3,data->ethh->src4,data->ethh->src5);pthis->m_listCtrl.SetItemText(nItem,3

54、,buf);/*显示目的MAC*/buf.Empty();buf.Format5"%02X-%02X-%02X-%02X-%02X-%02X"),data->ethh->dest0,d ata->ethh->dest1,data->ethh->dest2,data->ethh->dest3,data->ethh->dest4,data->eth h->dest5);pthis->m_listCtrl.SetItemText(nItem,4,buf);/*获得协议*/pthis->m_list

55、Ctrl.SetItemText(nItem,5,CString(data->pktType);/*获得源IP*/buf.Empty();if(0x0806= data->ethh->type)buf.Format(_T("%d.%d.%d.%d"),data->arph->ar_srcip0,data->arph->ar_srcip1,data->arph->ar_srcip2,data->arph->ar_srcip3);else if(0x0800 = data->ethh->type) s

56、truct in_addr in;in.S_un.S_addr = data->iph->saddr;buf = CString(inet_ntoa(in);else if(0x86dd =data->ethh->type )int n;for(n=0;n<8;n+)if(n<=6)buf.AppendFormat(_T("%02x:"),data->iph6->saddrn);elsebuf.AppendFormat(_T("%02x"),data->iph6->saddrn);pthis->m_listCtrl.SetItemText(nItem,6,buf);/*获得目的IP*/buf.Empty();if(0x0806 = data->ethh->type)buf.Format(_T("%d.%d.%d.%d"),data->arph->ar_destip0,data->arph->ar_dest

温馨提示

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

评论

0/150

提交评论