2015-07-12 120 views
1

擴大我寫了兩個簡單的Wireshark的Lua解剖的鏈接協議:Wireshark的Lua的解剖:兩者一起

local proto1 = Proto("proto1","First Layer") 
local page = ProtoField.uint16("proto1.page", "Page", base.HEX) 
proto1.fields = {page} 

function proto1.dissector(buffer, pinfo, tree) 
    pinfo.cols.protocol = proto1.name; 
    local ptree = tree:add(proto1,buffer(1,5)) 
    ptree:add(page, buffer(1,2)) 
    Dissector.get("proto2"):call(buffer(6, 4):tvb(), pinfo, tree) 
end 

local proto2 = Proto("proto2","Second Layer") 
local len = ProtoField.uint8("proto2.len", "Payload Length") 
proto2.fields = {len} 

function proto2.dissector(buffer, pinfo, tree) 
    pinfo.cols.protocol = proto2.name; 
    local ptree = tree:add(proto2,buffer()) 
    ptree:add(len, buffer(1,2)) 
end 

DissectorTable.get("tcp.port"):add(3456, proto1) 

的解剖做的工作,並顯示在協議陸續樹之一。 現在,如果我展開其中一個協議(因此可以看到一個protofield)並單擊其他數據包,那麼樹中的proto1和proto2都會因未知原因而被展開。 如果我現在摺疊其中一個協議並單擊其他數據包,則兩者都摺疊。

任何建議如何避免它?我的協議比這裏顯示的要複雜得多,所以這種擴展很難分析。

回答

0

這是一個錯誤。我可以發誓之前修復過,然後正常工作。請提交bugs.wireshark.org的錯誤。

在此期間,您可以僞造它:

local proto1 = Proto("proto1","First Layer") 

local page = ProtoField.uint16("proto1.page", "Page", base.HEX) 
local proto2 = ProtoField.bytes("proto2","Second Layer") 
local len  = ProtoField.uint8("proto2.len", "Payload Length") 

proto1.fields = {page, proto2, len} 


local function proto2_dissect(buffer, pinfo, tree) 
    pinfo.cols.protocol = "proto2" 
    local ptree = tree:add(proto2, buffer()):set_text("Second Layer") 
    ptree:add(len, buffer(1,2)) 
end 

function proto1.dissector(buffer, pinfo, tree) 
    pinfo.cols.protocol = proto1.name; 
    local ptree = tree:add(proto1,buffer(1,5)) 
    ptree:add(page, buffer(1,2)) 
    proto2_dissect(buffer(6,4):tvb(), pinfo, tree) 
end 

DissectorTable.get("tcp.port"):add(3456, proto1) 
+0

你的榜樣工程的確,謝謝。 我確實有這些協議在單獨的文件 - 是否有可能使用你的「假」解決方案,這種情況下沒有混合函數和字段在一個文件中?我嘗試了很多錯誤。 – johnjey

+0

那麼,爲了解決這個問題,你必須將所有的'ProtoField's註冊爲一個'Proto'協議。當然,你也可以在另一個Lua文件中創建'ProtoField'對象,只要其他Lua文件在主設置之前加載'Proto.fields' - 或者使用Lua的'require'函數(如果它們'寫成Lua模塊),或者使用'dofile()'。我通常不喜歡使用'dofile()'來加載Wireshark插件,但加載同一插件的其他Lua文件是合理的。 – hadriel

+0

順便說一句,如果你想稍微等一下,這個錯誤已經在進行中,你應該可以在明天早上從[自動構建站點] [1]下載一個固定版本。直到下一個1.12.x版本纔會正式發佈,但這通常是相當頻繁的。 [1]:https://www.wireshark.org/download/automated/ – hadriel

相關問題