Wireshark Lua解剖器重组 - 解剖器未使用以前的Tvb数据调用

时间:2016-07-28 08:01:36

标签: lua wireshark wireshark-dissector

我正在尝试为某些协议的有效负载中的某些数据编写Lua剖析器。每个数据包包含一些串行数据。数据需要作为CR分隔(0x0D / \r)数据包处理,但这些数据包不一定与协议数据包对齐。

我遇到的问题是,如果我报告说我没有足够的数据可以解析,那么上次使用左侧数据不能调用解剖器功能。

例如,假设我有以下协议数据包:

1:  01 02 03 0D
2:  11 12 13
3:  21 22 23 24 0D

然后我有两个可剖析的序列:01 02 03 0D(第一个数据包),11 12 13 21 22 23 24 0D(数据包2和数据包3)。

我的策略是:

  • 查看每个数据包,查找\r
  • 的偏移量
  • 如果没有找到:
    • 设置desegment_offset = 0
    • 设置desegment_len = DESEGMENT_ONE_MORE_SEGMENT(因为我不知道剩下多少数据)
    • 返回nil并重试下一个数据包
  • 如果在中间找到:
    • desegment_offset设置为换行符的偏移量,以便下一个数据包可以获取尾部数据
    • 设置desegment_len = DESEGMENT_ONE_MORE_SEGMENT(因为我不知道剩下多少数据)
    • 不要回来
  • 如果在最后找到,请单独留下desegmentation params并继续 - 整行是一行数据
  • 如果我们没有返回,从0到偏移量的缓冲区就是一整行数据 - 解析这个

示例:

function myproto.dissector(tvbuf, pinfo, treeitem)

    original_dissector:call(tvbuf, pinfo, treeitem)

    local endOffset = 0

    -- find out if we have any complete chunks
    while endOffset < tvbuf:len() do

        if tvbuf(endOffset, 1):uint() == 0x0D then
            break
        end

        endOffset = endOffset + 1
    end

    -- didn't find a complete line in the payload
    -- ask for more
    if endOffset == tvbuf:len() then
        pinfo.desegment_len = DESEGMENT_ONE_MORE_SEGMENT
        pinfo.desegment_offset = 0
        print(' Incomplete, ask for more')
        return
    end

     -- have more than needed so set offset for next dissection
    if tvbuf:len() - 1 > endOffset then
        pinfo.desegment_len = DESEGMENT_ONE_MORE_SEGMENT
        pinfo.desegment_offset = offset
        print(' Too much, leave some for later')
    end

    print("Whole line dissector:", tvbuf:len())
end

在上面的示例中(有效负载长度为4,3,5),我得到的解析器调用tvbuf长度为4,3,5,当我实际预期为4,3,8时,最后一次调用包含先前数据包的剩余数据。

我确实击中了&#34;不完整,返回&#34;分支在第二个数据包上,但第三个数据包永远不会改变。

这不会发生,我做错了什么?

旁注:我知道上面的方法在每行多\r个案例中不会起作用,但我认为对于这个问题,这样做比较简单。< / p>

1 个答案:

答案 0 :(得分:2)

通过设置desegment_offsetdesegment_length的重组功能取决于父协议。我猜你的串行协议是通过USB运行的,事实上,USB协议并没有实现重组,因为USB通常是基于数据包/消息的。 (TCP之类的协议确实实现了重组,因为它在逻辑上是一个数据流。)

Wireshark没有将重组API公开给Lua解剖器(仍然适用于当前的开发版本,v2.3.0rc0),所以如果你使用的是Lua,你很遗憾必须为你的解剖器创建一个变量,你可以自己跟踪以前的数据