华 东 交 通 大 学
课 程 设 计( 论 文 )任 务 书
信息学院 专 业 计算机 班 级 2008-1
一、课程设计(论文)题目
基于 winpcap 的简单抓包工具的设计
二、课程设计(论文)工作:自 2011 年 6 月 20 日起
至 2011 年 6 月 25 日止。
三、课程设计(论文)的内容要求:
1、 基于 winpcap 的简单抓包工具的设计
(1)使用 Winpcap 开发包编写自己的 Sniffer 软件,要
求具备数据包捕获,过滤存储以及读取等功能;
(2)对所抓取的包尽量作详细的解析;
(3)用 VC 完成程序设计;
1
学生签名:
2011 年 6 月 26 日
课程设计(论文)评阅意见
等
级
优秀
良好
中等
及格
不及格
项
目
课程设计态度评价
出勤情况评价
任务难度评价
工作量饱满评价
设计中创新性评价
论文书写规范化评价
综合应用能力评价
综合评定等级
评阅人 谢昕 职称 教授
2011 年 6 月 27 日
2
目 录
一、任务分析与方案设计 ...................... 4
二、开发环境与工具 .......................... 6
三、关键技术与理论 .......................... 7
四、系统功能的详细实现 ...................... 8
五、测试及结果分析 ........................ 225
六、课程设计总结 .......................... 226
七、参考文献 .............................. 227
3
一、任务分析与方案设计
1.实验题目与要求: 用 Winpcap 编写自己的 Sniffer.
(1)使用 Winpcap 开发包编写自己的 Sniffer 软件;
(2)对所抓取的包尽量作详细的解析;
(3)用 VC 完成程序设计;
2.设计思路
程序在执行过程中有两个核心的工作,一是调用 Winpcap 函数库实现下层抓
包。二是对抓到的包文进行分析。下面分别列出两个核心过程的基本算法与相关的实
现代码。
抓包算法:(1):初始化 Winpcap 开发库
(2):获得当前的网卡列表,同时要求用户指定要操作的网
(3):获得当前的过滤规则,可为空
(4):将网卡的工作模式设为混杂模式,调用线程开始抓包
(5):调用库函数,pcap_loop(),同时并指定其回调函数,其中其回调函
数为数据包分析过程。
分析算法:(1):得到数据包,先将其转存到内存里,以备以后再用。
(2):分析当前的数据包,分析过程如下:
1>.数据包的前 14 个字节(Byte)代表数据链路层的报文头,其报
文格式是前 6Byte 为目的 MAC 地址,随后的 6 个 Byte 为源 Mac 地址,最后的 2Byte
代表上层协议类型这个数据很重要,是我们分析上层协议的依据。
2>.根据 1>.得到的协议类型进行类似的迭代运算这样就可以得到
各层中的报文头信息和数据信息。
(3):结束本次分析。
4
3.实验流程图
5
二、开发环境与工具
开发环境:winpcap 开发包,microsoft visual C++ 6.0,pc 机
工具:winpcap,microsoft
visual C++ 6.0
1.winpcap 简介:
windows packet capture,是 windows 平台下一个免费,公共的网络访问系统。
是网络数据包捕获库函数,工作于驱动层直接访问网络,为应用程序提供了一组 API
接口,编程容易,源码级移植方便,网络操作高效。
2.WinPcap 主要功能:
(1)捕获原始数据包
(2)将数据包发送给应用程序之前,按照用户规定的规范过滤数据包
(3)将捕获到的数据包输出到文件中,并可以对这些文件进行再分析
(4)向网络发送原始数据包
(5)搜集网络传输统计数据
3.编程环境设定
(1) 下 载 安 装 包 和 开 发 包 http://winpcap.polito.it
Winpcap 的 安 装 包
(Winpcap_3_1.exe),程序员开发包(WpdPack_3_1.zip),运行 Winpcap_3_1.exe.
(2)运行 Visual C++ 6.0, 打开 WpdPack_3_1\WpdPack\Examples-pcap\下的
任一项目(本例用 basic_dump 目录下 basic_dump.dsw)
(3)在“工程->设置-> Link->对象/库模块” 中加入 wsock32.lib ws2_32.lib
wpcap.lib;在“工具->选择->目录”的 include files 和 library files 设置中引入 winpcap
开发包中的 Include 和 Lib 目录
(4) 编译,运行程序
6
三、关键技术与理论
Sniffer(嗅探器)设计原理
嗅探器是一种常用的收集有用数据的方法,嗅探器是利用计算机的网络接口截
获目的地为其它计算机的数据报文的一种工具。由于组网方式不同,嗅探器的工作原
理也有所不同,总共可以分为三类:
(1) 基于网卡混杂模式的嗅探原理;
(2) 基于 ARP 欺骗的网络嗅探原理;
(3) 基于中间人攻击的嗅探原理。
本次课程设计就是利用第一种方式来实现嗅探器的功能,可见监听到所有流经同
一以太网网段的数据包,这是一种被动嗅探的方式。从以太网的工作原理来看,数据
传输是基于“共享”的,所有的同一本地网范围内的计算机共同接收到相同的数据包,
这意味着计算机直接的通讯都是透明可见的。正是因为这样的原因,以太网卡都构造
了硬件的“过滤器”,这个过滤器将忽略掉一切和自己无关的网络信息,事实上时忽略
掉了与自身 MAC 地址不符合的信息。从网卡原理上来说,在一个实际的系统中,数据
的收发是由网卡来完成的,网卡接收到传输来的数据包,网卡内的单片程序接收数据
帧的目的 MAC 地址,根据计算机上的网卡驱动程序设置的接收模式判断该不该接收,
认为该接收就接收后产生中断信号通知 CPU,认为不该接收就丢掉不管,所以不该接
收的数据网卡就截断了,计算机根本就不知道。对于网卡来说一般有四种接收模式:
(1) 广播方式:该模式下的网卡能够接收网络中的广播信息;
(2) 组播方式:设置在该模式下的网卡能够接收组播数据;
(3) 直接方式:在这种模式下,只有目的网卡才能接收该数据;
(4) 混杂模式:在这种模式下的网卡能够接收一切通过它的数据。
而本次设计嗅探工具正是利用了这个特点,把网卡设置为“混杂模式”。因此,嗅
探程序就能够接收到整个以太网内的网络数据信息了,而不管该数据是否是传给它的。
7
四、系统功能的详细实现
1.获取设备列表:获得合适的网络适配器。Libpcap 提供 pcap_findalldevs() 函
数完成这个功能。这个函数返回一个相连的 pcap_if 结构的列表,列表的每一项包含关
于适配器的复杂的信息。
InitPacp()
{pcap_if_t *alldevs,*d;
int i=0;
char errbuf[PCAP_ERRBUF_SIZE];
if (pcap_findalldevs(&alldevs, errbuf) == -1)
{
//查找设备
fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
exit(1);
}
for(d=alldevs;d;d=d->next) {
//打印设备列表
printf("%d. %s", ++i, d->name);
if (d->description)
else
printf(" (%s)\n", d->description);
printf(" (No description available)\n");}
if(i==0){
printf("\nNo interfaces found! Make sure WinPcap is
//没找到设备显示错误
installed.\n");
return;
}
pcap_freealldevs(alldevs);
//释放
}
2.开始捕获数据包:开始打开适配器捕获数据,这是本实验最重要的一步。
(1)设置线程进行数据捕获控制
DWORD WINAPI MyCaptureThread(LPVOID lpParameter)
{LPDWORD ThreadID=NULL;
m_ThreadHandle=CreateThread(NULL,0,MyCaptureThread,this,0,ThreadID);
if(m_ThreadHandle==NULL)
8