【问题标题】:Wireshark Lua dissectors: both expand togetherWireshark Lua 解析器:两者一起扩展
【发布时间】:2015-09-30 13:19:05
【问题描述】:

我为链式协议编写了​​两个简单的 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 都会因未知原因而展开。 如果我现在折叠其中一个协议并单击另一个数据包,那么两者都会折叠。

任何建议如何避免它?我的协议比这里显示的要复杂,所以这种扩展很难分析。

【问题讨论】:

    标签: lua wireshark wireshark-dissector


    【解决方案1】:

    这是一个错误。我本可以发誓之前已修复,然后正常工作。请在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)
    

    【讨论】:

    • 您的示例确实有效,谢谢。我确实将这些协议放在单独的文件中——在这种情况下,是否可以使用你的“假”解决方案而不在一个文件中混合函数和字段?我尝试了很多错误。
    • 好吧,要使这个变通办法起作用,您必须将所有ProtoFields 注册到一个Proto 协议。当然,您可以在另一个 Lua 文件中创建 ProtoField 对象,只要在主要文件设置 Proto.fields 之前加载其他 Lua 文件 - 使用 Lua 的 require 函数(如果它们是编写为 Lua 模块),或使用 dofile()。我一般不喜欢使用dofile()来加载Wireshark插件,但是加载同一个插件的其他Lua文件是合理的。
    • 顺便说一句,如果您想稍等片刻,该错误已经在进行中,您应该可以在明天早上从 [自动构建站点][1] 下载修复版本。直到下一个 1.12.x 版本才会正式发布,但这通常相当频繁。 [1]:wireshark.org/download/automated
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多