winpcap捕捉网络数据包
- 格式:doc
- 大小:369.70 KB
- 文档页数:17
winpcap编程解析数据包WinPcap和Libpcap的最强⼤的特性之⼀,是拥有过滤数据包的引擎。
它提供了有效的⽅法去获取⽹络中的某些数据包,这也是WinPcap捕获机制中的⼀个组成部分。
⽤来过滤数据包的函数是和。
它将⼀个⾼层的布尔过滤表达式编译成⼀个能够被过滤引擎所解释的低层的字节码。
有关布尔过滤表达式的语法可以参见这⼀节的内容。
将⼀个过滤器与内核捕获会话向关联。
当被调⽤时,这个过滤器将被应⽤到来⾃⽹络的所有数据包,并且,所有的符合要求的数据包 (即那些经过过滤器以后,布尔表达式为真的包) ,将会⽴即复制给应⽤程序。
现在,我们可以捕捉并过滤⽹络流量了,那就让我们学以致⽤,来做⼀个简单使⽤的程序吧。
在本讲中,我们将会利⽤上⼀讲的⼀些代码,来建⽴⼀个更实⽤的程序。
本程序的主要⽬标是展⽰如何解析所捕获的数据包的协议⾸部。
这个程序可以称为UDPdump,打印⼀些⽹络上传输的UDP数据的信息。
我们选择分析和现实UDP协议⽽不是TCP等其它协议,是因为它⽐其它的协议更简单,作为⼀个⼊门程序范例,是很不错的选择。
让我们看看代码:[cpp]01. #include "pcap.h"02.03. /* 4字节的IP地址 */04. typedef struct ip_address{05. u_char byte1;06. u_char byte2;07. u_char byte3;08. u_char byte4;09. }ip_address;10.11. /* IPv4 ⾸部 */12. typedef struct ip_header{13. u_char ver_ihl; // 版本 (4 bits) + ⾸部长度 (4 bits)14. u_char tos; // 服务类型(Type of service)15. u_short tlen; // 总长(Total length)16. u_short identification; // 标识(Identification)17. u_short flags_fo; // 标志位(Flags) (3 bits) + 段偏移量(Fragment offset) (13 bits)18. u_char ttl; // 存活时间(Time to live)19. u_char proto; // 协议(Protocol)20. u_short crc; // ⾸部校验和(Header checksum)21. ip_address saddr; // 源地址(Source address)22. ip_address daddr; // ⽬的地址(Destination address)23. u_int op_pad; // 选项与填充(Option + Padding)24. }ip_header;25.26. /* UDP ⾸部*/27. typedef struct udp_header{28. u_short sport; // 源端⼝(Source port)29. u_short dport; // ⽬的端⼝(Destination port)30. u_short len; // UDP数据包长度(Datagram length)31. u_short crc; // 校验和(Checksum)32. }udp_header;33.34. /* 回调函数原型 */35. void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);36.37.38. int main()39. {40. pcap_if_t *alldevs;41. pcap_if_t *d;42. int inum;43. int i=0;44. pcap_t *adhandle;45. char errbuf[PCAP_ERRBUF_SIZE];46. u_int netmask;47. char packet_filter[] = "ip and udp";48. struct bpf_program fcode;49.50. /* 获得设备列表 */51. if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)52. {53. fprintf(stderr,"Error in pcap_findalldevs: %s/n", errbuf);54. exit(1);55. }55. }56.57. /* 打印列表 */58. for(d=alldevs; d; d=d->next)59. {60. printf("%d. %s", ++i, d->name);61. if (d->description)62. printf(" (%s)/n", d->description);63. else64. printf(" (No description available)/n");65. }66.67. if(i==0)68. {69. printf("/nNo interfaces found! Make sure WinPcap is installed./n");70. return -1;71. }72.73. printf("Enter the interface number (1-%d):",i);74. scanf("%d", &inum);75.76. if(inum < 1 || inum > i)77. {78. printf("/nInterface number out of range./n");79. /* 释放设备列表 */80. pcap_freealldevs(alldevs);81. return -1;82. }83.84. /* 跳转到已选设备 */85. for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);86.87. /* 打开适配器 */88. if ( (adhandle= pcap_open(d->name, // 设备名89. 65536, // 要捕捉的数据包的部分90. // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容91. PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式92. 1000, // 读取超时时间93. NULL, // 远程机器验证94. errbuf // 错误缓冲池95. ) ) == NULL)96. {97. fprintf(stderr,"/nUnable to open the adapter. %s is not supported by WinPcap/n");98. /* 释放设备列表 */99. pcap_freealldevs(alldevs);100. return -1;101. }102.103. /* 检查数据链路层,为了简单,我们只考虑以太⽹ */104. if(pcap_datalink(adhandle) != DLT_EN10MB)105. {106. fprintf(stderr,"/nThis program works only on Ethernet networks./n");107. /* 释放设备列表 */108. pcap_freealldevs(alldevs);109. return -1;110. }111.112. if(d->addresses != NULL)113. /* 获得接⼝第⼀个地址的掩码 */114. netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr; 115. else116. /* 如果接⼝没有地址,那么我们假设⼀个C类的掩码 */117. netmask=0xffffff;118.119.120. //编译过滤器121. if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) <0 )122. {123. fprintf(stderr,"/nUnable to compile the packet filter. Check the syntax./n");124. /* 释放设备列表 */125. pcap_freealldevs(alldevs);126. return -1;127. }128.129. //设置过滤器130. if (pcap_setfilter(adhandle, &fcode)<0)131. {132. fprintf(stderr,"/nError setting the filter./n");133. /* 释放设备列表 */134. pcap_freealldevs(alldevs);135. return -1;136. }137.138. printf("/nlistening on %s.../n", d->description);139.140. /* 释放设备列表 */141. pcap_freealldevs(alldevs);142.143. /* 开始捕捉 */144. pcap_loop(adhandle, 0, packet_handler, NULL);145.146. return 0;147. }148.149. /* 回调函数,当收到每⼀个数据包时会被libpcap所调⽤ */150. void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data) 151. {152. struct tm *ltime;153. char timestr[16];154. ip_header *ih;155. udp_header *uh;156. u_int ip_len;157. u_short sport,dport;158. time_t local_tv_sec;159.160. /* 将时间戳转换成可识别的格式 */161. local_tv_sec = header->_sec;162. ltime=localtime(&local_tv_sec);163. strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);164.165. /* 打印数据包的时间戳和长度 */166. printf("%s.%.6d len:%d ", timestr, header->_usec, header->len);167.168. /* 获得IP数据包头部的位置 */169. ih = (ip_header *) (pkt_data +170. 14); //以太⽹头部长度171.172. /* 获得UDP⾸部的位置 */173. ip_len = (ih->ver_ihl & 0xf) * 4;174. uh = (udp_header *) ((u_char*)ih + ip_len);175.176. /* 将⽹络字节序列转换成主机字节序列 */177. sport = ntohs( uh->sport );178. dport = ntohs( uh->dport );179.180. /* 打印IP地址和UDP端⼝ */181. printf("%d.%d.%d.%d.%d -> %d.%d.%d.%d.%d/n",182. ih->saddr.byte1,183. ih->saddr.byte2,184. ih->saddr.byte3,185. ih->saddr.byte4,186. sport,187. ih->daddr.byte1,188. ih->daddr.byte2,189. ih->daddr.byte3,190. ih->daddr.byte4,191. dport);192. }。
WinPcap的简介winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。
开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。
它提供了以下的各项功能:1> 捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报;2> 在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;3> 在网络上发送原始的数据报;4> 收集网络通信过程中的统计信息。
winpcap的主要功能在于独立于主机协议(如TCP/IP)而发送和接收原始数据报。
也就是说,winpcap 不能阻塞,过滤或控制其他应用程序数据报的发收,它仅仅只是监听共享网络上传送的数据报。
因此,它不能用于QoS调度程序或个人防火墙。
目前,winpcap开发的主要对象是windows NT/2000/XP,这主要是因为在使用winpcap的用户中只有一小部分是仅使用windows 95/98/Me,并且微软也已经放弃了对win9x 的开发。
因此本文相关的程序T-ARP也是面向NT/2000/XP用户的。
WinPcap的安装和例程调试By 曹佳caojia@1.DownLoad2.安装解压得三文件:WinPcap_4_0_1_drivel.exe,WpcapSrc_4_0_1_Source_code.zip和WpdPack_4_0_1_Include_Lib.zip,第一个是驱动的安装程序,第二个是驱动的源代码,第三个是使用Winpcap所要用到的所有.h文件和.lib文件。
1)安装驱动(WinPcap_4_0_1_drivel.exe)2)WpdPack_4_0_1_Include_Lib.zip解压到一个“正式的”位置(用来配置编程环境)3)配置VC6.0环境在Tools->options->Directories里面加入解压以后的include文件夹,在Tools->options->Directories的lib里面加入解压以后的lib文件夹。
因为项目需要,而且以前从没用过Winpcap,所以不得不从头学起。
以前虽然看过winsocket,但是,Winpcap的第一个程序,我花了很长时间才编译通过。
对于初学者来说,不太好做的可能是编译程序之前应该做什么事。
我就大体说一下我的过程。
首先先大体介绍下Winpcap。
winpcap(windows packet capture)windows平台下一个免费,公共的网络访问系统。
开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。
它提供了以下的各项功能:1> 捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交换的数据包;2> 在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉;3> 在网络上发送原始的数据包;4> 收集网络通信过程中的统计信息。
具体介绍参见/view/696423.htm这里有Winpcap的详细介绍。
下面说一下你在编译Winpcap之前要做的事情。
1 下载Winpcap安装包,地址/install/default.htm。
2 然后到/devel.htm下载WinPcap developer's pack包,解压,里面有配置好的例子和include library。
3 在VC6.0菜单中,点Tolls->Options->Directories中的include files 和library files中添加包里面的include和library。
然后我们就来编写一个最简单的Winpcap程序——获取已连接的网络适配器列表。
首先新建一个工程,选择Win32 Console Application,工程名我们设为winpcap.然后这这个工程中新建一个C++源文件,名字winpcap。
在里面填写如下代码:#include <pcap.h>main( )pcap_if_t *alldevs;pcap_if_t *d;int i=0;char errbuf[PCAP_ERRBUF_SIZE];if (pcap_findalldevs(&alldevs, errbuf) == -1){fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf); exit(1);}for(d= alldevs; d != NULL; 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;}pcap_freealldevs(alldevs);return 0;}运行之前我们要手动给它添加一个动态链接库wpcap.lib,方法是在菜单Project中点Settings,然后在选项中选Link,在library modules 后面填上wpcap.lib,注意和前面的要有空格隔开。
基于WinPcap的网络分析研究与实现摘要近几年,我国经济发展迅速,各个领域的事业都趋于完善。
在网络信息技术的不断发展下,通过对WinPcap的应用,真正实现了Windows下网络数据包的捕获技术,下文将详细阐述IP、Tcp等等协议的解析过程。
网络数据的储存通过msspl来实现,进而建立系统硬件运行环境。
对局域网,通过测试实现了全局监控。
关键词信息技术;网络分析;分析与研究;运行环境;数据包;源代码1 应用环境网络监控系统承载介质中,硬件与软件监控系统共同构成网络监控。
网络监控系统标准功能是对局域网中的违规行为进行记录与监控。
在国外一些发达国家,有两款软件Ethereal与Sniffer,后者主要任务就是给网管及时提供网络监视情况与数据包捕以及故障分析等内容,这样能方便网管对现场进行迅速的故障处理以及诊断能力。
与此同时,还能使用户得到更好的网络管理以及故障分析功能。
前者作为一种可以捕获数据包,并且将这个数据包的信息显示出来,这样的一款网络数据包分析软件,在通用许可证的保障范围内,其数据包分析软件用户能免费得到。
除此之外,还可以得到其源代码,并且也能够根据自身的需要来将其源代码进行修改。
现阶段,Wireshark是全球应用最多的一种网络数据包分析软件[1]。
2 Win Pcap研究抓包的过程,是通过用户级的程序接口来完成的。
在这些接口中,用户程序能够利用内核驱动提供的高级特性。
作为WinPcap所提供的2个库,PACKET 提供一个底层api,应用这个库能够访问驱动的函数。
这些函数能够实现来抓包时,网络硬件与操作系统独立。
NDIS作为一种管理网络适配器的驱动程序和协议驱动之间的规范。
其还是一个可以让协议驱动发生与接收数据包并且不用看特定的适配器或者特定的Win32操作系统的封装。
捕获数据包是通过NPF来实现的。
在进行数据包的捕获时,数据包的监控任务是一个网络接口,进而应用程序才能够完整抹除这部分数据包。
基于WinPcap的数据包捕获及应用
张伟;王韬;潘艳辉;郝震华
【期刊名称】《计算机工程与设计》
【年(卷),期】2008(29)7
【摘要】网络数据包捕获是进行网络分析的基础,通过对Windows操作系统平台下网络数据包捕获模型的论述,重点对基于NDIS的优秀包捕获开发包WinPcap的结构和功能的进行了详细的介绍和分析,实现了如何在VC 6.0环境下借助WinPcap提供的各个接口函数对网卡进行编程进而对网络数据包进行捕获和分析的方法,最后突出叙述了数据包捕获在网络分析中的应用.
【总页数】3页(P1649-1651)
【作者】张伟;王韬;潘艳辉;郝震华
【作者单位】解放军军械工程学院计算机工程系,河北石家庄,050003;解放军军械工程学院计算机工程系,河北石家庄,050003;解放军军械工程学院计算机工程系,河北石家庄,050003;解放军军械工程学院计算机工程系,河北石家庄,050003
【正文语种】中文
【中图分类】TP393.08
【相关文献】
1.基于WinPcap的网络数据包捕获系统设计与实现 [J], 黄培花;宋科
2.基于Winpcap网络数据包的捕获与存储技术研究 [J], 李星;熊列彬;王昌
3.基于WinPcap的公安信息网络数据包捕获分析系统研究 [J], 刘传军
4.基于WinPcap网络数据包捕获实现 [J], 赵建勋
5.基于Winpcap网络数据包的捕获与存储技术研究 [J], 李星;熊列彬;王昌
因版权原因,仅展示原文概要,查看原文内容请购买。
pcap原理
PCAP(Packet Capture)是一种捕获代理网络数据包的技术。
它是网络编程中非常重要的一种技术,可以帮助开发人员分析、调试和研究网络协议。
PCAP通常用于抓取广域网(WAN)或局域网(LAN)上的数据包,以帮助管理员、开发人员进行网络故障诊断与分析。
在计算机网络中,数据是以数据包的形式传输的。
当一个计算机从网络上接收到数据包时,它会把数据包交给操作系统,而操作系统需要将数据包传递给应用程序,以便进行二次开发或分析。
在这个过程中,操作系统需要使用一定的技术来对数据包进行捕获和处理。
而PCAP就是一种捕获和处理网络数据包的技术。
PCAP技术基于操作系统内核层的实现来进行数据包的捕获。
在Linux中,内核中实现了一个Packet Socket接口,用于向用户程序提供数据包的捕获和发送功能。
Windows中则是使用WinPcap或Npcap等第三方库来实现PCAP功能。
PCAP技术可以捕获数据包并进行多种操作,例如过滤、深度分析等。
通过PCAP 技术,开发人员或管理员可以对数据包进行捕获和分析,以便定位网络问题,或优化网络性能。
常见的分析工具包括Wireshark等,通过这些工具的分析,可以有效的发现网络问题,快速解决故障。
总的来说,PCAP技术已经成为了一个网络开发人员不可缺少的技能。
掌握PCAP 技术可以帮助开发人员更全面地了解网络协议和通信机制,定位网络问题,提高
网络性能,同时可以提升工作效率和开发速度。
第三章 WinPcap研究3.1 WinPcap简介WinPcap是由意大利的Fulvio Risso 和 Loris Degioanni等人实现的应用于Win32平台数据包捕获与分析的一种驱动软件包,并提供了在Windows操作系统下的开发源代码,是一套高性能API封装库,有一套标准的抓包接口专门用于网络数据包的截获,并在其基础上增加了自定义数据包的发送能力以及针对Win32平台的扩展函数,独立于Windows操作系统的协议栈。
不同版本的Windows系统都有自己的内核模块和用户层模块,所以使用Windows SDK开发的嗅探程序在不同的Windows操作系统版本下需要重新进行编译。
WinPcap为Win32平台提供了一个公共的接口Packet.dll,使得程序可以运行在不同版本的Windows平台上,而无需重新编译。
WinPcap的主要功能在于独立于主机协议和TCP-IP协议发送和接收原始数据包,也就是说,WinPcap不能阻塞、过于或控制其他应用程序对数据报的收发,它只是绕过系统原有的协议栈监听网络上传送的数据包。
因此,它不能用于QoS 调度程序或个人防火墙。
WinPcap有以下几方面的功能:(1)捕获原始数据包,无论它是发往某台机器的,还是在其他设备(共享媒介)上进行交换的。
(2)在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉。
(3)将原始数据包通过网络发送出去。
(4)收集并统计网络流量信息。
3.1.1 WinPcap框架的各个组成部分Packets Network图3-1 WinPcap框架的组成部分如图3-1所示,WinPcap包括内核级的数据包监听驱动NPF、低级动态链接库(Pcaket.dll)和高级系统无关库(Wpcap.dll)。
在利用WinPcap抓包时,要绕过操作系统的协议栈来访问网络上传输的原始数据包,这就要求WinPcap的一部分要运行在操作系统核心层,直接与网络接口驱动交互,这就是NPF驱动要完成的任务,它是依赖于操作系统。
Winpcap使⽤前⾔随着⽹络⼊侵的不断发展,⽹络安全变得越来越重要,于是⽹络⼊侵取证系统的研究也变得⽇益重要。
在⽹络⼊侵取证系统中,对⽹络上传送的数据包进⾏有效的监听即捕获包是⽬前取证的关键技术,只有进⾏⾼效的数据包捕获,⽹络管理员才能对所捕获的数据进⾏⼀系列的分析,从⽽进⾏可靠的⽹络安全管理。
1winpcap简介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是不依赖于操作系统的。
pcap 抓包原理在计算机网络领域中,抓包是一种用于捕获和分析网络通信数据的技术。
pcap (Packet Capture)是一种用于数据包捕获的库和工具,它提供了一种通用的机制来捕获网络接口上的原始数据包。
pcap 抓包原理涉及到以下几个方面:1.数据链路层数据链路层是网络协议栈中负责管理和传输数据帧的层级。
在pcap 抓包过程中,数据链路层负责接收和发送数据帧,其中数据帧是网络通信中最小的单位,它包括数据以及与之关联的控制信息。
每个数据帧都有一个独特的MAC地址。
2.网络设备和驱动程序在pcap 抓包过程中,需要借助网络设备和相应的驱动程序来进行数据包的捕获。
网络设备可以是网卡、交换机、路由器等。
驱动程序负责和网络设备进行交互,将抓取到的数据包传递给操作系统的上层应用程序。
3.内核模式与用户模式的交互 pcap 抓包过程中,内核模式与用户模式之间需要进行数据的传递和交互。
内核模式负责在数据链路层接收和发送数据包,将抓到的数据包传递给用户模式的抓包程序。
用户模式的抓包程序可以使用pcap库函数来对数据包进行捕获和处理。
4.数据包过滤和缓冲区 pcap 抓包可以根据用户定义的规则对数据包进行过滤,只抓取满足条件的数据包。
常见的过滤规则包括源/目的IP地址、端口号、协议类型等。
通过对数据包的过滤,可以减少捕获数据包的数量,提高分析效率。
另外,pcap 抓包还使用缓冲区来存储抓取到的数据包,在缓冲区满时,新的数据包将会覆盖旧的数据包。
5.数据包捕获过程 pcap 抓包的过程大致可以分为以下几个步骤:–打开网络设备或者读取已保存的数据包文件。
–设置数据包过滤规则,定义抓包的条件。
–进入抓包循环,在循环中不断抓取数据包,并将数据包传递给上层应用程序。
–处理抓取到的数据包,进行分析、解码、存储等操作。
在抓包的循环中,内核模式通过驱动程序接收数据包,然后将数据包传递给用户模式的抓包程序。
用户模式的抓包程序使用pcap库函数来处理数据包,可以对数据包进行解析、打印、存储等。
函数说明:Net::Pcap的功能由winpcap提供.Net::Pcap::findalldevs(\$err [,\%description])返回一个能被函数Net::Pcap::open_live()利用的所有网络设备的名字的列表,这些名字分别是%description中的键,如果提供了可选参数-散列%description,则它存放所有对应与前面的网络设备的描述信息;如果发生错误,则$err中会存放相应的错误消息。
Net::Pcap::open_live($dev, $snaplen, $promisc, $to_ms, \$err)该函数返回一个用来在网络上捕获包的描述符,$dev指定从哪个网络接口上捕获包,$snaplen设定捕获包的最大字节数,$promisc指定是否将该网络接口设置为混合模式,$to_ms 设定以毫秒度量的读超时时间,这是每次读取的时间阀值,如果有错误发生,则不会定义这个描述符,同时将这个错误信息写入参数$err中。
Net::Pcap::sendpacket($pcap_t, $packet)该函数用来发送数据包,$pcap_t是指定通过哪个网络接口来发送数据包的设备描述符,$packet是要发送的数据,这个数据中不需要包含MAC CRC ,因为网络接口的驱动会自动完成计算并添加。
Net::Pcap::close($pcap_t)关闭描述符$pcap_t所对应的的网络接口。
Net::Pcap::next($pcap_t, \%hdr)从描述符$pcap_t关联的的接口上抓取包,这些包的一些信息被放到hash表%hdr中。
如果没有获取包,则返回值和头部都会被设成无定义。
%hdr内容:len--报文的总长度caplen--包数据的实际长度tv_sec秒级别的时间戳值tv_usec毫秒级别的时间戳值Net::Pcap::compile($pcap_t, \$filter_t, $filter_str, $optimize, $netmask)$pcap_t 关联一个网络接口,$filter_str存放过滤字段描述,函数执行后把编译的结果放到\$filter_t中,如果$optimize为真,则对$filter_str进行优化处理。
windows dumpcap 用法
Windows Dumpcap 用法
Dumpcap 是 Wireshark 的一个命令行工具,它可以在 Windows 操作系统上运行。
它可以捕获网络数据包并将其保存到文件中,以便后续分析。
以下是 Windows Dumpcap 的用法:
1. 打开命令提示符窗口
在 Windows 操作系统上,按下 Win+R 键打开“运行”对话框。
输入 cmd 并按下 Enter 键打开命令提示符窗口。
2. 进入 Dumpcap 目录
在命令提示符窗口中输入 cd C:\Program Files\Wireshark,并按下Enter 键进入 Dumpcap 目录。
如果你的 Wireshark 安装在其他目录中,请相应地更改路径。
3. 运行 Dumpcap 命令
在命令提示符窗口中输入以下命令:
dumpcap -i 1 -w C:\capture.pcap
其中,“-i”参数指定要捕获的网络接口的编号,“-w”参数指定要保存数据包的文件名和路径。
这个例子中,我们将捕获编号为 1 的网络接口上的数据包,并将它们保存到 C:\capture.pcap 文件中。
4. 查看捕获的数据包
打开 Wireshark 软件,并导入刚才保存的 .pcap 文件。
你可以使用Wireshark 来查看和分析捕获的数据包。
总结
Windows Dumpcap 是一个强大而实用的命令行工具,它可以帮助你捕获网络数据包并将其保存到文件中。
通过使用 Dumpcap,你可以更好地了解网络通信过程,并找出其中的问题。
利用WIPCAP捕捉IP数据包分析局域网流量 1、背景知识 1.1、IP协议 IP(Internet Protocol,互联网协议)协议是TCP/IP协议族中最为核心的协议,所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。IP协议把传输层送来的消息封装成IP数据包,并把IP数据包传递给数据链路层。IP协议制定了统一的IP数据报格式,向传输层屏蔽了通信子网的差异,从而为消息的收发双方提供了一条透明的传输通道。 IP数据包结构如图1-1:
图1-1 IP包结构 1. 版本 IP数据报的第一个域是版本域,其长度为4bit,表示所使用的IP协议的版本。通信双方使用的IP协议的版本必须一致。版本域值为4则表示IPv4;版本域值为6则表示IPv6。当前的版本为IPv4。 2. 报头长度 报头长度域长度为4bit,它以4个字节为计算单位表示报头的长度,该长度不包含数据部分。报头中除了IP选项域与填充域之外,其他各项是定长的。因为很少使用IP选项功能,所以,该域的值一般为5,意味着报头的长度是5个4字节,也就是20个字节。 协议规定:IP数据报的报头长度必须是4字节的整数倍。当IP报头长度不是4字节的整数倍时,必须利用最后一个填充域“添0”来加以填充。 3. 服务类型 如图1-2所示,该字段占8bit,包括3bit的优先级字段,4bit的服务类型(type of service,TOS)字段和1bit的保留位,保留位必须置0。该字段用于指示路由器如何处理该数据报。
图1-2 服务类型字段结构 3bit的优先级表示数据报的重要性,共分8级,数值越大等级越高,优先级越高则表示数据报越重要(该字段值现在已被忽略)。 4bit的TOS字段分别表示:最小时延(D)、最大吞吐量(T)、最高可靠性(R)和最小费用(C)。每个位都有0或1两个值,但4bit中最多只能有一个位的值为1。如果所有4 bit均为0,那么就意味着是一般服务。 4. 总长度 总长度域占16 bit,它以字节为单位具体说明包括报头在内的整个IP数据包的总长度。利用报头长度字段和总长度字段,就可以知道I P数据报中数据内容的起始位置和长度。因为该字段有16 bit,所以IP数据报最长可达65535字节。尽管可以传送一个长达65535字节的IP数据报,但是大多数的链路层都要求对它进行分片,总长度不得超过最大传输单元MTU。当数据报被分片时,该字段的值也随着变化。 5. 标识 标识字段占16 bit,用来唯一地标识主机发送的每一份数据报,通常每发送一份报文它的值就会加1。当IP数据报必须进行分片时,这个标识域的值将被复制到所有数据报分片的标识域中。相同的标识域值使各数据报分片最后能正确地重装为原来的数据报。 6. 标志 标志字段占3bit,第一bit保留并总设为0;第二bit 是禁止分片标志DF,标识报文能否被分片,如果该位为0,说明数据报可以被分片,如果等于1,表示不允许被分片;第三bit是分片标志MF,只有在DF为0时该字段才有意义,用以标识此报文是否是这系列分片的最后一个,0表示接收到的是最后一个分片。 7. 片偏移 片偏移量表示该分片在整个数据报中的原来数据报中的相对位置。片偏移以8B为偏移单位,因此选择的分片长度应该是8B的整数倍。 8. 生存时间(TTL) 生存时间TTL(time-to-live)字段占8bit,它设置了数据报可以经过的最多路由器数。TTL的初始值由源主机设置,一旦经过一个处理它的路由器,它的值就减去1。当该字段的值为0时,数据报就被丢弃,并发送ICMP报文通知源主机。设置生存时间是为了避免无法发送的数据报永远在互联网上流动。 9. 协议类型 该字段占8bit,指出此IP数据报的高层协议类型,以便目的主机的IP层将数据部分上交给哪个高层协议处理。许多高层协议的数据能够被封装到IP数据报中,如TCP、UDP和ICMP等。常用的协议号如表1-1所示。该字段是本程序要求输出的信息之一。 表1-1 常用的高层协议与其协议域值的对应关系 高层协议类型 ICMP IGMP TCP EGP UDP IPv6 OSPF 协议域数值 1 2 6 8 17 41 89 10. 头部校验和 IP头部校验和占16 bit,它设置的目的是保证数据报头部的数据完整性,而不包括数据部分。这样做的目的有两个:一是所有将数据封装在IP数据报中的高层协议均含有覆盖整个数据的校验码,因此IP数据报没有必要再对其所承载的数据部分进行校验;二是因为每经过一个路由器,IP数据报的头部都要发生改变,而数据部分并不改变,这样,校验和只对发生改变的首部进行校验显然这不需要花费太多的处理时间。 为了减少计算校验和的开销,IP数据报头部校验和不采用CRC校验码,而是采用更简单的分段计算方法:发送端先把检验和字段置为0,然后将头部划分为长度为16 bit的比特序列,对头部中每个16 bit进行二进制反码求和,结果存在检验和字段中;当收到一份IP数据报后,同样对头部中每个16 bit进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在头部中的检验和,因此,如果头部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1。 11. 源IP地址 源IP地址是32bit,表示发送数据报的源主机的IP地址。在IP数据报从源主机发送到目的主机的过程中,这个域的值必须保持不变。该字段是本程序要求输出的信息之一。 12. 目的IP地址 目的IP地址也是32bit,表示接收数据报的目的主机的IP地址。同样地,在IP数据报从源主机发送到目的主机的过程中,这个域的值也必须保持不变。该字段也是本程序要求输出的信息之一。 13. 选项域 选项预的长度范围为0~40B,主要用于支持纠错、测量及安全等措施。在使用选项字段的过程中,有可能出现报头部分的长度不是4B的整数倍。如果出现这种情况,就需要通过增加全0的填充域凑齐。
1.2、UDP协议 UDP协议是一种无连接,不可靠的简单通信协议,所以其报头结构也较为简单。UDP数据包报头结构如图1-3所示。 UDP头部
0 15 16 31 源端口号 目的端口号 总长度 校验和
图1-3 UDP数据包结构 源端口和目的端口分别代表本次UDP通信发起主机和目的主机所使用的端口号,总长度代表整个UDP数据包头和其发送数据的总长度。校验和是针对整个数据包内容的网际校验值,提供对本数据包正确性的检查功能。 1.3、TCP协议 TCP协议是一种端对端的协议。使用TCP没有任何广播或类似的概念。要用TCP协议与另一台计算机通信,两台机之间必须像打电话一样连接在一起,每一端都为通话做好准备。“流传输”(Stream delivery)是TCP一个常用术语。这个术语的含义是TCP协议主要用来处理数据流,可以正确处理乱序的数据包。TCP协议甚至还允许存在丢失的或者损坏的数据包,最终它可以再次得到这些数据包。程序员也可以在TCP流中发送非结构化数据。TCP协议以它自己的方式缓存数据。不过,其缓存过程对程序员和用户是透明的。TCP数据包头的结构如图1-4所示。 TCP头部 0 15 16 31 源端口号 目的端口号 序号 确认号 头长 保留 URG ACK PSH RST SYN FIN 窗口大小
校验和(16位) 紧急指针 选项及填充
图1-4 TCP数据包结构 (1) 源端口号和目的端口号:分别代表本次TCP通信发起主机和目的主机所使用的端口号; (2) 序列号:由于TCP协议是面向数据流的,它所传递的报文可以被视为持续的数据流,所以可以按照数据流中的先后顺序给每个字节编号,本序列号就是该数据包中传递的第一个数据字节的编号; (3) 确认号:表示接收端希望接收的下一个TCP包第一个字节的编号,与发送端的序列号对应; (4) 报头长度:TCP数据包头部长度,其范围在5-15之间,所以TCP包头最长可达60B(长度单位为ULONG); (5) 保留:无实际用途,置为零; (6) 控制字段:包括SYN、ACK、PSH、RST、URG、FIN,其中SYN表示同步信息,用来建立一个新的TCP连接,ACK表示确认,只有当该位置位时,确认号有效,PSH表示希望协议栈尽快向上层传递数据,RST表示Reset,即强制切断连接,URG表示需要紧急处理的数据存在,FIN代表连接正常终止,用来结束现有TCP连接; (7) 窗口大小:表示当前滑动窗口大小,具体介绍参见滑动窗口协议模拟一章。 (8) 校验和:数据报的网际校验值,提供错误发现功能; (9) 紧急指针:代表紧急数据在数据包中的位置,在URG置位时有效; 1.4、Winpcap开发包 1.2.1、Winpcap简介 WinPcap(Windows Packet Capture)是Windows平台下一个免费,公共的网络访问系统。开发WinPcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它提供了以下的各项功能: 捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报; 在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉; 在网络上发送原始的数据报; 收集网络通信过程中的统计信息。 WinPcap的主要功能在于独立于主机协议(如TCP-IP)而发送和接收原始数据报。也就是说,WinPcap不能阻塞,过滤或控制其他应用程序数据报的发收,它仅仅只是监听共享网络上传送的数据报。因此,它不能用于QoS调度程序或个人防火墙。 使用基于WinPcap开发包开发的程序要在电脑上运行需要首先在电脑上安装WinPcap相关的驱动程序。 本次作业使用WinPcap实现的主要功能有:查询网络适配器信息,发送ARP数据包和侦听ARP应答以及IP流量监控。
1.2.2、Winpcap 工作流程 1)获取网络设备列表 通常, 一个基于WinPcap的应用程序所要做的第一件事, 就是获得适合的网络接口的列表。获取该列表可调用pcap_findalldevs_ex()函数: 这个函数返回一个pcap_if结构的列表, 每个元素都记录了一个接口的信息。 其中, name和description以人类可以阅读的形式, 记录了设备的信息。该函数原型为: int pcap_findalldevs_ex( char* source, struct pcap_rmtauth * auth, pcap_if_t ** alldevs, char * errbuf ) 当pcap_findalldevs_ex()返回成功后,alldevs参数指向获取的网络接口列表的第一个元素。 2)利用WinPcap的pcap_findalldevs_ex()函数获取本机网络接口列表和每个网络接口IP地址。 打开网络接口得到网络设备列表之后,就可以选择感兴趣的网络接口卡并对其上的网络流量进行监听。在监听前需要将其打开,可使用WinPcap提供的pcap_open()函数,pcap_open()函数原型如下: pcap_t* pcap_open(const char * source, int snaplen,