1. 捕获表达式
Ethereal的捕获表达式其实是采用的tcpdump的表达式语法,简要介绍如下:
表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表
达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包将会
被截获。
在表达式中一般如下几种类型的关键字,一种是关于类型的关键字,主要包括host,
net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明
202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是
host.
第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,
这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是210.27.
48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则
缺省是src or dst关键字。
第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型。Fddi指明是在
FDDI(分布式光纤数据接口网络)上的特定的网络协议,实际上它是"ether"的别名,fddi和e
ther具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。
其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会
监听所有协议的信息包。
除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,
greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'or' ,'||';
这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来
说明。
(1)想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:
#tcpdump host 210.27.48.1
(2) 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令
#tcpdump host 210.27.48.1 and (210.27.48.2 or 210.27.48.3 )
(3) 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包
,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
(4)如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
#tcpdump tcp port 23 host 210.27.48.1
2. 显示表达式
Ethereal的显示表达式跟捕获表达式完全不一样,采用的是另外的语法,简介如下:
1) 检查一个字段或者协议是否存在,直接用该协议名,比如要过滤udp,直接在过滤框内输入udp就可以了
2) 由于字段可以跟值比较,所以比较运算符也应用比较广泛,
eq
|
==
|
等于
|
ne
|
!=
|
不等于
|
gt
|
>
|
大于
|
lt
|
<
|
小于
|
ge
|
>=
|
大于等于
|
le
|
<=
|
小于等于
|
3) 搜索和匹配操作符
这两个操作符在需要在大量数据中搜索指定模式的时候比较有用。
contains 协议,字段或者片断中包含某个值的时候成立
matches 协议或者文本字符串匹配给定的perl表达式的时候成立
contains操作符允许过滤器搜索一系列的字符,可以是字符串形式,字节形式或者字节数组形式,例如,为了在捕获的文件中搜索一个给定的HTTP URL,可以如下:
http contains “http://www.wireshark.org”
比如想查看码流中是否包含一个特定的字节数组,可以如下:
rtp.payload contains a0:0d:95
matches允许过滤器表达式是perl兼容的,只实现用于协议,用于可以文本表示的协议字段。
4) 大小写转换函数
过滤器有两个函数,upper和lower用于操作字符串字段下面是例子
upper(ncp.nds_stream_name) contains "MACRO"
lower(mount.dump.hostname) == "angel"
5) 协议字段类型
每一个协议字段是有类型的,这些类型是:
无符号整型
有符号整型
布尔型
以太网地址类型(6字节)
字节数组
IPv4地址
IPv6地址
IPX网络数
文本字符串
双精度浮点数
比如为了得到帧长达与一定长度的包,可以用如下语法:
frame.pkt_len > 10
frame.pkt_len > 012
frame.pkt_len > 0xa
发现任何源路由的包,用tr.sr==1来做布尔判断
以太网地址和字节数组用16进制表示,可以用分号,逗号或者短横线分割
eth.dst eq ff:ff:ff:ff:ff:ff
aim.data == 0.1.0.d
fddi.src == aa-aa-aa-aa-aa-aa
echo.data == 7a
IPv4地址可以用点分形式表示或者用主机名表示
ip.dst eq www.mit.edu
ip.src == 192.168.1.1
6) 切片操作符
对于一个文本字符串或者字节数组的字段,你可以通过切片操作符定义过滤表达式。举例如下:
eth.src[0:3] == 00:00:83
http.content_type[0:4] == "text"
切片操作符的语法是:
[i:j] i =偏移开始, j = 长度
[i-j] i = 偏移开始, j = 偏移结束, 包含边界点.
[i] i = 偏移开始, 长度 = 1
[:j] 偏移开始 = 0, 长度 = j
[i:]
偏移开始 = i, 偏移结束 = 字段结束
7) 类型转换
如果一个字段是一个文本字符串或者字节数组,那么它可以以最方便的方式表达,比如下面的表达式是等价的
http.request.method == "GET"
http.request.method == 47.45.54
8) 位字段操作
定义位字段操作也是可行的,可以操作在整型协议字段和字节数组上,比如
tcp.flags & 0x02 用于测试是否TCP SYN包,将匹配所有tcp.flags字段的0x2位设置的包。
当用于切片的时候,掩码必须和切片一样长度
9) 逻辑表达式
逻辑表达式用于组合多个测试条件,为逻辑与,逻辑或和逻辑非,符号分别为&&,||,!
下面是一些例子:
tcp.port == 80 and ip.src == 192.168.2.1
not llc
http and frame[100-199] contains "wireshark"
(ipx.src.net == 0xbad && ipx.src.node == 0.0.0.0.0.1) || ip