Wireshark的lua api: 创建新的启发式解剖器表。
2014-12-4 8:11:22
收藏:0
阅读:101
评论:1
我在 Lua 中找到了一个使用启发式表格的非常有用的示例。 a link 但是它并没有覆盖我的情况。
我已经在 Lua 中编写了自定义解析器。所描述的自定义协议有许多子协议。因此,我创建了新的子解剖表 DissectorTable.new() 并注册新的子协议。 但是某些子协议没有识别标志,它们的类型必须动态找到。
我希望使用 proto:register_heuristic() 方法注册启发式解析器,但是我的新表在 DissectorTable.heuristic_list() 列表中没有。
创建新的解析器表不会创建启发式解析器表。 有没有办法创建自己的启发式解析器表?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
目前的 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