WireShark(威而鲨)第二式--如封似闭
1 如何过滤报文
1.1 使用Capture Filter过滤报文
Capture Filter是指在捕捉时就对报文进行过滤,由此,Wireshark对不感兴趣的报文不再记录和显示。其优点是可以节省本地存储和显示资源,适合于报文数目过于庞大而对本地计算资源带来冲击的场合。
Capture Filter的使用方法
1. 选择Capture,在菜单中选择Option
Figure 22
2. 勾选想要抓取的网口,并在过滤栏写入过滤表达式,也可以使用Capture Filter中已经创建好的表达式。表达式的相关内容在后文叙述。
Figure 23
Figure 24
3. 点击Start开始抓取报文,可以看到抓取的报文中没有ARP报文,Capture Filter已经发挥作用。
Figure 25
1.2 使用Display Filter 过滤报文
Display Filter是指选将所有的报文都抓取到本地,然后使用过滤器找到感兴趣的报文。其优点是可以抓取到所有报文,适用于并不确定要抓取某种特定报文的场合。
在我们实际工作中,本地计算机的存储和计算性能都比较好,不太需要担心资源不足的问题,且大部分情况下需要抓取端口的所有报文以便于后续分析。所以,此种方法使用要较Capture Filter普遍。
Display Filter的使用方法:
1. 正常捕捉报文
2. 在过滤栏里填写过滤表达式,或者在Expression选项中编写自己需要的表达式。回车后就能立刻过滤出感兴趣的报文。
Figure 26
Figure 27
1.3 过滤表达式
我们通过在过滤栏中键入过滤表达式来过滤报文,所以了解如何正确使用Wireshark的过滤表达式十分重要。先来看一下Wireshark过滤表达式的语法:
l 点操作符
WireShark使用英文半角符号点“.”来表示层属关系。比如ip.addr就代表ip报文的地址字段,既包括源地址也包括目的地址;arp.dst.proto_ipv4就表示ARP报文的IPv4目的地址。
l 过滤比较操作符
C-linke | 描述 | 范例 |
== | Equal | ip.addr==10.0.0.5 |
!= | Not equal | ip.addr!=10.0.0.5 |
> | Greate than | frame.pkt_len>10 |
< | Less than | frame.pkt_len<128 |
>= | Greater than or equal to | frame.pkt_len ge 0x100 |
<= | Equal | frame.pkt_len <= 0x20 |
Table 1
l 过滤逻辑操作符
English | 描述 | 范例 |
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 |
Table 2
l 括号操作符
Wireshark允许用“[]”选择一个序列的子序列。
eth.src[0:3] == 00:00:83 | 使用n:m格式指定一个范围。在这种情况下,n是起始位置偏移(0表示没有偏移,即是第一位),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 允许你将多个分号隔开的列表组合在一起表示复合区域,如上例所示 |
Table 3
在熟悉了WireShark提供的操作符后,就可以书写确定的过滤表达式来过滤报文了。直接在过滤栏中键入正确的字符,下拉列表中会自动补全命令,有利于我们快速准确地找到字段。
Figure 28
至于各字段所代表的具体含义及格式,可以在Expression中找到。
Figure 29