自定义解析器,字段根据数据包顺序不同

情况

我正在为一个协议写一个自定义 lua 解析器。我们使用定制硬件捕获协议,从而获得 PCAP 文件。该协议由 64 位数据包组成。

协议具有“开始交易”位,表示 8 个数据包交易的开始,根据交易进展,数据包的某些部分具有不同的含义,例如,在带有开始交易位的数据包中,数据包以头部开头,然后下一个数据包在相同位置包含消息代码。总共有 8 种不同的方式来解释数据包的相同偏移量,具体取决于交易进展。

我想解析该协议,并使字段根据交易进展而变化。

我尝试过的方法

我创建了一个简单的序列计数器变量,在解析器函数之外,如果遇到交易开始位置,则重置它,并向其计数到 8。根据计数器,我选择应添加到树中的 protofields。

这种方法有些可行,如果我选择将所有不同的字段作为列显示,则它们在正确的位置具有正确的值。但是,当我单击数据包时,数据包详细信息显示不正确的字段名称或根本不显示,具体取决于我单击数据包的顺序。例如,如果我单击带有“交易开始”字段的数据包,则数据包信息正确显示数据为“header”。然而,如果我然后单击任何其他数据包,则该字段将显示为“消息代码”。

似乎数据包信息字段中用于解析的顺序并不固定,它使用我单击数据包的顺序,而不是它们被捕获的顺序。

难道 wireshark 甚至适合仅基于其接收到的顺序来解析某个数据包吗?

点赞
用户2755698
用户2755698

请注意:以下内容保留原本的 markdown 格式。

Wireshark是否适合仅根据接收顺序分解特定数据包的方式?

Wireshark仅在第一阶段按顺序处理数据包,并且您可以使用 pinfo.visited 来判断数据包是否在第一次被分析。第一次分析数据包时 pinfo.visited 将为false,所有其它时间将为true。

但这还不够,您还需要保存数据包的计数器(1-8),以便在下一次解析数据包时知道如何正确解析该特定数据包,而下一次解析可能会在任何时间发生。使用 C 解析器,这通常是使用会话构建实现的,比如 conversation_add_proto_data()conversation_get_proto_data(),但在这种情况下,我不确定是否这是最好的方法,或者在 Lua 解码器中是否支持。不过,这可能是一个好的起点吧?请查看 doc/README.request_response_trackingWireshark Lua Wiki 页面 或在 Wireshark Q&A 站点 上咨询,获取 Wireshark 社区中其它人的可能想法。 (我已经有一段时间没有编写过 Lua 解码器了,我不记得是否有适合您需求的 Lua 方法可用。)

2018-06-30 02:15:19
用户6349125
用户6349125

我曾经遇到过类似的情况。

我的解决方案很简单,就是在解析器函数之外的表格中存储我所需的信息 - 在您的情况下是计数器 - 并使用当前数据包编号(pinfo.number)作为数据的索引。

正如@Christopher Maynard所说,Wireshark将按顺序在第一次遍历时经过数据包。使用这个信息,配合pinfo.visited,将允许你在第一次遍历时存储计数器信息。

有一个小问题。如果在.pcap文件中记录了其他协议,这些协议会显示为表格中的空隙,因为您的解析器只会针对指定的协议进行激活。在遍历表格时插入一个简单的nil检查即可解决此问题。(我不确定这是否会成为你的问题,但我认为值得提出)

附言:我认为Wireshark并不适合根据接收到的顺序来解析数据包,但我们可以让它工作!

2019-01-20 22:22:28