c++实现抓包代码
1.安装winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它用于windows系统下的直接的网络编程。Winpcap提供了一个强大的编程接口,它很容易地在各个操作系统之间进行移植。

百度网盘:
链接:https://pan.baidu.com/s/1ot7H3Vz_KBvdmYKjJqu4dQ
提取码:1hzP

阿里网盘
https://www.aliyundrive.com/s/huPxENSACgH

WpdPack_4_1_2.exe安装运行环境
pcap.h在WpdPack_4_1_2文件夹中。路径:WpdPack_4_1_2\WpdPack\Include

以下为实现代码

头文件:
一定要先define HAVA_REMOTE 再include “wpcap.h” 否则会报错

#define HAVE_REMOTE
#include <pcap.h>

获取本机网卡设备列表:
原型:int pcap_findalldevs_ex(char* source, struct pcap_rmtauth auth, pcap_if_t* alldevs, char* errbuf );
返回值:0表示查找成功。-1表示查找失败
参数说明:

source:
指定是本地适配器或者远程适配器
本地适配器:‘rpcap://’
远程适配器:‘rpcap://host:port’
抓包文件。‘file://c:/myfolder/’.

Defined:
#define PCAP_SRC_FILE_STRING "file://"
String that will be used to determine the type of source in use (file, remote/local interface).
#define PCAP_SRC_IF_STRING "rpcap://"
String that will be used to determine the type of source in use (file, remote/local interface).
auth:一个指向’struct pcap_rmtauth’的指针,保存当一个用户登录到某个远程机器上时的必要信息。假如不是远程抓包,该指针被设置为NULL。
alldevs:参数用于存放获取的适配器数据。如果查找失败,alldevs的值为NULL.
errbuf:参数存放查找失败的信息。

    pcap_if_t* alldevs;char errbuf[PCAP_ERRBUF_SIZE];/* 获取本机设备列表 */if (pcap_findalldevs_ex((char*)PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1){fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);exit(1);}/* 释放设备列表 */pcap_freealldevs(alldevs);

打开一个通用源,以便捕获/发送(仅限WinPcap)流量。
原型:pcap_t* pcap_open (
const char * source,
int snaplen,
int flags,
int read_timeout,
struct pcap_rmtauth * auth,
char * errbuf
)
source:以/0终止的字符串,其中包含要打开的源名称。为了使源语法更容易,请记住:
1.pcap_findalldevs_ex()返回的适配器可以由pcap_open()立即使用,
2.如果用户想要将自己的源字符串传递给pcap_open(),则pcap_createsrcstr()有助于创建正确的源标识符。

snaplen: 必须保留的包的长度。对于由过滤器接收的每个数据包,只有第一个“snaplen”字节存储在缓冲区中并传递给用户应用程序。例如,snaplen等于100表示只存储每个数据包的前100个字节。

flags: 保留捕获数据包可能需要的几个标志。允许的标志在pcap_open()标志中定义。

read_timeout: 以毫秒为单位读取超时。读取超时用于安排在看到数据包时读取不一定立即返回,但是在一次操作中,它会等待一段时间来允许更多数据包到达并从操作系统内核读取多个数据包。并非所有平台都支持读取超时; 在没有的平台上,读取超时被忽略。

auth: 指向“结构pcap_rmtauth”的指针,它保留在远程机器上验证用户所需的信息。如果这不是远程捕获,则该指针可以设置为NULL。

errbuf: 指向用户分配的缓冲区的指针,该缓冲区将在该函数失败的情况下包含错误。

返回值:
指向’pcap_t’的指针,可以用作以下调用(pcap_compile()等)的参数,并指定打开的WinPcap会话。如果出现问题,它返回NULL,'errbuf’变量保留错误消息。

    /* 打开设备 */if ((adhandle = pcap_open(d->name,          // 设备名65536,            // 要捕捉的数据包的部分// 65535保证能捕获到不同数据链路层上的每个数据包的全部内容PCAP_OPENFLAG_PROMISCUOUS,    // 混杂模式1000,             // 读取超时时间NULL,             // 远程机器验证errbuf            // 错误缓冲池)) == NULL){fprintf(stderr, "\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);/* 释放设列表 */pcap_freealldevs(alldevs);return;}

设置过滤器:
过滤器语法详看 http://www.doc88.com/p-8466091442168.html

    char packet_filter[] = "src host 172.16.21.174 and port 8080"; //过滤(源IP:172.16.21.174且端口8080)if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) >= 0){//设置过滤器if (pcap_setfilter(adhandle, &fcode) < 0){fprintf(stderr, "\nError setting the filter.\n");/* 释放设备列表 */pcap_freealldevs(alldevs);return -1;}}else{fprintf(stderr, "\nError setting the filter.\n");/* 释放设备列表 */pcap_freealldevs(alldevs);return -1;}

捕获报文:
原型:pcap_next_ex(pcap_t* p,struct pcap_pkthdr** pkt_header,const u_char** pkt_data)
功能: 从interface或离线记录文件获取一个报文

参数: p: 已打开的捕捉实例的描述符
pkt_header: 报文头
pkt_data: 报文内容
返回值: 1: 成功
0: 获取报文超时
-1: 发生错误
-2: 获取到离线记录文件的最后一个报文

其中:
struct pcap_pkthdr
{
struct timeval ts; ts是一个结构struct timeval,它有两个部分,第一部分是1900开始以来的秒数,第二部分是当前秒之后的毫秒数
bpf_u_int32 caplen; 表示抓到的数据长度
bpf_u_int32 len; 表示数据包的实际长度
}

/* 获取数据包 */
while ((res = pcap_next_ex(fp, &header, &pkt_data)) >= 0){//超时if (res == 0)continue;//处理报文}

示例代码:

#define HAVE_REMOTE
#include <pcap.h>using namespace std;int main(int argc, const char* argv[])
{pcap_if_t* alldevs;pcap_if_t* d;int inum;int i = 0;pcap_t* adhandle;int res;char errbuf[PCAP_ERRBUF_SIZE];struct tm* ltime;char timestr[16];struct pcap_pkthdr* header;const u_char* pkt_data;time_t local_tv_sec;u_int netmask;char packet_filter[] = "src host 192.168.9.101 and port 8080"; //过滤器struct bpf_program fcode;/* 获取本机设备列表 */if (pcap_findalldevs_ex((char*)PCAP_SRC_IF_STRING, NULL, &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)printf(" (%s)\n", d->description);elseprintf(" (No description available)\n");}if (i == 0){printf("\nNo interfaces found! Make sure WinPcap is installed.\n");return -1;}printf("Enter the interface number (1-%d):", i);scanf("%d", &inum);if (inum < 1 || inum > i){printf("\nInterface number out of range.\n");/* 释放设备列表 */pcap_freealldevs(alldevs);return -1;}/* 跳转到已选中的适配器 */for (d = alldevs, i = 0; i < inum - 1; d = d->next, i++);/* 打开设备 */if ((adhandle = pcap_open(d->name,          // 设备名65536,            // 要捕捉的数据包的部分// 65535保证能捕获到不同数据链路层上的每个数据包的全部内容PCAP_OPENFLAG_PROMISCUOUS,    // 混杂模式1000,             // 读取超时时间NULL,             // 远程机器验证errbuf            // 错误缓冲池)) == NULL){fprintf(stderr, "\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);/* 释放设列表 */pcap_freealldevs(alldevs);return -1;}printf("\nlistening on %s...\n", d->description);/* 设置过滤器 */if (d->addresses != NULL)/* 获取接口第一个地址的掩码 */netmask = ((struct sockaddr_in*)(d->addresses->netmask))->sin_addr.S_un.S_addr;else/* 如果这个接口没有地址,那么我们假设这个接口在C类网络中 */netmask = 0xffffff;if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) >= 0){//设置过滤器if (pcap_setfilter(adhandle, &fcode) < 0){fprintf(stderr, "\nError setting the filter.\n");/* 释放设备列表 */pcap_freealldevs(alldevs);return -1;}}else{fprintf(stderr, "\nError setting the filter.\n");/* 释放设备列表 */pcap_freealldevs(alldevs);return -1;}/* 释放设备列表 */pcap_freealldevs(alldevs);/* 获取数据包 */while ((res = pcap_next_ex(adhandle, &header, &pkt_data)) >= 0) {if (res == 0)/* 超时时间到 */continue;/* 将时间戳转换成可识别的格式 */local_tv_sec = header->ts.tv_sec;ltime = localtime(&local_tv_sec);strftime(timestr, sizeof timestr, "%H:%M:%S", ltime);printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len);/* 打印包 */int len = header->caplen + 1;for (i = 1; i < len; i++){printf("%.2x ", pkt_data[i - 1]);if ((i % 16) == 0)printf("\n");}printf("\n-----------------------------------------------------------------\n");}if (res == -1) {printf("Error reading the packets: %s\n", pcap_geterr(adhandle));return -1;}return 0;

编译运行,选择网卡编号后,捕获符合报文。
截取其中一段做分析
9c 29 76 0e 4a 57 ac b5 7d 8a 12 5c 08 00 45 00
00 2a 72 3d 40 00 80 06 f4 73 c0 a8 09 65 c0 a8
09 67 38 b6 1f 90 ed 4a d5 6a 7c d7 7d 3d 50 18
40 29 95 41 00 00 31 32 33 34 35 36 37

报文信息 字节长度 解析
9c 29 76 0e 4a 57 5 本机mac地址9C-29-76-0E-4A-57
ac b5 7d 8a 12 5c 5 它机mac地址AC-B5-7D-8A-12-5C
08 00 2 IPV4(0x0800)
45 1 0100(version:4)0101(header Len:20bytes(5))
00 1 显式拥塞通知:不支持ECN传输(0)
00 2a 2 Total Length:42
72 3d 2 标识:0x723d(29245)
40 00 2 标志:0x40
80 1 生存时间:128
06 1 协议:TCP(6)
f4 73 2 标头校验和:0xf473
c0 a8 09 65 4 源地址:192.168.9.101
c0 a8 09 67 4 目的地地址:192.168.9.103
38 b6 2 源端口:14518
1f 90 2 目标端口:8080
ed 4a d5 6a 4 序列号(原始):3981104490
7c d7 7d 3d 4 确认号(原始):2094497085
50 18 2 标志:0x018(PSH,ACK)
40 29 2 Window:16425
95 41 2 校验和:0x9541[未验证]
00 00 2 紧急指针:0
31 32 33 34 35 36 37 7 TCP段数据(ascii内容:1234567)

C++ winpcap网络抓包代码实现,以及抓包内容解析。相关推荐

  1. (转载)网络抓包原理及常用抓包工具

    感谢和转载于: https://blog.csdn.net/l61052319940708/article/details/80624900 本文以App作为例子,实际应用不限于App范围. 前言:本 ...

  2. 七周二次课(1月23日) 10.6 监控io性能 10.7 free命令 10.8 ps命令 10.9 查看网络状态 10.10 linux下抓包...

    七周二次课(1月23日) 10.6 监控io性能 10.7 free命令 10.8 ps命令 10.9 查看网络状态 10.10 linux下抓包 ========================== ...

  3. VB网络编程(webbrowser应用及Inet抓包封包)

    网络的重要性不用我说,所以关于网络的编程对我我们来说也是非常重要,非常实用的! 但是我在网络上却没有看到多少关于VB网络编程方面的知识,一方面是VB用的人比较少,不会用就说VB不好(个人认为学好VB以 ...

  4. linux 网络命令 dns,[LN_03] Linux网络环境查看(网卡|路由|DNS|IP)、网络测试命令(端口探测|路由跟踪|抓包|ssh连接)...

    一.Linux网络环境查看命令 1. 查看&临时配置网络状态命令 # 查看IP.MAC.Mask ifconfig # 临时设置指定网卡的网络配置 ifconfig eht0 192.168. ...

  5. 网络数据采集分析工具tcpdump定义抓包过滤器

    Unix 下的一个 网络数据采集分析工具 -- Tcpdump,也就是我们常说的抓包工具. 与它功能类似的工具有 wireshark ,不同的是,wireshark 有图形化界面,而 tcpdump ...

  6. Web端测试——F12的代码调试与抓包

    最近很多同学问我浏览器的F12是什么东东?是干什么用的?为了解决大家的疑问,我特意写了这篇文章,总结了F12的使用. 下面的讲解,主要是以Microsoft Edge浏览器和360极速浏览器中的截图为 ...

  7. windows phone 网络开发三部曲(一)各种包的各种抓法

    首先感谢大家对我上一篇博客的支持,让我也体验了一把上榜的感觉. 这无疑是对我这个刚刚打算,认真写写博客的人的莫大的鼓励,再次感谢(鞠躬)!! 接下来想和大家分享一些关于windows phone网络开 ...

  8. 网络爬虫---抓包分析,用抓包分析爬取腾讯视频某视频所有评论(Fiddler工具包的分享)

    抓包分析,用抓包分析爬取腾讯视频某视频所有评论(Fiddler工具包的分享) 文章目录 抓包分析,用抓包分析爬取腾讯视频某视频所有评论(Fiddler工具包的分享) 一.抓包分析 1.下载工具并安装 ...

  9. java防抓包_iapp防止抓包代码

    用iapp制作互赞软件的时候经常被别人抓包api导致亏损,利用以下代码即可防止抓包,加入载事件即可. 代码如下: s zt = false java(nis,null,"java.net.N ...

最新文章

  1. android第九步文件的保存和读取
  2. [转载翻译][重新整理]西川善司的”METAL GEAR SOLID 4”图形讲座(5)
  3. 【MATLAB教程案例1】通信系统中成形滤波器原理的MATLAB设计实现
  4. 定义一个结构体指针需要分配存储空间
  5. Django路由分发
  6. XP的DNS服务器(BIND)配置
  7. 对于白神贪心问题的感悟
  8. 局域网物理机怎么访问虚拟机
  9. linux下文件系统创建
  10. Django REST Framework API Guide 02
  11. primefaces教程_Primefaces面板,PanelGrid和PanelMenu示例教程
  12. Kubernetes网络策略,这一篇就够了
  13. Qt —— 完美制作win系统扬声器、麦克风控制程序
  14. mysql sniffer下载_Gitee 极速下载
  15. python之matplotlib画二元函数图像
  16. matlab满秩分解函数,matlab满秩分解
  17. 素数问题与质因子分解
  18. 常见latch闩锁等待
  19. python画饼图柱状图_荐【python数据分析(24)】Matplotlib库基本图形绘制(1)(线形图、柱状图、堆叠图、面积图、填图、饼图)...
  20. 软件架构非功能需求——互操作性

热门文章

  1. 华氏温度与摄氏温度对照表(笔记)
  2. 华为P20 如时升Android 9.0,华为P20系列升级EMUI9.0之后简直太流畅太完美!
  3. HTML5 Canvas 绘制库存变化折线 计算出库存周转率
  4. PGA内存空间的分配与回收
  5. Egg 1. 快速开始 Quick Start 1.3 一步步 Step by Step 1.3.6 添加扩展 ~ 1.4 结论
  6. 量子前沿英雄谱|Marin Soljačić(马林·索尔季奇)
  7. 权威服务器怎么修改ttl值,Windows服务器修改默认TTL值的方法
  8. 电气器件系列三十二:电缸
  9. 猿来小课web前端介绍html语言基础学习
  10. Verilog简易电梯控制系统(2层)