自定义解析器,字段取决于数据包顺序

Custom dissector, fields depend on packet order

情况

我正在为协议编写自定义 lua 解析器。我们使用自定义硬件捕获协议,为我们提供 PCAP 文件。该协议由 64 位数据包组成。

协议有一个 "start transaction" 位,表示 8 数据包事务的开始,并且根据我们在该事务中所处的位置,数据包的部分具有不同的含义,即在数据包中开始事务位,数据包以 header 开头,然后下一个数据包在同一位置包含 消息代码 。根据我们在事务中的位置,总共有 8 种不同的方式来解释数据包的相同偏移量。

我想剖析协议并让字段取决于我们在交易中的位置。

我试过的

我在解析器函数外创建了一个简单的序列计数器变量,如果遇到事务起始位,它会被重置。它计数为 8。根据那个计数器,我 select 我应该将哪些 protofields 添加到树中。

这种作品,如果我将所有不同的字段显示为列,它们在正确的位置具有正确的值。但是,当我单击数据包时,数据包详细信息不显示或显示错误的字段名称,具体取决于我单击数据包的顺序。例如,如果我单击带有 "transaction start" 的数据包,则数据包信息会正确地将数据显示为 "header"。但是,如果我随后单击任何其他数据包,该字段将显示为 "message code"。

数据包信息字段中的分割顺序似乎不固定,它使用的是我点击数据包的顺序,而不是它们被捕获的顺序。

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

wireshark 是否适合仅根据接收顺序剖析特定数据包的方式?

Wireshark 只会在第一次通过时按顺序处理数据包,您可以使用 pinfo.visited 判断这是否是第一次解析数据包。第一次分解数据包时为假,其他所有时间为真。

但仅此还不够;您还需要保存数据包的计数器 (1-8),以便您在下次剖析数据包时知道如何再次剖析该特定数据包,这可能随时发生。对于 C 解剖器,这通常是使用像 conversation_add_proto_data()conversation_get_proto_data() 这样的对话结构来完成的,但在这种情况下,我不完全确定这是否是最好的方法,或者它是否甚至支持 [=23= 】 解剖器。不过,这可能是一个不错的起点?查看 doc/README.request_response_trackingWireshark Lua wiki pages or inquire over at the Wireshark Q&A site 以了解来自 Wireshark 社区中其他人的可能想法。 (自从我编写 Lua 解剖器以来已经有一段时间了,我不记得 Lua 中有什么(如果有的话)可以满足您的需求。)

我也遇到过类似的情况。

我的解决方案只是将我需要的信息——在你的例子中是计数器——存储在解析器函数之外的 table 中,使用当前数据包编号 (pinfo.number) 作为索引对于数据。

正如@Christopher Maynard 所说,Wireshark 将在第一次传递时按顺序传递数据包。结合使用此信息和 pinfo.visited,您可以在第一次通过时存储计数器信息。

有一个小警告。如果 .pcap 文件中记录了任何其他协议,这些协议将在 table 中显示为空白,因为您的解析器只会针对指定的协议激活。这是通过在遍历 table 时插入一个简单的 nil 检查来解决的。 (我不确定这是否会成为您的问题,但我认为值得一提)

P.S。我认为 Wireshark 不适合根据接收顺序分解数据包,但我们可以让它工作!