我在Lua中找到了非常有用的启发式表用法示例。 a link 但它并不能涵盖我的情况。
我在lua写过自定义解剖器。描述的自定义协议有许多子下属。所以我创建了新的子目录表DissectorTable.new()并注册了新的子目录。 但是一些子协议没有识别标志,必须动态找出它们的类型。
我希望用proto:register_heuristic()方法注册启发式解剖器,但在DissectorTable.heuristic_list()列表中没有我的新表。
创建新的解剖器表不会创建启发式解剖器表。 有没有办法创建新的自己的启发式解剖器表?
答案 0 :(得分:2)
在当前的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")
-- the sub-prpotocol's heuristic function
-- returns true if the packet is its protocol and it dissected it
-- otherwise returns false
function heur_dissect_mySubproto1(tvbuf, pktinfo, root)
-- see if the passed in tvb is Subproto1 protocol
-- and if so then add tree items and such or
-- call mySubproto1's normal dissector function to do that stuff
return is_Subproto1
end
function heur_dissect_mySubproto2(tvbuf, pktinfo, root)
-- see if the passed in tvb is Subproto2 protocol
return is_Subproto2
end
function myProto.dissector(tvbuf, pktinfo, root)
-- do stuff for my main protocol
-- create a new sub-tvb of what has not been processed by the main protocol
local newTvb = tvbuf(bytes_parsed_by_myproto):tvb()
-- call the heuristic dissector functions of my sub protocols
-- with the portion of the tvb that belongs to them
if heur_dissect_mySubproto1(newTvb, pktinfo, root) then
-- do here anything you need to afterwards
elseif heur_dissect_mySubproto2(newTvb, pktinfo, root) then
-- do here anything you need to afterwards
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")
-- a heuristic dissector table for myProto
local myProto_heuristic_table = {}
-- a function to register into myProto's heuristic table
local function register_heuristic(func)
myProto_heuristic_table[#myProto_heuristic_table + 1] = func
end
function heur_dissect_mySubproto1(tvbuf, pktinfo, root)
-- do stuff
return is_Subproto1
end
-- "register" the above function
register_heuristic(heur_dissect_mySubproto1)
function heur_dissect_mySubproto2(tvbuf, pktinfo, root)
-- do stuff
return is_Subproto2
end
register_heuristic(heur_dissect_mySubproto2)
function myProto.dissector(tvbuf, pktinfo, root)
-- do stuff for my main protocol
local newTvb = tvbuf(bytes_parsed_by_myproto):tvb()
-- call the heuristic dissector functions of my sub protocols
-- with the portion of the tvb that belongs to them
for _, func in ipairs(myProto_heuristic_table) do
-- call the heuristic
if func(newTvb, pktinfo, root) then
-- do here anything you need to afterwards
return
end
end
end