C++ 捕获与解析IP数据包 (winpcap)

源代码链接:https://download.csdn.net/download/chd_lcj/10891420

(不知道为什么积分涨到4积分了。。。原先只是单纯的想分享下的,结果最低只能设置1积分)

//网络编程学习经验记录贴

 ***选择正在联网的网卡,如果你不知道就一个个试!***

***关闭防火墙/关闭防火墙/关闭防火墙***

winpcap简介

WinPcap 是由伯克利分组捕获库派生而来的分组捕获库,它是在Windows 操作平台上来实现对底层包的截取过滤。

WinPcap 为用户级的数据包提供了Windows 下的一个平台。

WinPcap 是 BPF 模型和 Libpcap 函数库在 Windows 平台下网络数据包捕获和网络状态分析的一种体系结构,这个体系结构是由一个核心的包过滤驱动程序,一个底层的动态连接库 Packet.dll 和一个高层的独立于系统的函数库 Libpcap 组成。底层的包捕获驱动程序实际为一个协议网络驱动程序,通过对 NDIS 中函数的调用为 Win95、Win98、WinNT、和 Win2000 提供一类似于 UNIX 系统下 Berkeley Packet Filter 的捕获和发送原始数据包的能力。Packet.dll 是对这个 BPF 驱动程序进行访问的 API 接口,同时它有一套符合 Libpcap 接口(UNIX 下的捕获函数库)的函数库。WinPcap的结构图如图1。

WinPcap 包括三个部分:

第一个模块NPF(Netgroup Packet Filter),是一个虚拟设备驱动程序文件。它的功能是过滤数据包,并把这些数据包原封不动地传给用户态模块,这个过程中包括了一些操作系统特有的代码。

第二个模块packet.dll为win32平台提供了一个公共的接口。不同版本的Windows系统都有自己的内核模块和用户层模块。Packet.dll用于解决这些不同。调用Packet.dll的程序可以运行在不同版本的Windows平台上,而无需重新编译。

第三个模块 Wpcap.dll是不依赖于操作系统的。它提供了更加高层、抽象的函数。

packet.dll和Wpcap.dll:packet.dll直接映射了内核的调用。 Wpcap.dll提供了更加友好、功能更加强大的函数调用。WinPcap的优势提供了一套标准的抓包接口,与libpcap兼容,可使得原来许多UNIX平台下的网络分析工具快速移植过来便于开发各种网络分析工具,充分考虑了各种性能和效率的优化,包括对于NPF内核层次上的过滤器支持,支持内核态的统计模式,提供了发送数据包的能力。

利用winpcap进行网络数据包的捕获和过滤的设计步骤
1)打开网卡,并设为混杂模式。

2)回调函数 Network Tap 在得到监听命令后,从网络设备驱动程序处收集数据包把监听到的数据包负责传送给过滤程序。

3)当 Packet filter 监听到有数据包到达时,NDIS 中间驱动程序首先调用分组驱动程序,该程序将数据传递给每一个参与进程的分组过滤程序。

4)然后由 Packet filter 过滤程序决定哪些数据包应该丢弃,哪些数据包应该接收,是否需要将接收到的数据拷贝到相应的应用程序。

5)通过分组过滤器后,将数据未过滤掉的数据包提交给核心缓冲区。然后等待系统缓冲区满后,再将数据包拷贝到用户缓冲区。监听程序可以直接从用户缓冲区中读取捕获的数据包。

6)关闭网卡。

网络数据包捕获的原理

以太网(Ethernet)具有共享介质的特征,信息是以明文的形式在网络上传输,当网络适配器设置为监听模式(混杂模式,Promiscuous)时,由于采用以太网广播信道争用的方式,使得监听系统与正常通信的网络能够并联连接,并可以捕获任何一个在同一冲突域上传输的数据包。IEEE802.3 标准的以太网采用的是持续 CSMA 的方式,正是由于以太网采用这种广播信道争用的方式,使得各个站点可以获得其他站点发送的数据。运用这一原理使信息捕获系统能够拦截的我们所要的信息,这是捕获数据包的物理基础。
以太网是一种总线型的网络,从逻辑上来看是由一条总线和多个连接在总线上的站点所组成各个站点采用上面提到的 CSMA/CD 协议进行信道的争用和共享。每个站点(这里特指计算机通过的接口卡)网卡来实现这种功能。网卡主要的工作是完成对于总线当前状态的探测,确定是否进行数据的传送,判断每个物理数据帧目的地是否为本站地址,如果不匹配,则说明不是发送到本站的而将它丢弃。如果是的话,接收该数据帧,进行物理数据帧的 CRC 校验,然后将数据帧提交给LLC 子层。

网卡具有如下的几种工作模式:
1)   广播模式(Broad Cast Model):它的物理地址(MAC)地址是 0Xffffff 的帧为广播帧,工作在广播模式的网卡接收广播帧。
2)多播传送(MultiCast Model):多播传送地址作为目的物理地址的帧可以被组内的其它主机同时接收,而组外主机却接收不到。但是,如果将网卡设置为多播传送模式,它可以接收所有的多播传送帧,而不论它是不是组内成员。
3)直接模式(Direct Model):工作在直接模式下的网卡只接收目地址是自己 Mac地址的帧。
4)混杂模式(Promiscuous Model):工作在混杂模式下的网卡接收所有的流过网卡的帧,信包捕获程序就是在这种模式下运行的。
网卡的缺省工作模式包含广播模式和直接模式,即它只接收广播帧和发给自己的帧。如果采用混杂模式,一个站点的网卡将接受同一网络内所有站点所发送的数据包这样就可以到达对于网络信息监视捕获的目的。

IP数据包头字段说明

  1. 版本号(Version):长度4比特。标识目前采用的IP协议的版本号。一般的值为0100(IPv4)&#x
  • 43
    点赞
  • 373
    收藏
    觉得还不错? 一键收藏
  • 41
    评论
使用Winpcap函数,可以在Windows系统上实现网络数据报文的捕获。以下是使用C++编写Winpcap函数实现网络数据报文捕获的步骤: 1. 首先需要安装Winpcap库,并将其含在项目中。 2. 创建一个Winpcap句柄,用于打开网络接口。 3. 设置网络接口的过滤器,以过滤出需要捕获数据包。 4. 使用Winpcap函数循环接收数据包并处理。在处理数据包时,可以使用结构体来解析数据包的各个字段。 下面是一个简单的代码示例,演示如何使用Winpcap函数实现网络数据报文捕获: ``` #include <stdio.h> #include <stdlib.h> #include <pcap.h> void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data); int main() { char errbuf[PCAP_ERRBUF_SIZE]; pcap_t *handle; struct bpf_program fp; char filter_exp[] = "ip"; // 过滤出IP数据包 bpf_u_int32 net; // 打开网络接口 handle = pcap_open_live("eth0", BUFSIZ, 1, 1000, errbuf); if (handle == NULL) { fprintf(stderr, "Error opening interface: %s\n", errbuf); exit(1); } // 编译并设置过滤器 if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) { fprintf(stderr, "Error compiling filter: %s\n", pcap_geterr(handle)); exit(1); } if (pcap_setfilter(handle, &fp) == -1) { fprintf(stderr, "Error setting filter: %s\n", pcap_geterr(handle)); exit(1); } // 循环接收数据包并处理 pcap_loop(handle, 0, packet_handler, NULL); pcap_close(handle); return 0; } void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data) { // 解析数据包并处理 printf("Got a packet\n"); } ``` 在这个示例代码中,我们首先打开了一个名为"eth0"的网络接口,然后设置过滤器以过滤出IP数据包。接着使用pcap_loop函数循环接收数据包,并将每个数据包交给packet_handler函数处理。在packet_handler函数中,我们可以使用结构体来解析数据包,并进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值