WinPcap的过滤表达式语法
基于libcap、winpcap的网络编程
第五章基于libpcap的网络编程技术5. 1常见的包捕获机制简介包捕获就是利用以太网的介质共享的特性,通过将网络适配器设置为混杂模式的方法,接收到所有网络上的以太网帧。
包捕获的机制大致可以分为两类:一类是由操作系统内核提供的捕获机制。
另一类是由应用软件或系统开发包捕获驱动程序提供的捕获机制。
常见的包捕获机制如表5-1所示。
其中最主要的是下列4种:BPF ( Berkeley Packet Filter )DLPI ( Data Link Provider In terface )NIT ( Network In terface Tap ) SOCK-PACKET 类型套接口。
BPF由基于BSD的Unix系统内核所实现。
DLPI是Solaris (和其他System V UNIX ) 系统的内嵌子系统。
NIT是SUN OS4 系统的一部分,但在Solaris /SUN OS5 中被DLPI 所取代。
Linux核心则实现了SOCK-PACKET 的包捕获机制。
从性能上看,BPF比DLPI 和NIT 好得多,SOCK-PACKET 最弱。
表5-1常用的包捕获机制由于现在很多局域网为NT网,其网络传输方式大多采用以太网标准,所以涉及的编程也是在Windows 环境下实现的。
Windows 操作系统没有提供包捕获机制,只提供了数量很少并且功能有限的API调用。
在Windows 环境下由于其自身的封装性,很难对其底层进行编程。
本章将对BSD系列的libpcap进行深入地介绍。
5.2 Libpcap 与 BPF(1) libpcap 概述libpcap(Packet Capturelibrary),即数据包捕获函数库。
该库提供的 C 函数接口可用于捕获经过网络接口 (只要经过该接口,目标地址不一定为本机)的数据包。
它是由洛仑兹 伯克利试验室的研究人员 Steven McCanne 和Van Jacobson 于1993 年在Usenix'93 会议上正式提出的一种用于 Unix 内核数据包过滤体制。
winpcap过滤器语法
winpcap过滤器语法Wpcap过滤器基于已公开的断言语法。
一个过滤器是一串包括过滤表达式的ASCII字符串。
Pcap_compile()接受表达式并利用一个程序将之转化为核心层的包过滤器。
表达式选择将要接受的数据包。
若未给出表达式,网络上的所有数据包将被核心层的过滤驱动所接受。
否则,只有满足表达式为”ture”的数据包会被接受。
表达式可以包括一个或多个原子式。
原子式通常由一个带前置限定词的id(名称或数字)所组成。
有三种不同的前置限定词:Type限定词指定名称或数字所指向的类别。
可能的类别有host、net和port。
例如:’host foo’、’net 128.3’、’port 20’。
若未指定类别限定词,默认为host。
Dir限定词指定一个到和/或从id的特定的传输方向。
可能的方向有src、dst、src or dst和src and dst。
例如:’src foo’、’dst net 128.3’、’src or dst port ftp-data’。
若没有该限定词,默认为src or dst。
对于’null’链路层(例如像slip这种点对点的协议)inbound和outbound这两上限定词能够指定想要的方向。
Proto限定词限定一个特殊的协议。
可能的协议有:ether、fddi、tr、ip、ip6、arp、rarp、decnet、tcp和udp。
例如:’ether src foo’、’arp net 128.3’、’tcp port 21’。
若没有协议限定词,则默认为所有与类别相一致的协议。
例如:’src foo’的意思是’(ip or arp or rarp) src foo’(除非后面的语法不合法),’net bar’的意思是’(ip or arp or rarp) net bar’,’port 53’的意思’(tcp or udp) port 53’。
‘fddi’实际上是’ether’的一个别名;解析器将它们的意思处理为“在指定网络接口下使用数据链路层。
抓包过滤表达式
一、针对wireshark最常用的自然是针对IP地址的过滤。
其中有几种情况:(1)对源地址为192.168.0.1的包的过滤,即抓取源地址满足要求的包。
表达式为:ip.src == 192.168.0.1(2)对目的地址为192.168.0.1的包的过滤,即抓取目的地址满足要求的包。
表达式为:ip.dst == 192.168.0.1(3)对源或者目的地址为192.168.0.1的包的过滤,即抓取满足源或者目的地址的ip 地址是192.168.0.1的包。
表达式为:ip.addr == 192.168.0.1,或者 ip.src == 192.168.0.1 or ip.dst == 192.168.0.1(4)要排除以上的数据包,我们只需要将其用括号囊括,然后使用 "!" 即可。
表达式为:!(表达式)二、针对协议的过滤(1)仅仅需要捕获某种协议的数据包,表达式很简单仅仅需要把协议的名字输入即可。
表达式为:http(2)需要捕获多种协议的数据包,也只需对协议进行逻辑组合即可。
表达式为:http or telnet (多种协议加上逻辑符号的组合即可)(3)排除某种协议的数据包表达式为:not arp !tcp三、针对端口的过滤(视协议而定)(1)捕获某一端口的数据包表达式为:tcp.port == 80(2)捕获多端口的数据包,可以使用and来连接,下面是捕获高端口的表达式表达式为:udp.port >= 2048四、针对长度和内容的过滤(1)针对长度的过虑(这里的长度指定的是数据段的长度)表达式为:udp.length < 30 http.content_length <=20 (2)针对数据包内容的过滤表达式为:http.request.uri matches "vipscu" (匹配http请求中含有vipscu 字段的请求信息)通过以上的最基本的功能的学习,如果随意发挥,可以灵活应用,就基本上算是入门了。
WinPcap下的主要结构体和主要函数
WinPcap下的主要结构体和主要函数WinPCap中的主要结构体:1.struct pcap_if_t(称为网络设备结构,表示一个网络接口设备(如网卡))结构体包含以下5个域(其结构体与pcap_if相同,可以用pcap_if_t代替pcap_if):struct pcap_if {struct pcap_if *next;char *name; /* name to hand to "pcap_open_live()" */char *description; /* textual description of interface, or NULL */struct pcap_addr *addresses;bpf_u_int32 flags; /* PCAP_IF_ interface flags */};Struct pcap_addr : Representation of an interface address(表示接口地址)Struct pcap_addr{struct pcap_addr * next:if not NULL, a pointer to the next element in the list;NULL for the last element of the list (指向下一个元素的指针)struct sockaddr * addr a pointer to a struct sockaddr containing an addressstruct sockaddr * netmask if not NULL, a pointer to a struct sockaddr that contains the netmask corresponding to the address pointed to by addr.struct sockaddr * broadaddr if not NULL, a pointer to a struct sockaddr that contains the broadcast address corre? sponding to the address pointed to by addr; may be null if the interfacedoesn't support broadcastsstruct sockaddr * dstaddr if not NULL, a pointer to a struct sockaddr that contains the destination address corre? sponding to the address pointed to by addr; may be null if the interface isn't a point- to-point interface}2.pcap_ifItem in a list of interfaces, used by pcap_findalldevs().(接口设备列表的一项(一个设备,比如一个网卡))Definition at line 148 of file incs/pcap.h.Struct pcap_if{struct pcap_if * nextif not NULL, a pointer to the next element in the list; NULL for the last element of the listchar * namea pointer to a string giving a name for the device to pass to pcap_open_live()char * descriptionif not NULL, a pointer to a string giving a human-readable description of the devicestruct pcap_addr * addressesa pointer to the first element of a list of addresses for the interfaceu_int flagsPCAP_IF_ interface flags. Currently the only possible flag is PCAP_IF_LOOPBACK, that is set if the interface is a loopback interface.}2. 结构体pcap_tDescriptor of an open capture instance. This structure is opaque to the user, that handles its content through the functions provided by wpcap.dll. (该结构体描述一个捕获的实例(例如指向一个发现的网卡,称为网卡描述符),其结构体在.h文件中看不到)3. 结构体pcap_pkthdr//Header of a packet in the dump file. Each packet in the dump file is prepended with this generic header. (每一个分组都有不同的头部,分组的头部用该结构体表示)struct pcap_pkthdr {struct timeval ts;bpf_u_int32 caplen;bpf_u_int32 len;}ts:时间戳cpalen:当前分组的长度len:数据包的长度5. 结构体sockaddr_in一般编程中使用,它与sockaddr等价的数据结构sockaddr_in(在Winsock2.h中定义):struct sockaddr_in {};typedef struct in_addr {union {struct{unsigned char s_b1,s_b2,s_b3,s_b4;} S_un_b;struct {unsigned short s_w1,s_w2;} S_un_w;unsigned long S_addr;} S_un;} IN_ADDR;sin_family指代协议族,在socket编程中只能是AF_INETsin_port存储端口号(使用网络字节顺序)sin_addr存储IP地址,使用in_addr这个数据结构sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
WinPcap基础
SUP-5.1.3
网络组包过滤(NPF)模块
1.数据包的捕获和过滤 捕获数据库是WinPcap的核心技术。在捕 获时,驱动器使用网络接口嗅探数据包 ,并把它们完整地传送到用户层应用程 序。 可以看到,捕获数据包时使用了两个组 件,即过滤器和核心缓冲区。
2.监测和统计
NPF中包含一个可编程的监测模块,它可以对网络流量 进行简单的统计和计算。不需要把数据包复制到用户 层应用程序,只要简单地接收和显示从监测引擎获得 的结果即可收集到统计信息。不需要捕获数据包,也 就避免了捕获过程中可能耗费的CPU和内存资源。 监测引擎由一个带有计数器的分类器构成。NPF中的一 个过滤引擎对数据包进行分类,没有被过滤掉的数据 会进入计数器。计数器拥有一些变量,用于保存接收 到的数据和过滤器接收的字节数。每当有新的数据包 进入时,这些变量的值都会被更新。监测引擎会定期 将这些变量的值传递给用户层应用程序,传递的时间 可以由用户自行配置。
以简洁方式来描述WinPcap体系结构
SUP-5.1.2
NIC驱动器和NDIS
网络接口卡和NIC驱动器 中间层驱动器 传输驱动器或者协议驱动器
1.网络接口卡和NIC驱动器
NIC驱动器可以直接管理网络接口卡。它的下端接口与硬 件关联,而其上端接口允许高层向网络中发送数据包、处 理中断、重置网络适配器、中止网络适配器以及查询和设 置驱动器的操作属性。NIC驱动器可以是微端口,也可以 是传统的完全NIC驱动器。 微端口仅实现硬件指定的、用于管理网络适配器的必 要操作,包括在网络适配器上发送和接收数据。大多 数最低层NIC驱动器的操作(例如同步操作)都是由 NDIS操作的。微端口不会直接调用操作系统例程, NDIS是微端口访问操作系统的接口。微端口将数据包 传送到NDIS,而NDIS确保这些数据包会传送给正确的 网络协议。 完全NIC驱动器用于执行硬件指定的操作以及所有由 NDIS完成的同步和队列操作。
wireshark条件过滤语法
wireshark条件过滤语法
Wireshark条件过滤语法主要包括捕获过滤器和显示过滤器。
捕获过滤器(CaptureFilters)用于决定捕捉的流量内容,仅支持协议过滤。
在抓包前进行设置,决定抓取怎样的数据,方便stream的追踪和排查。
显示过滤器(DisplayFilters)用于决定捕捉内容中显示的结果,既支持协议过滤也支持内容过滤。
过滤器语法如下:
<Protocol> <Direction> <Host(s)> <Value> <Logical Operations> <Ot her expression>
其中,各部分含义如下:
- Protocol(协议):如ether、ip、tcp等,默认支持全部协议。
- Direction(方向):如src、dst、src and dst、src or dst,默认使用s rc or dst。
- Host(s)(主机):如host、port、host range等。
- Value:用于细粒度过滤的协议属性值,如port 80、http.request.meth od="GET"等。
- Logical Operations(逻辑运算):如not、and、or,not具有最高优先级,and和or优先级相同,运算从左向右。
- Other expression:其他表达式,如ip.addr==192.168.1.1等。
winpcap编程解析数据包
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. }。
wireshark 过滤规则
wireshark 过滤规则Wireshark是一款网络协议分析工具,它能够捕获网络数据包,并将其解码成人类可读的形式,以协助网络管理员和安全专家分析网络流量。
Wireshark 的过滤规则是其最强大的功能之一,通过过滤规则,用户可以过滤出特定协议、IP 地址、端口等信息,以便更加精准地分析网络流量。
Wireshark 过滤规则的基本语法Wireshark 的过滤规则是基于 BPF(Berkeley Packet Filter)语法的,BPF 是一种基于指令的过滤机制,它能够快速地过滤掉不需要的数据包,从而减少网络流量的负载。
Wireshark 的过滤规则语法基本上与 BPF 语法相同,但是在一些细节上有所不同。
下面是Wireshark 过滤规则的基本语法:1. 过滤规则由过滤器和操作符组成,过滤器用于过滤出需要的数据包,操作符用于连接过滤器。
2. 过滤器可以是协议、IP 地址、端口等信息,也可以是表达式,表达式可以是逻辑表达式、算术表达式、比较表达式等。
3. 操作符包括逻辑操作符、比较操作符、算术操作符等,用于连接过滤器。
4. Wireshark 的过滤规则区分大小写。
5. Wireshark 的过滤规则支持通配符,例如:ip.addr == 192.168.1.*。
6. Wireshark 的过滤规则可以使用括号,以改变优先级。
7. Wireshark 的过滤规则可以使用注释,注释以 # 开头。
Wireshark 过滤规则的实例下面是一些 Wireshark 过滤规则的实例,这些规则可以帮助用户更好地理解 Wireshark 的过滤规则语法:1. 过滤出所有的 HTTP 流量http2. 过滤出所有来自 192.168.1.100 的数据包ip.src == 192.168.1.1003. 过滤出所有去往 192.168.1.100 的数据包ip.dst == 192.168.1.1004. 过滤出所有来自 192.168.1.100 的 TCP 流量ip.src == 192.168.1.100 and tcp5. 过滤出所有 TCP 端口为 80 的数据包tcp.port == 806. 过滤出所有 TCP 端口为 80 或 443 的数据包tcp.port == 80 or tcp.port == 4437. 过滤出所有来自 192.168.1.100 并且 TCP 端口为 80 的数据包ip.src == 192.168.1.100 and tcp.port == 808. 过滤出所有数据包的长度大于 1500 字节的数据包frame.len > 15009. 过滤出所有 ICMP 类型为 8 的数据包(即 ping 请求)icmp.type == 810. 过滤出所有 DNS 查询数据包dns.flags.response == 011. 过滤出所有 ARP 请求数据包arp.opcode == 112. 过滤出所有 TCP SYN 数据包tcp.flags.syn == 1Wireshark 过滤规则的高级应用除了基本的过滤规则语法之外,Wireshark 还提供了许多高级的过滤规则功能,这些功能可以帮助用户更加精确地分析网络流量。
wireshark组合过滤表达式
Wireshark是一款流行的网络协议分析工具,它可以帮助网络管理员和安全专家监控和分析网络流量。
在Wireshark中,过滤表达式是一种强大的功能,它可以帮助用户在海量的数据包中筛选出所需的信息,有助于更高效地进行网络分析和故障排查。
Wireshark支持多种过滤表达式,其中最常用的是组合过滤表达式。
组合过滤表达式可以通过逻辑运算符(如“and”、“or”、“not”)将多个条件组合在一起,从而实现更精确的数据包过滤。
在本文中,我们将介绍Wireshark组合过滤表达式的基本语法、常用功能和实际应用。
一、基本语法在Wireshark中,组合过滤表达式的基本语法如下:1. 使用逻辑运算符进行条件组合,如:- “and”表示与逻辑,要求两个条件同时满足;- “or”表示或逻辑,满足任一条件即可;- “not”表示非逻辑,排除满足条件的数据包。
2. 可以使用括号进行条件优先级控制。
3. 可以结合各种基本过滤条件,包括协议、IP位置区域、端口号、数据包长度等。
二、常用功能Wireshark组合过滤表达式可以应用于各种网络分析场景,常见的功能包括:1. 多重条件筛选通过组合多个条件,可以筛选出符合特定要求的数据包。
可以筛选出源位置区域在某个网段内且目标端口是80的HTTP流量。
2. 数据包关系分析通过组合过滤表达式,可以分析数据包之间的关系。
可以筛选出同时满足源IP位置区域相同且目标端口不同的数据包,从而发现端口扫描行为。
3. 故障排查在网络故障排查中,可以使用组合过滤表达式来定位问题。
可以筛选出一段时间内源位置区域为某个IP的数据包,分析其目标端口和响应时间,帮助快速定位故障原因。
三、实际应用Wireshark组合过滤表达式在实际网络分析中具有重要作用。
以下是几种实际应用场景:1. 流量分析通过组合过滤表达式,可以分析特定来源或目的地的流量模式,比如监控某个服务器的出站流量或入站流量。
2. 安全监控在网络安全监控中,可以使用组合过滤表达式筛选出异常流量,比如大量的连接失败、异常端口访问等,提前发现安全威胁。
Winpcap常用函数
Winpcap常用函数最近在看WINPCAP,将其库函数总结如下1. int pcap_findalldevs(pcap_if_t **, char *)说明:用来获得网卡的列表参数:指向pcap_if_t**类型的列表的指针的指针; char型指针,当打开列表错误时返回错误信息返回值: 为int型,当显示列表失败时返回-1pcap_if_t 是pcap_if 重命名而来:typedef struct pcap_if pcap_if_t; pcap_if结构体如下:struct pcap_if{struct pcap_if *next;char *name;char *description;struct pcap_addr *addresses; //pcap_addr 结构体bpf_u_int32 flags;};pcap_addr 结构体如下:struct pcap_addr{struct pcap_addr *next;struct sockaddr *addr;struct sockaddr *netmask;struct sockaddr *broadaddr;struct sockaddr *dstaddr;};举例:pcap_if_t *alldevs;pcap_if_t *d;char errbuf[64];if (pcap_findalldevs(&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");}用pcap_findalldevs不能获得网卡的MAC,有两种方法可以实现,一、向自己发送arp包,二、使用IPHelp的API可以获得。
windows dumpcap 用法
Windows dumpcap 用法介绍在Windows操作系统中,dumpcap是一个用于以抓包方式捕获网络数据的工具。
它是Wireshark网络分析器的一部分,并且是其命令行版本的一种实现。
dumpcap具有强大的网络捕获功能,可以从网络接口中捕获数据包,并将其保存为数据包文件。
它支持多种数据包捕获过滤器和输出格式,使得用户能够根据自己的需求进行定制。
本文将深入探讨dumpcap在Windows中的用法,包括基本命令、常见选项和扩展功能等。
基本命令命令格式dumpcap的基本命令格式如下:dumpcap [选项] [输出文件]示例命令下面是几个示例命令,演示了不同的用法:1.捕获网络接口上的数据包,并保存为默认文件名的文件(默认文件名为”dumpcap”加上日期和时间):dumpcap2.捕获网络接口上的数据包,并保存为指定文件名的文件:dumpcap -w capture.pcap3.捕获指定网络接口上的数据包,使用BPF过滤器并保存为指定文件名的文件:dumpcap -i 1 -f "host 192.168.0.1" -w capture.pcap-i 选项-i选项用于指定要捕获的网络接口。
可以通过序号或名称来指定接口。
例如:dumpcap -i 1dumpcap -i "Ethernet"-w 选项-w选项用于指定输出文件的名称。
可以使用完整路径或相对路径。
例如:dumpcap -w capture.pcapdumpcap -w "C:\captures\capture.pcap"-f 选项-f选项用于指定数据包过滤器。
可以使用BPF(Berkeley Packet Filter)过滤器语法来筛选特定的数据包。
例如:dumpcap -f "host 192.168.0.1"dumpcap -f "port 80"-n 选项-n选项用于禁用地址解析。
SharpPcap4.0使用手册(笔记)
报文的传输速率会超过它们被处理的速率。如果报文处理很费时,比如写入磁盘或者处理代码逻辑复杂时,就会发生这种情况。有事我们可以通过使用bnf过滤器来降低报文传输速率,但是在其他情况下过滤器会很复杂。如果报文传输速率只是在短期内大于处理速率的话,我们可以简单地延缓报文的处理直到传输速率降下来。一种方法就是把报文储存到队列中,然后在后台线程中进行处理。
libpcap和WinPcap最强大的一个特性就是过滤器,它能够有效过滤收到的报文。每个捕捉设备都会有这样一个Filter,它的过滤表达式的语法请参考(/docs/docs_40_2/html/group__language.html)。捕捉设备会把过滤结果为true的报文拷贝给应用程序。请注意过滤表达式编译引擎要求将设备的子网掩码一并传递过去,因为有的过滤器会需要它。但是SharpPcap已经自动为我们处理了。
Open(DeviceMode mode, int read_timeout)函数及其重载:
当DeviceMode被设为Normal模式时,只捕捉以本机为源或目的的报文;设为Promiscuous模式时,捕捉所以流过网卡的报文(在共享式网络中有用,在目前常见的交换式网络中没啥效果,因为别人的报文不会经过你的网卡)。注意,当你的网卡处于混杂模式时,你是能够被网络中其他主机探测到的。
使用WinPcapDevice.SendQueue()比不断调用ICaptureDevice.SendPacket()的效率更高,因为queue缓存于内核一级,它会大幅减少环境切换。当queue不再需要时,可使用SendQueue.Dispose()来释放。
WinPcap下地主要结构体和主要函数
WinPCap中的主要结构体:1.struct pcap_if_t(称为网络设备结构,表示一个网络接口设备(如网卡))结构体包含以下5个域(其结构体与pcap_if相同,可以用pcap_if_t代替pcap_if):struct pcap_if {struct pcap_if *next;char *name; /* name to hand to "pcap_open_live()" */char *description; /* textual description of interface, or NULL */struct pcap_addr *addresses;bpf_u_int32 flags;/* PCAP_IF_ interface flags */};Struct pcap_addr : Representation of an interface address (表示接口地址)Struct pcap_addr{struct pcap_addr * next:if not NULL, a pointer to the next element in the list; NULL for the last element of the list (指向下一个元素的指针)struct sockaddr * addr a pointer to a struct sockaddr containing an address struct sockaddr * netmask if not NULL, a pointer to a struct sockaddr that contains the netmask corresponding to the address pointed to by addr.struct sockaddr * broadaddr if not NULL, a pointer to a struct sockaddr that contains the broadcast address corre�sponding to the address pointed to by addr; may be null if the interface doesn't support broadcastsstruct sockaddr * dstaddr if not NULL, a pointer to a struct sockaddr that contains the destination address corre�sponding to the address pointed to by addr; may be null if the interface isn't a point- to-point interface}2.pcap_ifItem in a list of interfaces, used by pcap_findalldevs().(接口设备列表的一项(一个设备,比如一个网卡))Definition at line 148 of file incs/pcap.h.Struct pcap_if{struct pcap_if * nextif not NULL, a pointer to the next element in the list; NULL for the last element of the listchar * namea pointer to a string giving a name for the device to pass to pcap_open_live() char * descriptionif not NULL, a pointer to a string giving a human-readable description of the devicestruct pcap_addr * addressesa pointer to the first element of a list of addresses for the interfaceu_int flagsPCAP_IF_ interface flags. Currently the only possible flag is PCAP_IF_LOOPBACK, that is set if the interface is a loopback interface.}2. 结构体pcap_tDescriptor of an open capture instance. This structure is opaque to the user, that handles its content through the functions provided by wpcap.dll. (该结构体描述一个捕获的实例(例如指向一个发现的网卡,称为网卡描述符),其结构体在.h文件中看不到)3. 结构体pcap_pkthdr //Header of a packet in the dump file. Each packet in the dump file is prepended with this generic header. (每一个分组都有不同的头部,分组的头部用该结构体表示)struct pcap_pkthdr {struct timeval ts;bpf_u_int32 caplen;bpf_u_int32 len;}ts:时间戳cpalen:当前分组的长度len:数据包的长度5. 结构体sockaddr_in一般编程中使用,它与sockaddr等价的数据结构sockaddr_in(在Winsock2.h中定义):struct sockaddr_in {};typedef struct in_addr {union {struct{unsigned char s_b1,s_b2,s_b3,s_b4;} S_un_b;struct {unsigned short s_w1,s_w2;} S_un_w;unsigned long S_addr;} S_un;} IN_ADDR;sin_family指代协议族,在socket编程中只能是AF_INETsin_port存储端口号(使用网络字节顺序)sin_addr存储IP地址,使用in_addr这个数据结构sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
pcap过滤法则
wpcap的过滤器是以已声明的谓词语法为基础的。
过滤器是一个ASCII字符串,它包含了一个过滤表达式。
pcap_compile()把这个表达式编译成内核级的包过滤器。
这个表达式会选择那些数据包将会被堆存。
如果表达式没有给出,那么,网络上所有的包都会被内核过滤引擎所认可。
不然,只有那些表达式为'true'的包才会被认可。
这个表达式包含了一个或多个原语。
原语通常包含了id(名字或序列),这些id优先于限定词。
以下是三种不同的限定词:输入(type)指明了哪些东西是id所代表的。
可能的输入是host,net和port。
比如:`host foo',`net 128.3',`port 20'。
如果没有输入限定词,就假定是host方向(dir)由id指明了一个特定的传输方向。
可能的方向是src,dst,src or dst。
比如,'src foo','dst net 128.3',`src or dst port ftp-data'。
如果没有指定,就假定是src or dst。
如果没有链路层(比如,像slip这样的点对点协议),那么限定词可以使用inbound和outbound,来指明一个方向。
协议(proto)限定词限制了所匹配的协议。
可能的协议有:ether,fddi,tr,ip,ip6,arp,rarp,decnet,tcp和udp。
比如:`ether src foo',`arp net 128.3',`tcp port 21'。
如果没有指定协议限定词,那么就假定所有的协议都会被允许。
例如:'src foo'等价于'(ipor arp or rarp)src foo'(当然,不能有不符合语法的字母出现),'net bar'等价于'(ip orarp or rarp) net bar','port53'等价于'(tcp or udp) port 53'。
pcap过滤规则教程
MSN Messenger 协议分析
/Hopping/archive/2008/11/13/3292257.aspx
MSN 协议分析
/lzyzuixin/archive/2009/03/13/3986597.aspx
11.msn
msnms && tcp[23:1] == 20 // 第四个是0x20的msn数据包
msnms && tcp[20:1] >= 41 && tcp[20:1] <= 5A && tcp[21:1] >= 41 && tcp[21:1] <= 5A && tcp[22:1] >= 41 && tcp[22:1] <= 5A
tcp[8:3]==20:21:22
如 果想得到最准确的,应该先知道tcp长度
matches(匹配)和contains(包含某字符串)语法
ip.src==192.168.1.107 and udp[8:5] matches "\\x02\\x12\\x21\\x00\\x22"
ip.src==192.168.1.107 and udp contains 02:12:21:00:22
不 单单是00:22才有QQ号码,其它的包也有,要满足下面条件(tcp也有,但没有做):
oicq and udp[8:] matches "^\\x02[\\x00-\\xff]+\\x03$" and !(udp[11:2]==00:00) and !(udp[11:2]==00:80)
Winpcap主要数据结构及函数
Winpcap主要数据结构及函数(一)数据结构·1) typedef struct _ADAPTER ADAPTER //描述一个网络适配器;·2) typedef struct _PACKET PACKET //描述一组网络数据报的结构;·3) typedef struct NetType NetType //描述网络类型的数据结构;·4) typedef struct npf_if_addr npf_if_addr //描述一个网络适配器的ip地址;·5) struct bpf_hdr //数据报头部;·6) struct bpf_stat //当前捕获数据报的统计信息。
函数1)int pcap_findalldevs ( pcap_if_t ** alldevsp, char * errbuf) 功能:列出当前所有可用的网络设备(网卡)所在头文件:pcap.h参数说明:pcap_if_t ** alldevsp 指向pcap_if_t结构列表的指针的地址。
实际使用时,声明一个pcap_if_t结构的指针(pcap_if_t * alldevsp),然后把该地址作为参数传入即可(&alldevsp)。
char * errbuf 错误缓冲区,要求长度至少为PCAP_ERRBUF_SIZE 字节返回值:-1:出错,将会向错误缓冲中填充错误信息,错误信息为ASCII码,可以直接打印出来。
0:正确返回,可以使用alldevsp访问所有网络硬件pcap_if的结构Struct pcap_if {struct pcap_if *next;char *name;chat *description;struct pcap_addr address;u_int flags;}也可以用pcap_if_t 代替pcap_if2)pcap_t * pcap_open_live ( char * device, int snaplen, int promisc, int to_ms, char * errbuf );获取一个包捕捉句柄,类似文件操作函数使用的文件句柄。
循序渐进学习使用WINPCAP五
循序渐进学习使用WINPCAP(五)WinPcap或libpca最强大的特点之一就是数据流的过滤引擎。
它提供一种高效的方法来只捕获网络数据流的某些数据而且常常和系统的捕获机制相集成。
过滤数据是由函数pcap_compile()和pcap_setfilter()来实现的。
pcap_compile()用来编译一个过滤设备,它通过一个高层的boolean型变量和字串产生一系列的能够被底层驱动所解释的二进制编码。
boolean表示语法能够在这个文件的过滤表示语法中找到。
pcap_setfilter() 用来联系一个在内核驱动上过滤的过滤器,这时所有网络数据包都将流经过滤器,并拷贝到应用程序中。
下面的代码展示了如何编译并设定一个过滤设备。
注意我们必须从pcap_if结构中获得掩码,因为一些过滤器的创建需要这个参数。
下面的代码段中的pcap_compile()的"ip and tcp"参数说明只有IPV4和TCP数据才会被内核保存并被传递到应用程序。
if(d->addresses != NULL)/* 获得第一个接口地址的掩码*/netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;else /* 如果这个接口没有地址那么我们假设他为C类地址*/netmask=0xffffff;//compile the filterif(pcap_compile(adhandle, &fcode, "ip and tcp", 1, netmask) <0 ){fprintf(stderr,"\nUnable to compile thepacket filter. Check the syntax.\n");/* Free the device list */pcap_freealldevs(alldevs);return -1;}if(pcap_setfilter(adhandle, &fcode)<0)//set the filter{ fprintf(stderr,"\nError setting the filter.\n");pcap_freealldevs(alldevs); /* Free the device list */return -1;}如何你想进一步查看本节中用过滤器过滤数据流的例子可以查看下一节《数据的解包》。
Wincap常用函数说明
Winpcap常用函数说明1. int pcap_findalldevs(pcap_if_t **, char *)Ø 说明:用来获得网卡的列表Ø 入口参数:l 指向pcap_if_t**类型的列表的指针的指针pcap_if_t 是pcap_if 重命名而来:typedef struct pcap_if pcap_if_t;pcap_if结构体如下:struct pcap_if{struct pcap_if *next;/*多个网卡时使用来显示各个网卡的信息*/char *name; /* name to hand to "pcap_open_live()" */char *description; /* textual description of interface, or NULL 就是网卡的型号、名字等*/ struct pcap_addr *addresses;/*以下是struct pcap_addr{struct pcap_addr *next;struct sockaddr *addr; /* address */struct sockaddr *netmask; /* netmask for that address */struct sockaddr *broadaddr; /* broadcast address for that address */struct sockaddr *dstaddr; /* P2P destination address for that address */};*/bpf_u_int32 flags; /* PCAP_IF_ interface flags */};l char型指针当打开列表错误时返回错误信息Ø 出口参数:为int型,当显示列表失败时返回-1Ø 举例:pcap_if_t *alldevs;pcap_if_t *d;char errbuf[64];/* 这个API用来获得网卡的列表*/if (pcap_findalldevs(&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");}2. void pcap_freealldevs(pcap_if_t *)Ø 说明:与int pcap_findalldevs(pcap_if_t **, char *)配套使用,当不再需要网卡列表时,用此函数free释放空间Ø 入口参数:打开网卡列表时申请的pcap_if_t型的指针Ø 出口参数:无Ø 举例:/* We don't need any more the device list. Free it */pcap_freealldevs(alldevs);3. pcap_t *pcap_open_live(const char * device, int snaplen, int promisc, int to_ms, char ebuf *)Ø 说明:被用来得到一个包抓取得描述符Ø 入口参数:l device是一个指出要抓取的网络设备的字符串。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1) 表达式支持逻辑操作符,可以使用关键字 and、or、not对子表达式进行组合,同时支持使用小括号。
2) 基于协议的过滤要使用协议限定符,协议限定符可以为ip、arp、rarp、tcp、udp等。
3) 基于MAC地址的过滤要使用限定符ether(代表以太网地址)、当该MAC地址仅作为源地址时表达式为ether src mac_addr,仅作为目的地址时,表达式为ether dst mac_addr,既作为源地址又作为目的地址时的表达式为ether host mac_addr。此外应注意mac_addr应该遵从00:E0:4C:E0:38:88的格式,否则编译过滤器时会出错。
4) 基于IP地址的过滤应该使用限定符host(代表主机地址)。当该IP地址仅作为源地址时过滤表达式应为 src host ip_addr,仅作为目的地址时的表达式为 dst host ip_addr,既作为源地址又作为目的地址时表达式为 host ip_addr。
5) 基于端口的过滤应使用限定符 port。例如仅接收80端口的数据包则表达式为port 80。
下边给出两个例子:
例1:只捕获arp或icmp数据包。
过滤表达式:arp or (ip and icmp)
例2:捕获主机192.168.1.23与192.168.1.28之间传递的所有UDP数据包。
过滤表达式:(ip and udp)and( host 192.168.1.23 or host 192.168.1.28)