9 第 6 章 处理已经捕捉的包

优质
小牛编辑
124浏览
2023-12-01

6.1. 浏览您捕捉的包

在你已经捕捉完成之后,或者打开先前保存的包文件时,通过点击包列表面版中的包,可以在包详情面板看到关于这个包树状结构以及字节面版

通过点击左侧"+"标记,你可以展开树状视图的任意部分。你可以在面板点击任意字段来选择它。例如:在下图图 6.1 “Wireshark选择了一个TCP包后的界面”显示的就是选中TCP字段。同样可以选择TCP包头的应答号(ack:190),同时会出现在下方的字节浏览面版中。[16]

图 6.1. Wireshark选择了一个TCP包后的界面

Wireshark选择了一个TCP包后的界面

在Wireshark正在捕捉时,您也可以进行同样的选择。(前提是您在捕捉选项对话框选择了实时更新列表(update list of packet in real time ))

另外,您可以使用分离的窗口浏览单独的数据包,见图 6.2 “在分离窗口浏览包” ,想要这样做,你只需要在选中包列表面版中您感兴趣的包,菜单 Display->Show Packet in New Windows 。它可以让你很轻松地比较两个或多个包。

图 6.2. 在分离窗口浏览包

在分离窗口浏览包

[16] 不甚了解下方的16进制转储怎么表达190的

6.2. 弹出菜单项

在包列表面板,包详情面板,包字节面板点击右键,都会出现对应的上下文弹出菜单

6.2.1. 包列表面板的弹出菜单

图 6.3. 包列表面板弹出菜单

包列表面板弹出菜单

下表列出了该面版可用弹出菜单项的概述,主菜单能实现同样功能的菜单项,以及简短的描述。

表 6.1. 包列表弹出菜单项

项目对应主菜单项描述
Mark Packet(toggle)Edit标记/取消标记包
Set Time Reference(toggle)Edit设置/重设时间参考
Apply as FilterAnalyze用当前选中的项作为过滤显示
Prepare a FilterAnalyze准备将当前选择项作为过滤器
Conversation Filter-将当前选择项的地址信息作为过滤设置。选中该选项以后,会生成一个显示过滤,用于显示当前包两个地址之间的会话(不分源目标地址)。(XXX - add a new section describing this better.---作者似乎建议添加新章节详细描述)
STCP-有待补充
Follow TCP StreamAnalyze浏览两个节点间的一个完整TCP流所有数据
Follow SLL StreamAnalyze同上,将TCP替换成SSL理解
Copy/Summary(TEXT)-将摘要字段复制到剪贴板。(以tab分开的文本)
Copy/Summary(CVS)-将摘要字段复制到剪贴板,(CVS格式,逗号分开)
Copy/As Filter-以当前选择项,建立一个显示过滤器,复制到剪贴板
Copy/Bytes(Offset Hex Text)-以16进制转储格式将包字节复制到剪贴板。
Copy/Bytes(Offset Text)-以16进制转储格式将包字节复制到剪贴板。不包括文本部分。
Copy/ Bytes (Printable Text Only)-以ASCII码格式将包字节复制到剪贴板,包括非打印字符。
Copy/ Bytes (HEX Stream)-以16进制未分段列表数字方式将包字节复制到剪贴板,(an unpunctuated list of hex digits 应该有专有名词,有兴趣的查一下)
Copy/ Bytes (Binary Stream)-以raw binary格式将包字节复制到剪贴板。数据在剪贴板以"MIME-type application/octet-stream"存储,该功能在GTK+1.x环境下不支持
Export Selected Packet Bytes...File与文件菜单同名项目功能一样。允许将Raw packet 字节转换为二进制文件它
Decode As...Analyze在两个解析之间建立或修改新关联(不知所云)
Print...File打印包
Show Packet in New WindowView在新窗口显示选中的包

6.2.2. 包详情面板的弹出菜单

图 6.4. 包详情面板弹出上下文菜单项

包详情面板弹出上下文菜单项

下表介绍了包详情列表菜单项的功能描述,及其他可以提供该功能的主菜单

表 6.2. 包详情面板弹出上下文菜档项

项目对应的主菜单描述
Expand SubtreesView展开当前选择的子树
Expand AllView展开捕捉文件的所有包的所有子树
Collapse AllView关闭包中所有已展开的子树
Copy/Description-复制选择字段显示的文本到剪贴板
Copy/AS FilterEdit将选择项目作为显示过滤内容复制到剪贴板
Copy/Bytes(Offset Hex Text)-将包字节以Hexdump-like格式存储到剪贴板;类似于包列表面板中同名的命令,但是拷贝结果仅仅是树分支中被选中部分(包字节面板中被选中字节)
Copy/Bytes(Offset Hex)-以Hexdump-linke格式保存到剪贴,不包括文本部分。类似于包列表命令,不同之处在于此处仅拷贝树分支选中部分(包字节面板选中部分)
COPY/Bytes (printable Text Only)-以ASCII格式拷贝包字节,非打印字符除外;类似于包列表面板中同样的命令。不同点在于此处仅拷贝选择的树分支(包字符被选择部分)
Copy/Bytes(Hex Stream)-j以unpunctuated list hex digits形式保存到剪贴板,类似于包列表面板中的命令,不同之处在于仅复制选中子树部分(包字节面板选中部分)
Copy/Bytes(Binary Stream)-以raw binary格式拷贝到剪贴板;类似于包列表面板中的命令,不同之处在于仅拷贝选中部分子树(包字节面板选中部分)。数据以MIME-type“Application/octet-stream”存储在剪贴板.该功能在GTK+1.x下不可用
Export Selected Packet Bytes...File同文件菜单中的同名项一样。导出raw packet 字节为二进制文件。
Apply as Filteranalyze将当前选择项作为过滤内容,并应用
Preapare a FilterAnalyze将当前选择项作为过滤内容,但不立即应用
Follow TCP StreamAnalyze追踪两个节点见,被选择包所属TCP流的完整数据
Follow SSL StreamAnalyze同上
Wiki Protocol Page-显示当前选择协议的对应WIKI网站协议参考页
Filter Field Reference-显示当前过滤器的WEB参考
Protocol Preferences...-如果协议字段被选中,点击该选项,打开属性对话框,选择对应协议的页面,???
Decode As...Analyze更改或应用两个解析器之间的关联(什么鸟意思?)
Resolve Name...View对选择的包进行名称解析,不是指所有的包
Go to corresponding Packet ...Go跳到当前选择包的相应包。

TNND,表格让人崩溃

6.3. 浏览时过滤包

Wireshark有两种过滤语法:一种是捕捉包时使用,另一种是显示包时使用。本节介绍第二种过滤语法:显示过滤。第一种过滤语法在第 4.8 节 “捕捉时过滤”提到

显示过滤可以隐藏一些你不感兴趣的包,让你可以集中注意力在你感兴趣的那些包上面。你可以用从以下几个方面选择包:

  • 协议

  • 预设字段

  • 字段值

  • 字段值比较

  • 。。。以及许多

根据协议类型选择数据报,只需要在Filter框里输入你刚兴趣的协议,然后回车开始过滤。???显示了你输入tcp进行过滤后的图。

图 6.5. 用TCP协议过滤

用TCP协议过滤

或许你没有注意到,上图显示的已经仅有TCP协议了(从图中可以看到1-10号包已经被隐藏)。因为包的编号是固定不变的,所以第一个包显示的编号是11。

注意

当你使用过滤时,所有的包依然保留在捕捉文件里。显示过滤只是更改捕捉文件的显示方式而非内容。

你只能对Wireshark可以识别的协议进行过滤。你也可以对解析器已经添加到树视图的字段进行过滤,但仅限于解析器已经为字段加上了协议缩写的。在Add Expression...对话框可以看到可用的字段列表.详见第 6.5 节 ““Filter Expression/过滤表达式”对话框”

例如:想要限制包列表面板仅显示来自或指向192.168.0.1的包,可以使用ip.addr==192.168.0.

注意

点击Clear可以移除过滤

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 >= 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的包"

6.5. “Filter Expression/过滤表达式”对话框

当你熟悉Wireshark过滤系统,并了解你可以用那些标签进行过滤以后,你可以快速简单地输入过滤字符

但如果你是一个Wireshark新手,或者处理一些相对陌生的协议,你可能很难通过直接输入字符进行过滤。过滤表达式对话框会帮你解决这些问题

提示

过滤表达式对话框是学习输入表达式的不错的工具。(不知道用不错是不是有点委屈)

图 6.6. 过滤表达式对话框

过滤表达式对话框

打开上图的对话框以后。将会显示一个按协议类型分组的树分支列表,一个关系选择框。

Field Name

从协议字段树中选择协议字段。每个可过滤协议都放在第一级。点击+号展开列表,可以获得关于那些协议的可过滤字段。

Relation

从可用关系列表中选择关系。is present是一元关系,表示如果你选择的字段存在,表达式就为真值。其它关系都为二元关系,需要附加数据(例如:一个值来匹配)来完成。

如果你从字段名列表选择一个字段,并选择一个二元关系(例如等于关系"=="),你可能需要输入值,也有可能是范围信息。

Value

在此输入合适的配置值,输入的值同样要符合你选择的field name的属性值类型(例如 字符串).

Predefined values

有些协议字段包含预设值可用,这一点跟C语言中的枚举变量类似。如果选择的协议有这样的值定义,你可以在此选择。

Range

此处作者留空了

OK

如果你已经建立好了表达式,点击OK即可创建你的过滤字符串

Cancel

你可以点击Cancle按钮不做任何修改离开Add Expression。。。对话框。

6.6. 定义,保存过滤器

你可以定义过滤器,并给他们标记以便以后使用。这样可以省去回忆、重新输入某些你曾用过的复杂过滤器的时间。

定义新的过滤器或修改已经存在的过滤器有两种方法:1、在Capture 菜单选择Capture Filters...;2、在Analyze菜单选择Display filter...。Wireshark 将会弹出如图 6.7 “"捕捉过滤器"和"显示过滤器"对话框”所示话框。

注意

因为捕捉和显示滤镜的设定义和保存方式几乎完全一样。所以这里放在一起讲,二者之间的不同点会做标记

警告

你必须用Save来保存你的过滤器,OK或者Apply不会保存过滤器。关闭wireshark时会随之消失

图 6.7. "捕捉过滤器"和"显示过滤器"对话框

"捕捉过滤器"和"显示过滤器"对话框

New

增加一个新的过滤器到列表中。当前输入的Filter name,Filter string值将会被使用。如果这些都为空,将会被设置为"new"(是说filtername还是说二者都是?)

Delete

删除选中的过滤器。如果没有过滤器被选中则为灰色

Filter name

修改当前选择的过滤器的名称

注意

过滤器名称仅用在此处为了区分方便而已,没有其他用处。你可以将多个过滤器使用同一个名称,但这样会很不方便

Filter string

修改当前选中过滤器的的内容。仅适用显示过滤:在输入时进行语法检查。

Add Expression

仅适用显示过滤:打开增加表达式对话框,辅助创建过滤表达式。详见第 6.5 节 ““Filter Expression/过滤表达式”对话框”

OK

仅适用显示过滤:为当前显示应用选择的过滤器,关闭当前对话框。

save

保存当前对话框设置。文件位置和格式见???

Close

关闭当前对话框。将会放弃未保存的设置。

6.7. 查找包

当你捕捉到一些包以后,或者读取以前存储的包的时候,可以很容易的进行查找。从Edit菜单选择Find Packet...菜单项.Wireshark将会弹出图 6.8 “"Find Packet/查找包"对话框”所示对话框.

6.7.1. 查找包对话框

图 6.8. "Find Packet/查找包"对话框

"Find Packet/查找包"对话框

首先你需要选择查找方式:

Display filter

在Filter:输入字段,选择查找方向,点击OK(过滤器方式)

例如:查找192.168.0.1发起的三步握手建立连接,使用如下字符:

ip.addr == 192.168.0.1 and tcp.flags.syn

显示过滤的详情,参见第 6.3 节 “浏览时过滤包”

Hex Value

在包数据中搜索指定的序列

例如,使用"00:00"查找下一个包含两个空字节的包数据。

String

在包中查找字符串,可以指定多种参数

输入的查找值将会被进行语法检查。如果语法检查无误,输入框背景色会变成绿色,反之则是红色。

你可以指定查找的方向通过:

UP

向上查找包列表(包编号递减方式)

Down

向下查找包列表(包编号递增方式)

6.7.2. "Find Next/查找下一个"命令

适用最后一次的查找设置继续查找

6.7.3. "Find Previous/查找上一个"命令

适用最后一次的设置修改查找方向,继续查找。

6.8. 到指定的包

通过"Go"菜单可以很轻松跳转到指定的包

6.8.1. "GO Back"返回命令

使用Go back返回包历史记录,工作方式跟web浏览器的页面历史记录类似

6.8.2. "Go Forward /向前"命令

前进到包的历史记录,工作方式跟web浏览器的页面历史记录类似

6.8.3. "Go to Packet/到指定的包"对话框

图 6.9. "GO to packet/转到指定包"对话框

"GO to packet/转到指定包"对话框

输入包的编号,点击OK,跳转到指定的包(他妈的我怎么看都是jump to,怎么成了OK?).

6.8.4. "Go to Corresponding Packet/到对应的包"命令

如果被选择协议字段指向文件中的另一个包,该命令将会跳转到那个包。

注意

该协议字段看起来有点像超链接(就像浏览器里的),双击该字段也可以跳转到对应的包。

6.8.5. "Go to Firest Packet/到第一个包"命令

跳到第一个包

6.8.6. "Go to Last Packet/到最后一个包"命令

跳到最后一个包

6.9. 标记包

你可以在包列表面板对包进行标记。被标记的包背景色为黑色,不管原来设置的颜色是怎样的。标记包有助于分析大的包文件时进行查找。

警告

包标记并没有存储在捕捉文件中或任何其他地方,关闭文件后,所有标记将会丢失。

在保存/导出/打印包时,你可以使用包标记控制输出包。标记包以后,可以输出进行区间选择。见第 5.8 节 “包范围选项”

对标记包可以进行三项操作

  • Mark packet(toggle) 冻结以标记的单个包

  • Mark all packets 标记所有包.

  • Unmark all packets 取消所有标记

这些标记功能出现在"Edit"菜单。“Mark packet(toggle)”功能在弹出包列表面板弹出上下文菜单同样可以找到。

6.10. 时间显示格式及参考时间

在捕捉包的过程中,每个包都带有时间戳。时间戳会被保存在捕捉文件中,以备将来分析用。

关于时间戳,时区以及相关的东西的描述介绍,见第 7.3 节 “时间戳”

包列表的时间戳格式预设和精度可在浏览菜单选择,见第 3.5 节 “"File"菜单”

可用的预置格式如下:

  • Date and Time of Day: 1970-01-01 01:02:03.123456 包捕捉的绝对日期和时间

  • Time of Day: 01:02:03.123456 包捕捉的绝对时间

  • Seconds Since Beginning of Capture: 123.123456 相对与文件开始捕捉的时间或第一个时间参考包的 到这个包之前的时间。(见第 6.10.1 节 “包参考时间”)

  • Seconds Since Previous Captured Packet: 1.123456 相对前一个捕捉包的时间

  • Seconds Since Previous Displayed Packet: 1.123456 相对前一个显示包的时间(过滤/显示)

可用精度(正如你所致的,数字是以10进制形式的)有:

  • Automatic 使用载入文件格式具有的时间戳精度。(默认选项)

  • Seconds, Deciseconds, Centiseconds, Milliseconds, Microseconds or Nanoseconds 强制使用你指定的精度。如果实际精度比你指定的低,会在后面自动追加0.如果实际精度比你指定的高。数据会被截尾。

精度距离:如果你有个时间戳,显示时使用:“Seconds Since Previous Packet”,:它的值可能是1.123456.默认会采用"Automatic"精度设置,也就是来自libpcap格式文件的固有精度(百万分之一秒)。如果你指定精度为秒,则显示为1,如果你使用。纳秒(nanoseconds),将会显示为1.123456000.

6.10.1. 包参考时间

用户可以为包设置时间参考。时间参考是所有后续包的起算时间。如果你想知道到某一个特定包的时间间隔,会很有用。例如:开始一个新请求。可以在一个包里面设置多个参考时间。

警告

时间参考不能保存到包文件中,关闭文件后就会丢失。

注意

时间参考可能仅仅在时间格式为"Seconds Since Beginning of Capture"模式下比较有用。其他时间显示形式下可能要么是不能工作,要么是没作用。

要使用时间参考,选择Edit菜单下“Time Reference”项中的一个。详见第 3.6 节 “"Edit"菜单”,或者从包列表的右键弹出项选择。

  • Set Time Refernce(toggle) 切换当前包时间参考状态开关

  • Find Next 在包列表面板查找下一个时间参考包

  • Find Previous 在包列表面板查找前一个时间参考包

图 6.10. 时间参考举例

时间参考举例

作为时间参考的包,在time列会有REF字符串作为标记(见上图第10个包)。所有后续包都会用最后一个时间参考来显示时间。