Wireshark的lua api: 创建新的启发式解剖器表。

我在 Lua 中找到了一个使用启发式表格的非常有用的示例。 a link 但是它并没有覆盖我的情况。

我已经在 Lua 中编写了自定义解析器。所描述的自定义协议有许多子协议。因此,我创建了新的子解剖表 DissectorTable.new() 并注册新的子协议。 但是某些子协议没有识别标志,它们的类型必须动态找到。

我希望使用 proto:register_heuristic() 方法注册启发式解析器,但是我的新表在 DissectorTable.heuristic_list() 列表中没有。

创建新的解析器表不会创建启发式解析器表。 有没有办法创建自己的启发式解析器表?

点赞
用户3395060
用户3395060

目前的 Lua API 中没有办法为您的协议创建一个真正的启发式解剖表,但我不确定这样做是否有意义。协议创建启发式解剖表的目的是让其他协议可以将其启发式解剖器注册到其中。例如,UDP 协议创建一个名为“udp”的启发式解剖表,这样像 RTP、STUN、Skype 等其他协议都可以将其启发式解剖器注册到其中,UDP 可以在不事先了解它们的情况下尝试它们所有。

但是在 Lua 插件中创建新协议时,不会有其他代码知道您的新协议或者您所创建的任何启发式解剖表。只有您自己的 Lua 代码会知道它。显然,您的新协议可能有子协议需要进行启发式尝试,就像您可能需要的那样,但您不需要启发式解剖表来完成这个目标——只需在 Lua 中直接调用您的子协议的启发式解剖器函数。

例如:

local myProto     = Proto("myproto",     "My Main Protocol")
local mySubproto1 = Proto("mysubproto1", "My First Sub-Protocol")
local mySubproto2 = Proto("mysubproto2", "My Second Sub-Protocol")

-- 子协议的启发式函数
-- 如果数据包是它的协议并对其进行了解剖,则返回 true
-- 否则返回 false
function heur_dissect_mySubproto1(tvbuf, pktinfo, root)
    -- 看一下传入的 tvb 是否是 Subproto1 协议
    -- 如果是,则添加树状结构等,或者 
    -- 调用 mySubproto1 的正常解剖器函数来完成这些工作
    return is_Subproto1
end

function heur_dissect_mySubproto2(tvbuf, pktinfo, root)
    -- 看一下传入的 tvb 是否是 Subproto2 协议
    return is_Subproto2
end

function myProto.dissector(tvbuf, pktinfo, root)
    -- 针对我的主协议进行操作

    -- 创建一个未被我的主协议解剖的 sub-tvb
    local newTvb = tvbuf(bytes_parsed_by_myproto):tvb()

    -- 调用子协议的启发式解剖函数
    -- 使用属于它们的 tvb 部分
    if heur_dissect_mySubproto1(newTvb, pktinfo, root) then
        -- 在此后完成任何需要的操作
    elseif heur_dissect_mySubproto2(newTvb, pktinfo, root) then
        -- 在此后完成任何需要的操作
    end
end

或者,如果您想更加高级一些,可以使用您自己的表格。。。

local myProto     = Proto("myproto",     "My Main Protocol")
local mySubproto1 = Proto("mysubproto1", "My First Sub-Protocol")
local mySubproto2 = Proto("mysubproto2", "My Second Sub-Protocol")

-- 为 myProto 创建一个启发式解剖表
local myProto_heuristic_table = {}

-- 注册进 myProto 的启发式表格中的函数
local function register_heuristic(func)
    myProto_heuristic_table[#myProto_heuristic_table + 1] = func
end

function heur_dissect_mySubproto1(tvbuf, pktinfo, root)
    -- 完成操作
    return is_Subproto1
end

-- "注册" 上面的函数
register_heuristic(heur_dissect_mySubproto1)

function heur_dissect_mySubproto2(tvbuf, pktinfo, root)
    -- 完成操作
    return is_Subproto2
end

register_heuristic(heur_dissect_mySubproto2)

function myProto.dissector(tvbuf, pktinfo, root)
    -- 对我的主协议进行操作

    local newTvb = tvbuf(bytes_parsed_by_myproto):tvb()

    -- 调用子协议的启发式解剖函数
    -- 使用属于它们的 tvb 部分
    for _, func in ipairs(myProto_heuristic_table) do
        -- 调用启发式函数
        if func(newTvb, pktinfo, root) then
            -- 在此完成需要的操作
            return
        end
    end
end
2014-12-25 06:16:35