我想爲某些協議的有效負載中進入的數據寫一個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
的情況,但我認爲在這個問題中這樣做更簡單。