一、实验内容
运用Winpcap库实现对数据包的捕获与分析,并进行流量统计。
二、实验目的
计算机之间进行通信时,交互的所有信息都封装在数据包中。因此,通过采集网络数据并对其进行相应的分析,可以清楚地了解到进行通信的计算机的通信目的。随着计算机网络技术的飞速发展,网络为社会经济做出越来越多的贡献,可以说计算机网络的发展已经成为现代社会进步的一个重要标志。但同时,计算机犯罪、黑客攻击、病毒入侵等恶性事件也频频发生。网络数据包捕获、监听与分析技术是网络安全维护的一个基本技术同时也是网络入侵的核心手段。通过基于网络数据包的截获和协议分析,对网络上传输的数据包进行捕获,可以加深对各层各协议的理解,对今后的学习工作中维护网络安全起到基础作用。
三、实验要求
(1)掌握原始套接字(raw socket)或Winpcap的使用方法;掌握数据包捕获和数据包分析的相关知识;
(2)实现数据包的捕获、分析,并保存捕获的数据包;
(3)根据捕获的信息进行统计分析,实时流量监测等;
(4)改写数据包内容并发送;
(5)交互界面良好;
(6)提高综合运用文献的能力。
四、系统环境、开发工具简介
系统环境:Windows
开发工具:Dev-C++,Winpcap
WinPcap是一个基于Win32的捕获数据包和网络分析的体系结构,它包括一个内核级的包过滤器,一个底层的动态链接库(Packet.dll),一个高层并且与系统无关的库(WPcap.dll,基于LibPcap0.6.2版本)。WinPcap是集成于Windows 95, 98, ME, NT, 2000和XP操作系统的设备驱动程序,它可以从网卡捕获或者发送原始数据,同时能够过滤并且存储数据包。

五、实验原理、设计
协议分析:
由于TCP/IP协议采用分层的结构,这样在传输数据时,在网络数据的发送端是一个封装的过程,而在数据接收端则是分解的过程。应用程序数据经应用层添加应用层首部;向下传至运输层,添加运输层首部;向下传至网络层,添加网络层首部;向下传至数据链路层,添加链路层首部和尾部;传至物理层进行比特流传输。主机2收到的即为带有各层首尾部的数据包。对接收到的包进行解析,就是上述封装的逆过程。
逐层分析数据包:
链路层:MAC
在以太网的发展过程中,有很多种帧格式,其中以太网Ⅱ格式应用最为广泛,现在几乎是以太网的标准,它是由RFC894所定义。
#类型字段用来标志上一层使用的是什么协议,以便把收到的 MAC 帧的数据上交给上一层的这个协议。
网络层:IP、ARP
a. IP报文段首部格式
IP协议是Internet的核心协议,它工作在网络层,提供了不可靠无连接的数据传送服务。
b. ARP报文段首部格式
ARP/RARP协议是进行IP地址和MAC地址相互转换的协议,网络通信中,链路层使用MAC地址进行实际的数据通信,而在网络层使用IP地址进行机器定位寻址。APR协议把IP地址映射为MAC地址,RARP相反。
#首部的协议字段指出应将数据部分交给哪一个进程
运输层:TCP、UDP、ICMP
a. TCP报文段首部格式
TCP协议是基于连接的可靠的协议,它负责发收端的协定,然后保持正确可靠的数据传输服务。它是在IP协议上运行的,而IP无连接的协议,所以TCP丰富了IP协议的功能,使它具有可靠的传输服务。
b. UDP首部格式
用户数据报协议UDP是在IP协议上的传输层协议,它提供了无连接的协议服务,它在IP协议基础上提供了端口的功能,这样既可让应用程序进行通信了
#在计算检验和时,临时把“伪首部”和 UDP 用户数据报连接在一起。伪首部仅仅是为了计算检验和。
c. ICMP首部格式
Internet控制信息协议(Internet Control Message Protocol),它提供了很多Internet的信息描述服务,能够检测网络的运行状况,通知协议有用的网络状态信息。ICMP是基于IP协议的。
六、程序设计
(1)程序设计思想(数据流图、算法、程序流程图、主要的数据结构等)
Winpcap系统处理流程图
协议分析流程图
流量统计流程图
(2)主要的程序模块
1.头文件hdr.h
1.1配置运行环境
a.设置32位编译环境
b.链接Ws2_32.lib库
c.设置C++头文件
d.设置wpcap头文件
1.2美化界面的设置
1.3设置各层各协议header
1.4处理接收到的包
a.链路层
b.网络层
c.运输层
d.运用C++ std::map进行流量统计
2.主文件main.cpp
2.1 map声明
std::map<std::string, int> counter;
map对象是模板类,需要关键字和存储对象两个模板参数,这样就定义了一个用std::string作为关键字检索int条目的map对象,std表示命名空间,map对象在std名字空间中。
2.2 各层各协议头结构
2.3 main函数:
2.3.1获取网络设备
// alldevsp: 存储本地网络设备列表
// errbuf: 存储错误信息
// 返回值:int,如果发生错误将返回-1,执行成功将返回0
2.3.2打印网络设备
#若无法找到端口
2.3.3选择接口并验证输入格式是否符合标准
2.3.4打开要操作的网络设备
for (d = alldevs, i = 0; i < inum - 1; d = d->next, i++);
if ((adhandle = pcap_open_live(d->name,
65536,
1,
1000,
errbuf
)) == NULL)
{
fprintf(stderr, "\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);
pcap_freealldevs(alldevs);
return -1;
}
cout << "listening on " << d->description << "...." << endl;
pcap_freealldevs(alldevs);
# pcap_open函数:
pcap_t* pcap_open(const char* source, //接口设备名,pcap_if_t结构体中的name
int snaplen, //捕获数据的保存长度,一本可以设置为65535,65536保证能捕获到不同数据链路层上的每个数据包的全部内容
int flags,//是否设置为混杂模式,为0则表示不设置为混杂模式
int read_timeout, //捕获数据时的超时时间,设置为0表示不抓取到数据不会返回,设置为-1表示不管有没有抓到数据都会返回,设置为1000表示,如果没有抓取到数据则会等待1000ms再返回
struct pcap_rmtauth* auth, //远程机器验证,如果不是远程捕获,则设为NULL
char* errbuf //存储错误信息
);
返回值为pcap_t类型的指针,可以理解为打开的接口设备的句柄。接下来的操作都是针对该句柄进行的。如果函数执行错误则返回NULL并在errbuf中存储错误信息。
2.3.5设置过滤器
#在网络中传输的有各种各样的数据,为了准确抓取网络中传输的数据,需要在抓取数据时设置捕获过滤器。设置过滤器时需要用到两个函数:pcap_compile和pcap_setfilter。
# pcap_compile():编译过滤器
int pcap_compile(pcap_t* p, //打开的接口设备的句柄,pcap_open函数的返回值
struct bpf_program* fp, //bpf_program结构体指针,函数执行成功后会填入内容
char* str, //存储过滤规则的字符串
int optimize, //用于控制是否会在结果代码(resulting code)上执行优化,一般设置为1
bpf_u_int32 netmask //用于指定要捕获的网络设备上的IPV4的掩码
);
函数如果执行失败,则会返回-1。
# pcap_setfilter:设置过滤器
int pcap_setfilter(pcap_t* p, //打开的接口设备的句柄,pcap_open函数的返回值
struct bpf_program* fp, //pcap_compile函数执行后生成的bpf_program结构体指针,已包含相关数据
);
函数如果执行失败,则会返回-1;执行成功则会返回0。
2.3.6捕获数据包
#输入想捕获的数据包个数,利用pcap_loop函数循环捕获数据包
Adhandle:是由pcap_open_live返回的所打开的网卡的指针
Pktnum:捕获个数
Packet_handler:回调函数名称
User:一般为NULL值
2.3.7关闭winpcap句柄
pcap_close(adhandle);
2.4数据包处理
2.4.1数据包处理函数
#统计数据包捕获时间(将时间戳转换成可读形式)与长度,并交由以太网协议分析函数
2.4.2以太网协议分析函数
#先分出以太网头部的类型,这个类型的作用是指出上一层用的协议,以便交予上一层相应的进程。
#输出目的地址与源地址;根据类型字段选择相应网络层协议分析函数进行分析。
2.4.3网络层协议分析函数
a.Arp协议分析函数
#链路层传来的数据指针包含的以太头为14个字节,我们需要跳过这14个字节找到arp头进行分析
#输出各种分析数据
#根据操作码来判断它是请求协议还是应答协议
#输出源ip地址与目的ip地址
#流量统计:map是一个关联容器,以IP地址为键,流量为值存入map中,如果该IP值已经存在,则流量加一,最后的值即表示该IP的流量
b.ipv4协议分析函数
#链路层传来的数据指针包含的以太头为14个字节,我们需要跳过这14个字节找到ip头进行分析
#输出各种分析数据
#根据协议值判断上一层所用协议
#输出校验和,源ip地址和目的ip地址
#根据协议值选择交由运输层协议分析函数处理
#流量统计:map是一个关联容器,以IP地址为键,流量为值存入map中,如果该IP值已经存在,则流量加一,最后的值即表示该IP的流量
c.ipv6协议分析函数
#与ipv4相似
2.4.4运输层协议分析
a.udp协议分析函数
#网络层传来的数据指针包含的头为20个字节,我们需要跳过这20个字节找到udp头进行分析
#输出源端口,目的端口,长度和检验和
#利用pcap_sendpacket函数发送数据包,设置端口号为46000:
int pcap_sendpacket(
pcap_t* p, //要发送数据的接口设备的句柄,pcap_open函数的返回值
u_char* buf, //要发送的数据
int size //要发送的数据长度
);
函数的返回值:
1:函数执行发送数据失败
0:函数执行成功
b.tcp协议分析函数
#网络层传来的数据指针包含的头为20个字节,我们需要跳过这20个字节找到tcp头进行分析
#输出源端口,目的端口,长度等分析出的数据
#输出标志,窗口,检验和和紧急指针
#利用pcap_sendpacket函数发送数据包,设置端口号为46000
c.icmp协议分析函数
#网络层传来的数据指针包含的头为20个字节,我们需要跳过这20个字节找到icmp头进行分析
#根据分析出的icmp类型输出是请求协议还是应答协议
#输出icmp类型,icmp代码,标识符等
(3)程序实现功能
a.实现数据包的捕获、分析,并暂存捕获的数据包;
b.根据捕获的信息进行统计分析,进行实时流量监测;
c.改写数据包内容并发送,可用wireshark捕获发送出的数据包;
d.交互界面良好;
(4)程序调试过程
1.在定义完各协议头部后,报错ld returned 1 exit status,发现是main函数未定义。
2.对字节序的处理抱有疑问,查阅了大端序和小端序的相关资料。
3.写完部分代码,却发现文件夹并未存有项目.dev的文件,查阅了Dev-C++头文件与项目管理的相关资料。
4.对流量监控的实现不理解,查阅了有关std::map的资料。
5.运用函数如insert_or_assign却发现报错,发现是Dev-C++只支持到C++11,这个函数需要C++17以上来支持,使用counter[ip_string] = ++amount;以替代。
6.使用counter[ip_string] = ++amount;替代完后却发现跳转到makefile报错main.cpp:(.text+0x20a9): undefined reference to `_imp__ntohs@4';
发觉是头文件引入有问题,经几个小时的调试,最终解决措施:在编译器选项-连接器命令行中加入-lws2_32
七、程序使用说明、运行结果
1.捕获网络设备并输出
2.输入想捕获的接口
3.输入想捕获的数据包的个数
4.展示所捕获的数据包分析结果
5.每捕获一个包,进行一次流量统计
6.可发送出捕获到的数据包,并用wireshark捕获
八、实验总结
(1)如何开展实验,学习了哪些相关课程和知识。
本次实验是在Winpcap库的基础上对网络数据进行捕获,不需要编写复杂的设备驱动程序和代码就可以实现抓包,使得其编写过程比较简便、有效率。从查阅资料,到统和整理知识,思考所遇到问题的解决方案,再到程序的实现,是一个集中学习、灵活运用所学知识的过程。
我这次的实验是在Dev-C++上开展的,在不断的遇到问题与解决的过程中,对Dev-C++的机制的掌握逐步加深,对其报错行为也能较快找到问题点。
经过本次实验,我对各层各协议的内容及实现机制的了解进一步加深,温习了所学的知识;对Winpcap各个库函数有了较好的理解与掌握;程序实现了抓包的基本功能,实现了对数据包的捕获与发送,并显示数据包的内容,诸如协议类型、长度、时间戳等信息,并且还增加了流量分析等功能,拓展了用户的使用。
(2)实验收获
经过自我检查与老师的指导,我也发现了程序有诸多不足,如:并未实现对特定源和目的IP地址、端口的数据包的捕获;界面不够美化等等。但也就一些问题获得了一些经验,如:编写代码时及时释放内存、考虑输入的格式不当应及时处理、考虑各种例外因素等问题。
九、参考文献
Winpcap进行抓包,分析数据包结构并统计IP流量_winpcap抓包-CSDN博客
https://blog.csdn.net/bailang_zhizun/article/details/89947730
ps:
源码:https://download.csdn.net/download/weixin_52553215/89725643
仅供参考,如有纰漏,敬请指出