自定义解析器,字段取决于数据包顺序
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_tracking
或 Wireshark 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 不适合根据接收顺序分解数据包,但我们可以让它工作!
情况
我正在为协议编写自定义 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_tracking
或 Wireshark 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 不适合根据接收顺序分解数据包,但我们可以让它工作!