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

时间:2018-06-29 11:15:30

标签: lua wireshark wireshark-dissector

情况

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

该协议具有一个“开始交易”位,表示8个数据包交易的开始,并且取决于我们在该交易中的位置,该数据包的各个部分具有不同的含义,即在具有开始交易位的数据包中,该数据包以 header 开头,然后下一个数据包在同一位置包含消息代码。共有8种不同的方式来解释数据包的相同偏移量,具体取决于我们在交易中的位置。

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

我尝试过的

我在dissector函数外部创建了一个简单的序列计数器变量,如果遇到事务开始位,则将其重置。计数为8。根据该计数器,我选择应添加到树中的原型字段。

这种类型的作品,如果我将所有不同的字段都显示为列,则它们在正确的位置具有正确的值。但是,当我单击数据包时,数据包详细信息显示为否或字段名称错误,具体取决于我单击数据包的顺序。例如,如果我单击带有“事务开始”的数据包,则该数据包信息正确地将数据显示为“标头”。但是,如果我随后单击其他任何数据包,则该字段将显示为“消息代码”。

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

wireshark甚至不适合仅根据接收顺序来解析某个数据包的方式吗?

2 个答案:

答案 0 :(得分:2)

wireshark甚至适合仅根据接收顺序来解析特定数据包的方式吗?

Wireshark仅在第1遍通过时才按顺序处理数据包,您可以使用pinfo.visited判断数据包是否是第1次解析。第一次解剖数据包将为假,其他所有时间均为真。

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

答案 1 :(得分:1)

我的情况与此类似。

我的解决方案只是使用当前数据包编号(pinfo.number)作为数据的索引,将我需要的信息(在您的情况下为计数器)存储在dissector函数外部的表中。

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

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

P.S。我认为Wireshark不适合根据接收顺序对数据包进行解剖,但我们可以使其正常工作!