WinPcap和Libpcap的最强大的特性之一,是拥有过滤数据包的引擎。 它提供了有效的方法去获取网络中的某些数据包,这也是WinPcap捕获机制中的一个组成部分。 用来过滤数据包的函数是 pcap_compile() 和pcap_setfilter() 。

pcap_compile() 它将一个高层的布尔过滤表达式编译成一个能够被过滤引擎所解释的低层的字节码。有关布尔过滤表达式的语法可以参见 Filtering expression syntax 这一节的内容。

pcap_setfilter() 将一个过滤器与内核捕获会话向关联。当 pcap_setfilter() 被调用时,这个过滤器将被应用到来自网络的所有数据包,并且,所有的符合要求的数据包 (即那些经过过滤器以后,布尔表达式为真的包) ,将会立即复制给应用程序。

现在,我们可以捕捉并过滤网络流量了,那就让我们学以致用,来做一个简单使用的程序吧。

在本讲中,我们将会利用上一讲的一些代码,来建立一个更实用的程序。 本程序的主要目标是展示如何解析所捕获的数据包的协议首部。这个程序可以称为UDPdump,打印一些网络上传输的UDP数据的信息。

我们选择分析和现实UDP协议而不是TCP等其它协议,是因为它比其它的协议更简单,作为一个入门程序范例,是很不错的选择。让我们看看代码:

[cpp] view plaincopy
  1. #include "pcap.h"
  2. /* 4字节的IP地址 */
  3. typedef struct ip_address{
  4. u_char byte1;
  5. u_char byte2;
  6. u_char byte3;
  7. u_char byte4;
  8. }ip_address;
  9. /* IPv4 首部 */
  10. typedef struct ip_header{
  11. u_char  ver_ihl;        // 版本 (4 bits) + 首部长度 (4 bits)
  12. u_char  tos;            // 服务类型(Type of service)
  13. u_short tlen;           // 总长(Total length)
  14. u_short identification; // 标识(Identification)
  15. u_short flags_fo;       // 标志位(Flags) (3 bits) + 段偏移量(Fragment offset) (13 bits)
  16. u_char  ttl;            // 存活时间(Time to live)
  17. u_char  proto;          // 协议(Protocol)
  18. u_short crc;            // 首部校验和(Header checksum)
  19. ip_address  saddr;      // 源地址(Source address)
  20. ip_address  daddr;      // 目的地址(Destination address)
  21. u_int   op_pad;         // 选项与填充(Option + Padding)
  22. }ip_header;
  23. /* UDP 首部*/
  24. typedef struct udp_header{
  25. u_short sport;          // 源端口(Source port)
  26. u_short dport;          // 目的端口(Destination port)
  27. u_short len;            // UDP数据包长度(Datagram length)
  28. u_short crc;            // 校验和(Checksum)
  29. }udp_header;
  30. /* 回调函数原型 */
  31. void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);
  32. int main()
  33. {
  34. pcap_if_t *alldevs;
  35. pcap_if_t *d;
  36. int inum;
  37. int i=0;
  38. pcap_t *adhandle;
  39. char errbuf[PCAP_ERRBUF_SIZE];
  40. u_int netmask;
  41. char packet_filter[] = "ip and udp";
  42. struct bpf_program fcode;
  43. /* 获得设备列表 */
  44. if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
  45. {
  46. fprintf(stderr,"Error in pcap_findalldevs: %s/n", errbuf);
  47. exit(1);
  48. }
  49. /* 打印列表 */
  50. for(d=alldevs; d; d=d->next)
  51. {
  52. printf("%d. %s", ++i, d->name);
  53. if (d->description)
  54. printf(" (%s)/n", d->description);
  55. else
  56. printf(" (No description available)/n");
  57. }
  58. if(i==0)
  59. {
  60. printf("/nNo interfaces found! Make sure WinPcap is installed./n");
  61. return -1;
  62. }
  63. printf("Enter the interface number (1-%d):",i);
  64. scanf("%d", &inum);
  65. if(inum < 1 || inum > i)
  66. {
  67. printf("/nInterface number out of range./n");
  68. /* 释放设备列表 */
  69. pcap_freealldevs(alldevs);
  70. return -1;
  71. }
  72. /* 跳转到已选设备 */
  73. for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
  74. /* 打开适配器 */
  75. if ( (adhandle= pcap_open(d->name,  // 设备名
  76. 65536,     // 要捕捉的数据包的部分重生之大文豪www.dwhao.com
  77. // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容
  78. PCAP_OPENFLAG_PROMISCUOUS,         // 混杂模式
  79. 1000,      // 读取超时时间
  80. NULL,      // 远程机器验证
  81. errbuf     // 错误缓冲池
  82. ) ) == NULL)
  83. {
  84. fprintf(stderr,"/nUnable to open the adapter. %s is not supported by WinPcap/n");
  85. /* 释放设备列表 */
  86. pcap_freealldevs(alldevs);
  87. return -1;
  88. }
  89. /* 检查数据链路层,为了简单,我们只考虑以太网 */
  90. if(pcap_datalink(adhandle) != DLT_EN10MB)
  91. {
  92. fprintf(stderr,"/nThis program works only on Ethernet networks./n");
  93. /* 释放设备列表 */
  94. pcap_freealldevs(alldevs);
  95. return -1;
  96. }
  97. if(d->addresses != NULL)
  98. /* 获得接口第一个地址的掩码 */
  99. netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
  100. else
  101. /* 如果接口没有地址,那么我们假设一个C类的掩码 */
  102. netmask=0xffffff;
  103. //编译过滤器
  104. if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) <0 )
  105. {
  106. fprintf(stderr,"/nUnable to compile the packet filter. Check the syntax./n");
  107. /* 释放设备列表 */
  108. pcap_freealldevs(alldevs);
  109. return -1;
  110. }
  111. //设置过滤器
  112. if (pcap_setfilter(adhandle, &fcode)<0)
  113. {
  114. fprintf(stderr,"/nError setting the filter./n");
  115. /* 释放设备列表 */
  116. pcap_freealldevs(alldevs);
  117. return -1;
  118. }
  119. printf("/nlistening on %s.../n", d->description);
  120. /* 释放设备列表 */
  121. pcap_freealldevs(alldevs);
  122. /* 开始捕捉 */
  123. pcap_loop(adhandle, 0, packet_handler, NULL);
  124. return 0;
  125. }
  126. /* 回调函数,当收到每一个数据包时会被libpcap所调用 */
  127. void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
  128. {
  129. struct tm *ltime;
  130. char timestr[16];
  131. ip_header *ih;
  132. udp_header *uh;
  133. u_int ip_len;
  134. u_short sport,dport;
  135. time_t local_tv_sec;
  136. /* 将时间戳转换成可识别的格式 */
  137. local_tv_sec = header->ts.tv_sec;
  138. ltime=localtime(&local_tv_sec);
  139. strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);
  140. /* 打印数据包的时间戳和长度 */
  141. printf("%s.%.6d len:%d ", timestr, header->ts.tv_usec, header->len);
  142. /* 获得IP数据包头部的位置 */
  143. ih = (ip_header *) (pkt_data +
  144. 14); //以太网头部长度
  145. /* 获得UDP首部的位置 茶叶www.aichar.com*/
  146. ip_len = (ih->ver_ihl & 0xf) * 4;
  147. uh = (udp_header *) ((u_char*)ih + ip_len);
  148. /* 将网络字节序列转换成主机字节序列 */
  149. sport = ntohs( uh->sport );
  150. dport = ntohs( uh->dport );
  151. /* 打印IP地址和UDP端口 */
  152. printf("%d.%d.%d.%d.%d -> %d.%d.%d.%d.%d/n",
  153. ih->saddr.byte1,
  154. ih->saddr.byte2,
  155. ih->saddr.byte3,
  156. ih->saddr.byte4,
  157. sport,
  158. ih->daddr.byte1,
  159. ih->daddr.byte2,
  160. ih->daddr.byte3,
  161. ih->daddr.byte4,
  162. dport);
  163. }

转载于:https://www.cnblogs.com/jiangyea/p/3530149.html

winpcap编程 解析数据包相关推荐

  1. 利用WinPcap技术捕获数据包

    前言  随着网络入侵的不断发展,网络安全变得越来越重要,于是网络入侵取证系统的研究也变得日益重要.在网络入侵取证系统中,对网络上传送的数据包进行有效的监听即捕获包是目前取证的关键技术,只有进行高效的数 ...

  2. python解析数据包_python – 解析UDP数据包

    我正在构建一个UDP服务器来解析和验证传入的UDP数据包.我能够接收和解析数据包,但标头值不是我所期望的. 这是传入数据包的结构 包ID(4个字节) 包序列(4个字节) XOR密钥(2个字节) 数据包 ...

  3. Python 运用Dpkt库解析数据包

    dpkt是一个用于解析和操作网络数据包的Python模块.它提供了对各种网络协议(如以太网.IP.TCP.UDP.ICMP等)的解析功能,并允许访问和操作数据包的各个字段和参数.可以用于解析从各种抓包 ...

  4. Win10在Dev-C++中用Winpcap监控IP数据包

    如有错误欢迎指正 首先是在Dev-C++中配置Winpcap的问题,可以看这篇文章 win10在Dev-C++中配置winpcap_m0_59834108的博客-CSDN博客 配置完之后就可以开始写代 ...

  5. 深度剖析WinPcap之(九)——数据包的发送过程(8)

    1.7.3    发送队列方式的接口实现 1.7.3.1             PacketSendPackets函数 函数发送数据包队列到网络,函数原型如下: INT PacketSendPack ...

  6. Qt工作笔记-发送端发送Json格式的数据包,接收端解析数据包

    原理以及运行 原理是因为QJsonDocument提供了一个函数toJson 可以直接把Json数据转成QByteArray,这样就可以直接发送数据包,然后再按照常规方法解析即可,本源码中含解析内容, ...

  7. java 解析数据包_java - 如何在Java中正确解析TCP数据包? - 堆栈内存溢出

    我目前有一个简单的TCP服务器,该服务器调用一个函数,并在每个新的传入数据包上以字节数组的形式将二进制TCP有效负载传递给它,解析它的正确方法是什么? 我试图通过将其切成不同的字节数组并分别进行处理来 ...

  8. java 解析数据包_一种基于Java语言的网络通讯数据包解析方法与流程

    本发明涉及网络通讯领域,特别涉及一种基于Java语言的网络通讯数据包解析方法. 背景技术: 计算机系统和网络的大量普及使用使全球跨入了信息化时代.但是,正由于现代社会中几乎一切都在"计算机化 ...

  9. python爬虫解析数据包_Python网络爬虫之三种数据解析方式

    引入 回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指 ...

最新文章

  1. Exchange 2013部署系列之(七)配置SSL多域名证书
  2. Debian wheezy安装Redis 3.0
  3. VMware Esxi-5.1 简介与安装
  4. F-Stack:ff_run函数详解
  5. 希尔排序python 简书_数据结构_排序_直接插入+希尔排序
  6. ART、JIT、AOT、Dalvik之间有什么关系?
  7. 《Linux启动过程分析》内核挂载根文件系统
  8. Excel十八个快捷键
  9. 移动通信网络中的无线电通讯原理
  10. 人生第一份跳槽面试经历
  11. 项目干系人管理-知识领域
  12. python网格搜索优化参数_python - 用于管道的网格搜索参数网格的说明 - SO中文参考 - www.soinside.com...
  13. android知乎小圆圈刷新效果
  14. 异丁酸酐(CAS 97-72-3)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  15. 人工智能考试复习题(自己背的)
  16. ros接入IMU数据,打包发布topic
  17. QuickBMS通用解包器使用指南
  18. 广州的程序员收入水平如何?我来和大家聊一聊真实情况
  19. Raspberry PI连接XBOX ONE 手柄
  20. 论文投稿指南——中文核心期刊推荐(建筑科学 2)

热门文章

  1. 从架构到代码:软件开发最新趋势解析
  2. 如何用 Git 优雅回退代码,别搞错了!
  3. 干货 | 携程酒店MOCK全链路实践
  4. Java 多线程常见问题
  5. 数据库:MySQL索引总结
  6. Android --- 数据库存储的是正确的时间格式(2021-06-17 21:47:23)但是在获取的时候变成了(2021-06-17T13:47:23.000+00:00)
  7. php数据结构链表代码,数据结构之线性表——链式存储结构之单链表(php代码实现)...
  8. 惊艳!亚洲规模最大、标准最高的金融数据中心 |上证所金桥技术中心基地项目...
  9. 电缆的选择及载流量的计算,超实用~
  10. 数据中心节能专题—他山之石可以攻玉