winpcap网络嗅探器课程设计.docx
- 文档编号:5708529
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:28
- 大小:473.07KB
winpcap网络嗅探器课程设计.docx
《winpcap网络嗅探器课程设计.docx》由会员分享,可在线阅读,更多相关《winpcap网络嗅探器课程设计.docx(28页珍藏版)》请在冰豆网上搜索。
winpcap网络嗅探器课程设计
课程设计
题目:
基于WinPcap的网络嗅探器设计与实现
专业班级:
网络工程
完成时间:
2015年1月
一引言
1.1编写目的
本需求的编写是为了研究基于WinpCap网络嗅探(网络抓包)程序的开发途径和应用方法。
同时它也是进行项目策划、概要设计和详细设计的基础,是维护人员进行内部维护,信息更新,验收和测试的依据,是用户操作说明的指导文档,是开发人员和用户交互的良好界面。
1.2问题背景
随着网络技术的飞速发展,加速了全球信息化的进程,各种重要数据在网上的传播日益普遍,使得网络安全问题越来越为人们所关注。
网络嗅探(网络抓包)工具作为一种网络数据监听程序,在网络安全攻防方面扮演了很重要的角色,目前已经有不少网络嗅探(网络抓包)工具,譬如在Windows环境下,最富盛名的工具是Netxray、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开发包(WinPcap4.0.2)
三概要设计
3.1TCP/IP协议族和WinPcap简介
本系统使用的开发包WinPcap是Windows平台下的专业网络数据包捕获开发包。
3.1.1TCP协议族
TCP协议和IP协议指两个用在Internet上的网络协议(或数据传输的方法)。
它们分别是传输控制协议和互联网协议。
这两个协议属于众多的TCP/IP协议族的一部分。
在TCP/IP协议族中,有很多种协议。
图2-1给出了TCP/IP协议族中不同层次的协议。
图2-1TCP/IP协议族中不同层次的协议
(1)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提供了更加友好、功能更加强大的函数调用。
3.2.1系统总体结构分析与设计
本系统基于WinPcap捕获和分析网络数据包的思想和方法进行设计,整体结构按功能分为3个部分,分别是数据捕获模块、协议解析模块和用户显示模块。
系统的总体结构如图2-7所示。
图2-7系统的总体结构
3.2.2系统总体流程
用户可以根据需要选择指定的检测网卡,对要侦听的报文类型、IP地址和传输方向进行设置(即过滤设置)。
捕获后系统简要显示每个报文的标识,源、目的地址,长度和类型信息。
当选中一报文时,系统显示该报文的结构解析树和完整十六进制信息。
系统总体流程如图2-8所示。
图2-8系统总体流程
3.2.3系统数据结构分析与设计
系统每捕获到一个数据包,就要对数据包进行协议解析。
解析过程需要构造相应类型的报文对象。
系统基于对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_intop_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数据报的描述如下:
//定义ICMP
structicmphdr
{
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_index,filter_index,count;
u_intnetmask;
structbpf_programfcode;
My44174413sniffer_initCap();
//获得接口和过滤器索引
if_index=this->m_comboBox.GetCurSel();
filter_index=this->m_comboBoxRule.GetCurSel();
if(0==if_index||CB_ERR==if_index)
{
MessageBox(_T("请选择一个合适的网卡接口"));
return-1;
}
if(CB_ERR==filter_index)
{
MessageBox(_T("过滤器选择错误"));
return-1;
}
/*获得选中的网卡接口*/
dev=alldev;
for(count=0;count dev=dev->next; if((adhandle=pcap_open_live(dev->name,//设备名 65536,//捕获数据包长度 1,//混杂模式(非0意味着是混杂模式) 1000,//读超时设置 errbuf//错误信息 ))==NULL) { MessageBox(_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(0x0800==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("标识: 0x%02x"),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("头部校验和: 0x%02x"),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)或n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- winpcap 网络 嗅探器 课程设计