我想为某些协议的有效负载中进入的数据写一个Lua解剖器。每个数据包包含一些串行数据。数据需要作为CR分隔处理(0x0D
/\r
)数据包进行处理,但这些数据不一定与协议数据包对齐。Wireshark Lua解剖器重组 - 解剖器不与以前的Tvb的数据调用
我遇到了一个问题,如果我报告我没有足够的数据进行分析,解剖器函数没有从上次数据的剩余数据调用。
例如,假设我有以下协议报文:
1: 01 02 03 0D
2: 11 12 13
3: 21 22 23 24 0D
然后我有两个dissectable序列: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
并试试aga在接下来的分组
- 设置
- 如果发现在中间:
- 设置
desegment_offset
到新行的偏移量,所以下一个数据包可以获得尾数据 - 设置
desegment_len = DESEGMENT_ONE_MORE_SEGMENT
(因为我不知道有多少数据是左) - 不要返回
- 设置
- 如果发现在年底离开desegmentation单独PARAMS和进行 - 整体线条的DAT一行一个
- 如果我们没有返回,从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),当我实际上预期是4,3,8时,我得到的解剖器长度为4,3,8,最后一次调用包含以前数据包的剩余数据。
我打在第二个数据包“不完整,返回”分支,但第三个数据包永远不会改变。
这没有发生,我做错了什么?
附注:我知道上述方法不适用于每行有多个\r
的情况,但我认为在这个问题中这样做更简单。