6.4. 建立显示过滤表达式

Wireshark提供了简单而强大的过滤语法,你可以用它们建立复杂的过滤表达式。你可以比较包中的值,合并表达式为多个指定表达式。本节介绍了相关操作。

[]提示

你可以在Wireshark Wiki Display页找到发现大量的显示过滤范例。http://wiki.wireshark.org/DisplayFilters.

6.4.1. 显示过滤字段

包详情面板的每个字段都可以作为过滤使用。应用这些作为过滤将会仅显示包含该字段的包。例如:过滤字符串:TCP将会显示所有包含TCP协议的包。

通过"Help/Support Protocals"/帮助/协议支持菜单项访问"Display Filter Fields/显示过滤字段"可以查看完整完整的过滤字段列表。

6.4.2. 比较值

你可以通过在许多不同的比较操作建立比较过滤。详见表 6.3 “显示滤镜比较操作符”

[]提示

你可以使用下表中的英语和比较符(c-link)项达到同样的效果,它们也可以混合使用。

表 6.3. 显示滤镜比较操作符

EnglishC-linke描述及范例
eq==Equal
ip.addr==10.0.0.5
ne!=Not equal
ip.addr!=10.0.0.5
gt>Greate than
frame.pkt_len>10
lt<Less than
frame.pkt_len<128
ge>=Greater than or equal to
frame.pkt_len ge 0x100
le<=Equal
frame.pkt_len <= 0x20

6.4.3. 组合表达式

你可以用逻辑操作符将过滤表达式组合在一起使用,见表 6.4 “显示过滤的逻辑操作符”

表 6.4. 显示过滤的逻辑操作符

EnglishC-linke描述和范例
and&&Logical AND
ip.addr==10.0.0.5 and tcp.flags.fin
or||Logical OR
ip.addr==10.0.0.5 or ip.addr==192.1.1.1
xor^^Logical XOR
tr.dst[0:3] == 0.6.29 xor tr.src[0:3] == 0.6.29
not!Logical Not
not llc
[...] Substring Operator

Wireshark允许选择一个序列的子序列。在标签后你可以加上一对[]号,在里面包含用逗号(是不是冒号?)分离的列表范围。

eht.src[0:3] == 00:00:83

上例使用n:m格式指定一个范围。在这种情况下,n是起始位置偏移(0表示没有偏移,即是第一位,同理1表示向右偏移一位,便是第二位),m是从指定起始位置的区域长度。

eth.src[1-2] == 00:83

上例使用n-m格式一个范围。在本例中n表示起始位置偏移,m表示终止位置偏移

eth.src[:4]=00:00:83:00

上例使用:m格式,表示从起始位置到偏移偏移位置m。等价于0:m

eth.src[4:]=20:20

上例使用n:格式,表示从最后位置偏移n个序列

eht.src[2] == 83

上例使用 n 形式指定一个单独的位置。在此例中中序列中的单元已经在偏移量n中指定。它等价于n:1

eth.src[0:3,102,:4,4:,2] == 00:00:83:00:83:00:00:83:00:20:20:83

Wireshark 允许你将多个分号隔开的列表组合在一起表示复合区域,如上例所示


6.4.4. 常见的错误

[]警告

在组合表达式中使用"!="操作符,像eth.addr,ip.addr,tcp.port,udp.port等元素可能会产生非预期效果

经常有人用ip.addr ==1.2.3.4 表达式来选择所有包含ip地址为1.2.3.4的包,

如果有人想用ip.addr !=1.2.3.4 表达式来排除ip地址为1.2.3.4的包,很不幸。它不会像你期待的那样。

相反,那个表达式为真值得条件是源地址或目标地址中的任意一个不等于1.2.3.4即可。因此,那个表达式ip.addr !=1.2.3.4 可以被读作:"该包包含的ip字段值必须不为1.2.3.4"。因为一个ip数据报同含源地址和目标地址,只要两个地址有一个不为1,2,3,4表达式就为真。

接着上面的话题,如果你真想过滤捕捉文件中,ip地址包含1.2.3.4的包,正确的表达式应该是!(ip.addr==1.2.3.4)。它可以读作:"显示所有'字段名为ip.addr值存在1.2.3.4'为非真的包'",换句话说:"筛选所有字段名ip.addr的值中未出现1.2.3.4的包"