Lua解剖器用于自定义协议。

我编写了几个 Lua Dissectors 来解析我们使用的自定义协议,它们工作得很好。为了发现丢失数据包的问题,我需要检查自定义协议的序列号是否与旧数据包匹配。 设备 A 到设备 B 的 IP 源地址和目的地址始终相同。 在此数据包中,我们有一个自定义 ID。 每个 ID 都有一个序列号,所以设备 B 可以确定数据包是否丢失。序列号每 256 个递增一次,并在达到 65k 时回滚。 我尝试使用全局字典,但当您在跟踪中向上或向下滚动时,解码器会重新运行并更改值。 几行以下显示了信息存储的位置。

ID = buffer(0,6):bitfield(12,12)
SeqNum = buffer(0,6):bitfield(32,16)

理想情况下,我想列出每个已解码帧的列表,如果上一个序列号相差大于 256,则在其中列出,并生成一个表格列出所有这些不良帧。

源IP;目的IP;ID;序列号

1 10.12.1.2; 10.12.1.3; 10; 0

2 10.12.1.2; 10.12.1.3; 11; 0

3 10.12.1.2; 10.12.1.3; 12; 0

4 10.12.1.2; 10.12.1.3; 11; 255

5 10.12.1.2; 10.12.1.3; 12; 255

6 10.12.1.2; 10.12.1.3; 10; 511 如果重要的序列号 255 丢失,则为带有序号 255 的数据包

我现在成功地让解析器通过使用全局数组来检查当前数据包与先前数据包的匹配性,在其中存储有关每个帧的特定信息。在分析的当前数据包中,我重新检查最近的数据包,并从末尾开始向前找到适当的数据包。

dict[pinfo.number] = {frame = pinfo.number, dID = ID, dSEQNUM = SeqNum}
local frameCount = 0
local frameFound = false
while frameFound == false do
    if pinfo.number > frameCount then
      frameCount = frameCount + 1
      if dict[(pinfo.number - frameCount)] ~= nil then
          if dict[(pinfo.number - frameCount)].dID == dict[pinfo.number].dID then
              seq_difference = (dict[(pinfo.number)].dSEQNUM - dict[(pinfo.number - frameCount)].dSEQNUM)
              if seq_difference > 256 then
                  pinfo.cols.info = string.format('ID-%d SeqNum-%d  missing packet(s) %d   last frame %d ', ID,SeqNum, seq_difference, dict[(pinfo.number - frameCount)].frame)
              end
              frameFound = true
           end
       end
     else
        frameFound = true
     end
 end
点赞
用户3395060
用户3395060

我不确定我看到了需要回答的问题?如果你的问题是“我该如何避免重复调用分析器并损坏前面解码的值”,那么答案就是使用 pinfo.visited 布尔值。对于特定数据包第一次分析时,它将为 false,在此之后无论用户点击多少次,它都将为 true - 直到重新加载文件或加载新的文件。

为了处理重新加载/新文件情况,您需要将 init() 函数调用挂钩到您的协议中,通过定义一个 function myproto.init() 函数,并在其中清除您的整个数组表。

此外,你可能想要查询有关 ask.wireshark.org 上的相关问题/答案,因为该网站更常被用于 wireshark Lua API 问题。例如,这个问题/答案 与你的情况类似并相关。

2015-08-12 12:33:37