开发基于winPcap的嗅探器.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
网络安全课程设计报告(2015-2016 第一学期)
题目开发基于winPcap的嗅探器
专业
学号姓名
指导教师
日期
评
分分
细
评分项优秀良好中等差遵守机房规章制度
实验原理分析与设计
课题功能实现情况
设计验收与答辩
课程设计报告书写
简
短
评
语
教师签名:
年月日评
分
等
级
备
注
开发基于winPcap的嗅探器
一、实验目的
开发一个winpcap的嗅探器,用它来捕获所有流经网卡的数据包,并进行分析。二、实验环境
操作系统:Windows 2000/XP
编程环境:Visual c++6.0
附加库:Winpcap
三、实验内容和要求
内容:所开发的程序可以输出本机所有网卡的信息和捕获流经网卡的数据包并能够过滤出IP、TCP、UDP、ICM P等数据包
要求:掌握基于WinPcap的网络编程模式。
理解并能应用WinPcap设计并实现网络数据包的捕获与解析。
四、实验原理和步骤
原理:我们所要做的嗅探器是一种常用的网络数据收集软件,它是在广播式网络环境下利用计算机网络接口截获目的地为其它计算机的数据报文的一种工具。
在以太网中,信息是以明文的形式在网络上传输 ,当将网络适配器设置为混杂模式时,由于采用以太网广播信道争用的方式,使得监听系统与正常通信的网络能够并联连接,并可以捕获任何一个在同一冲突域上传输的数据包。IEEE802.3标准的以太网采用的是持续CSMA的方式,正是由于以太网采用这种广播信道争用的方式,使得各个站点可以获得其他站点发送的数据。运用这一原理使信息捕获系统能够拦截我们所要的信息,这是捕获数据包的物理基础。
首先,抓包系统必须绕过操作系统的协议栈来访问在网络上传输的原始数据包,这就要求一部分运行在操作系统核心内部,直接与网络接口驱动交互。这个部分是系统依赖的,在Winpcap的解决方案里它被认为是一个设备驱动,称作NPF(Netgroup PacketFilter)。
Winpcap提供了两个不同的库:Packet.dll和Wpcap.dll。Wpcap.dll提供了更加友好、功能更加强大的函数调用。WinPcap的优势在于提供了一套标准的抓包接口,与libpcap兼容,可使得原来许多UNIX平台下的网络分析工具快速移植过来,便于开
发各种网络分析工具,充分考虑了各种性能和效率的优化,包括对于NPF内核层次上的过滤器支持,支持内核态的统计模式,提供了发送数据包的能力。前者提供了一个底层API,伴随着一个独立于Microsoft操作系统的编程接口,这些API可以直接用来访问驱动的函数;后者导出了一组更强大的与libpcap一致的高层抓包函数库(captureprimitives)。这些函数使得数据包的捕获以一种与网络硬件和操作系统无关的方式进行。
网络嗅探器工作在网络环境的底层,拦截所有正在网络上传送的数据,并且通过相应的解析处理,可以实时分析这些数据的内容,进而分析所处的网络状态和整体拓扑布局。
步骤:程序所实现嗅探器的总体结构
本机网卡信息描述
跳转到选择的网卡
选择过滤包类型(ip/tcp/udp/icmp)
开始嗅探
嗅探内容显示并分析
1.获得本地网络网卡列表
获取一个已经绑定的网卡列表,然后Winpcap对捕获网络数据端口进行设定。
通过pcap引擎找出并设定监听的网络接口。Winpcap提供了pcap_findalldevs_ex()函数,这个函数返回一个指向pcap_if结构的链表,其中的每一项都包含了一个己经绑定的适配器(网卡)的全部信息。其中name和description这两项分别包含了相应设备的名称和描述。取得网卡列表后就在屏幕上显示出来,如果网卡没有被发现就显示有关错误,pcap_findalldevs()同其他的libpcap函数一样有一个errbuf参数,当有异常情况发生时,这个参数会被pcap填充为某个特定错误字串。
部分主要程序示意如下:
①主函数部分:
// 获取网卡列表
if(pcap_findalldevs(&alldevs, errbuf) == -1)
{ fprintf(stderr,"pcap_findalldevs发生错误: %s\n", errbuf);
exit(1);}
// 输出网卡信息
for(i=0,d=alldevs; d; d=d->next,i++)
{ ifprint(d,i+1)}
if(i==0)
{ printf("\n没有找到任何网卡,请确认Winpcap已经安装.\n");
return -1;}
②调用函数部分:
// 输出网卡信息
void ifprint(pcap_if_t *d, int num)
{pcap_addr_t *a;
printf("\n\n************网卡%d信息************\n",num);
// 输出网卡名称
printf("网卡名: %s \n",d->name);
// 网卡描述信息
if (d->description)
{ printf("网卡描述: %s \n",d->description);}
// 反馈
printf("反馈: %s \n",(d->flags & PCAP_IF_LOOPBACK)?"yes":"no"); // IP地址
for(a=d->addresses;a;a=a->next)
{ switch(a->addr->sa_family)
{ case AF_INET:
printf("IP地址类型: AF_INET\n");//打印网络地址类型
if (a->addr)//打印IP地址
printf("IP地址: %s\n",