自己写了一个WinPcap过滤表达式语法检测软件,使用了SharpPcap包(它是使用.net对WinPcap进行了封装,其中过滤表达式和WinPcap相同)。
程序下载地址为:http://download.csdn.net/source/526497
源代码下载地址为:http://download.csdn.net/source/526501
转了两篇文章,第一篇写的很短但是很清楚,第二篇写的比较长,但是很详细。
转自:http://hi.baidu.com/jsjzpt/blog/item/aac60e9b984c53b1c8eaf40a.html
在捕获网络数据时,常常只需捕获某些特定的数据,因此在编写sniffer类的软件时,需要加入数据过滤的功能。Winpcap是sniffer软件最常用的开发库之一,在Winpcap中通过编辑过滤表达式来设置过滤条件。下面就以Winpcap开发库为例,介绍数据过滤功能的实现。
Winpcap过滤表达式采用tcpdump的语法,是一个ASCII字符串形式的高层的布尔表达式。表达式由用户(或程序员)编辑,由pcap_compile()编译成内核级的代码,编译后pcap_setfilter()将其应用到某个已打开的网络捕获设备(网卡)上。每一个来自网络的数据包都会被检查,所有的符合要求的数据包(即与过滤条件比较后,布尔表达式为真的包)将会被Winpcap堆存。
一个数据包的关键属性包括协议(如IP)、发送和接收方(如源和目的IP地址)等,这些信息都可以在PDU头部找到。Winpcap通过读取PDU头部相应字段,并结合过滤条件完成过滤操作。
过滤表达式的基本组成元素为关键词,一个表达式由一个或多个关键词组成,关键词之间通过and、or和not连接。关键词主要有两类:
第一类 声明数据包源或目的地的关键词。关键词host、net和port分别指明依据收、发方IP地址(或主机名)、网络地址和端口号进行判断,若未指定,则默认为host;关键词前加上修饰词dst、src 和dst or src 指明捕获特定方向的数据,若未指定,则默认为dst or src。
如“dst host 210.31.234.254”,“port 80”,“src 210.31.234.13”。
第二类 声明数据包协议类型的关键词。关键词ether、fddi、tr、ip、ip6、arp、rarp、tcp和udp分别指明数据链路层、网络层和传输层所用协议类型。
IP分组类型的ip proto等。如“ether proto /arp”、“ip proto /tcp”。
转自:http://blog.csdn.net/casale/archive/2006/05/29/760421.aspx 作者:陈伯仁
注:该文档从tcpdump的主页上获得,在www.tcpdump.org能够找到它的原始版本。
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