Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 自定义剖析器,字段取决于数据包顺序 形势_Lua_Wireshark_Wireshark Dissector - Fatal编程技术网

Lua 自定义剖析器,字段取决于数据包顺序 形势

Lua 自定义剖析器,字段取决于数据包顺序 形势,lua,wireshark,wireshark-dissector,Lua,Wireshark,Wireshark Dissector,我正在为协议编写一个自定义lua解析器。我们用定制的硬件捕获protocl,从而获得PCAP文件。该协议由64位数据包组成 协议有一个“开始事务”位,它指示8个数据包事务的开始,并且根据我们在该事务中的位置,数据包的部分具有不同的含义,即在具有开始事务位的数据包中,数据包以一个报头开始,然后下一个数据包在同一位置包含消息代码。根据我们在事务中的位置,总共有8种不同的方法来解释数据包的相同偏移量 我想剖析协议,让字段取决于我们在事务中的位置 我试过的 我在dissector函数外创建了一个简单的序

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

协议有一个“开始事务”位,它指示8个数据包事务的开始,并且根据我们在该事务中的位置,数据包的部分具有不同的含义,即在具有开始事务位的数据包中,数据包以一个报头开始,然后下一个数据包在同一位置包含消息代码。根据我们在事务中的位置,总共有8种不同的方法来解释数据包的相同偏移量

我想剖析协议,让字段取决于我们在事务中的位置

我试过的 我在dissector函数外创建了一个简单的序列计数器变量,如果遇到事务开始位,它将被重置。它数到8。根据该计数器,我选择应该添加到树中的protofields

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

看起来packetinfo字段中的disection顺序不是固定的,它使用我单击数据包的顺序,而不是捕获数据包的顺序

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

wireshark是否适合仅根据接收顺序来解析特定数据包

Wireshark将仅在第一次传递时按顺序处理数据包,您可以使用
pinfo.visted
来判断数据包是否是第一次被解析。第一次剖析数据包时为假,其他时间为真


但光是这一点还不够;您还需要保存数据包的计数器(1-8),以便在下一次解析数据包时知道如何再次解析该数据包,这可能会在任何时候发生。对于C解析器,这通常是使用会话构造完成的,比如
conversation\u add\u proto\u data()
conversation\u get\u proto\u data()
,但在这种情况下,我不完全确定这是不是最好的方法,或者Lua解析器是否支持它。不过,这可能是一个好的开始?查看
doc/README。请求\u响应\u跟踪
或在上查询Wireshark社区中其他人可能的想法。(我写Lua解剖器已经有一段时间了,我不记得Lua中有什么可以满足您的需要。)

我也遇到过类似的情况

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

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

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


另外,我认为Wireshark不适合根据收到的顺序来解析数据包,但我们可以让它工作

您认为对每个数据包调用一次解析器函数的假设是错误的。这个假设只有在加载pcap文件并且概览窗格被填充时才成立,所以基本上我必须为每个数据包保存计数器。谢谢现在我必须找出如何保存每个数据包。