利用wireshark lua扩展能力增加自定义解析器[注释解读版]

这篇具有很好参考价值的文章主要介绍了利用wireshark lua扩展能力增加自定义解析器[注释解读版]。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

Wireshark提供了lua扩展能力,可以定制一些ListnerDissector,用于一些自定义的使用场景,例如:

lua插件 适应场景
Listener 报文统计、内容抽取等
Dissector 协议树解析,在wireshark中立等可看

已在以前的文档中积累了对于Listener的使用,见Listener。

本文将继续介绍下Dissector的扩展使用。

介绍方式上,采用对于官网例子作详细地注释进行解读。

想多说点

这次尝试源于一次对于接口文档的阅读,想避免在后期又一次地翻阅文档,重新查看协议说明和字段描述。

为什么要重新费心费力去做某些重复的事情呢?

那么利用Wireshark Lua脚本将其固化下来,将是非常好的实践!文章来源地址https://www.toymoban.com/news/detail-811187.html

解析器基本组件

组件 说明
Proto 定义协议,包括字段和解析器函数定义;在解析树中体现为一个节点
ProtoField 定义协议字段类型
Dissector Chain 解析器链,某个解析器完成自身协议层解析后,可以在尾部继续调用其它解析器,完成整个报文解析

Tvb参数组件特殊说明

  • buf(offset[, length])切片操作
tvb 参数 说明
offset 必须,注意从零开始
length 可选,如果不指定,将获取整个tvb长度
  • buf(offset[, length]):转型操作
tvb API 说明
buf(…):tvb() 调用其它解析器需要重新生成新的tvb作为参数
buf(…):uint*() 获取数值,例如,uint*类型系列

启用扩展

  • 将扩展lua脚本文件放入Wireshark安装目录
  • Wireshark安装目录的init.lua中增加相应导入脚本
dofile(DATA_DIR.."example.lua")

讲解官网解析器例子


-- 分析器根协议
--- + 第一个参数为协议缩写,将后期用于过滤条件,所以,要求全局唯一
--- + 第二个参数为协议描述,默认用于协议解析树的节点Label,要求全局唯一

local p_multi = Proto("multi", "MultiProto")

-- 嵌套自定义子协议
local p_multi_priority = Proto("multi.flags", "MultiProto Flags")

-- 协议字段值解析映射,对于枚举类型非常适合,将码值解析为更易懂的文本
-- 对于没有定义映射,将显示为'Unknown (value)'样式
local falseortrue = {
        [0] = "false",
        [1] = "true"
}

-- 协议字段类型声明,常用的字段类型为uint*系列,以及stirng、bytes等类型
--- + 第一个参数将用于过滤条件,最好以根协议的缩写命名开头,但具有唯一性即可
--- + 第二个参数为字段描述,在协议解析树中作为节点名字,在协议内要求描述唯一
p_multi_priority.fields.priority_value = ProtoField.uint8("multi.flags.priority", "Priority Value", base.DEC)
p_multi_priority.fields.prefix_flag = ProtoField.uint8("multi.flags.prefix", "Prefix Flag", base.DEC, falseortrue)
p_multi_priority.fields.suffix_flag = ProtoField.uint8("multi.flags.suffix", "Suffix Flag", base.DEC, falseortrue)

-- 解析器函数
--- + 第一个参数为报文数据,可以进行切片操作
--- + 第二个参数为wireshar解析行描述对象,可以操作修改行描述信息
--- + 第三个参数为wireshar当前解析树,可以继续增加新的子树和链接其它协议器
function p_multi_priority.dissector(buf, pkt, tree)
    -- 协议解析区域,在自身根节点中通过buf的第二个参数指明
    -- 选中时,Wireshark会高亮的节点对应的码流区域,其它add操作亦然
    -- 具体此协议,解析一个字节长度
    local subtree = tree.add(p_multi_priority, buf(0, 1))
    local u8 = buf(0, 1):uint()

    subtree:add(p_multi_priority.fields.priority_value, buf(0, 1), bit32.band(u8, 0xF))
    subtree:add(p_multi_priority.fields.prefix_flag, buf(0, 1), bit32.rshift(bit32.band(u8, 0x10), 4))
    subtree:add(p_multi_priority.fields.suffix_flag, buf(0, 1), bit32.rshift(bit32.band(u8, 0x20), 5))
end

-- 自身解析层
-- 解析映射
local vs_protos = {
        [2] = "mtp2",
        [3] = "mtp3",
        [4] = "alcap",
        [5] = "h248",
        [6] = "ranap",
        [7] = "rnsap",
        [8] = "nbap"
}

p_multi.fields.proto = ProtoField.uint8("multi.protocol", "Protocol", base.DEC, vs_protos)
p_multi.fields.dir   = ProtoField.uint8("multi.direction", "Direction", base.DEC, { [1] = "incoming", [0] = "outgoing"})
p_multi.fields.raw   = ProtoField.bytes("multi.text", "Text")


-- 默认链接解析器,对于不需要深入解析的区域,可以采用裸码流解析器
local data_dis = Dissector.get("data")

-- 解析器能够识别的链接解析器
local protos = {
        [2] = Dissector.get("mtp2"),
        [3] = Dissector.get("mtp3"),
        [4] = Dissector.get("alcap"),
        [5] = Dissector.get("h248"),
        [6] = Dissector.get("ranap"),
        [7] = Dissector.get("rnsap"),
        [8] = Dissector.get("nbap"),
        [9] = Dissector.get("rrc"),
        -- 注意,解析器的不同获取方式
        [10] = DissectorTable.get("sctp.ppi"):get_dissector(3), -- m3ua
        [11] = DissectorTable.get("ip.proto"):get_dissector(132), -- sctp
}

-- 注意,解析器函数链接类其它协议器
function p_multi.dissector(buf, pkt, tree)
        -- 修改报文行的协议为已识别的协议
        pkt.cols.protocol:set(p_multi.name)
        
        -- local length = buf:len()

        -- 生成自身解析树
        local subtree = tree:add(p_multi, buf(0, 3))
        local offset = 0

        -- 注: subtree:add_le 可以按照字节序小端来获取报文中的数据
        subtree:add(p_multi.fields.proto, buf(offset, 1))
        offset = offset + 1

        subtree:add(p_multi.fields.dir, buf(offset, 1))
        offset = offset + 1

        -- 调用自身解析树的子协议进行解析
        --- 注意第一个参数需要产生新的tvb
        --- 注意第三个参数为自身子树节点
        p_multi_priority.dissector(buf(offset, 1):tvb(), pkt, subtree)
        offset = offset + 1

        -- 尾部链接其它解析器,注意树节点参数的不同
        local proto_id  = buf(0,1):uint()
        local dissector = protos[proto_id]

        if dissector ~= nil then
                -- 链接其它可以识别的解析器
                dissector:call(buf(offset):tvb(), pkt, tree)
        elseif proto_id < 2 then
                -- 特殊分支,在自身解析层完成,注意树节点为自身树
                subtree:add(p_multi.fields.raw, buf(offset))
        else
                -- 作为默认链接裸数据解析器
                data_dis:call(buf(offset):tvb(), pkt, tree)
        end

end

-- 增加自动解析配置,按照端口号进行解析
local udp_encap_table  = DissectorTable.get("udp.port")
udp_encap_table:add(7555, p_multi)

参考

  • Dissector Example
  • Proto API
  • Tvb API

到了这里,关于利用wireshark lua扩展能力增加自定义解析器[注释解读版]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Wireshark添加自定义协议解析

    最终效果如下: 参考文档:https://mika-s.github.io/topics/ 此参考文档中7个例子教我们如何编写lua脚本去识别我们自定义的协议 https://www.wireshark.org/上下载安装包安装即可。我的安装路径是 D:InstallWireshark ,在Wireshark的菜单:帮助-关于-文件夹中有安装位置: 本次要解析的协议是

    2024年02月04日
    浏览(37)
  • Postman接口Body请求体增加字段注释

    一直在使用Postman维护接口和文档确实非常方便,还可以随时调用测试。之前一直把注释写在Documentation中单独说明,但是需要来回切换不说,还非常不直观,但是直接在Body中写注释,发送Body的时候会把注释也带过去,后台接口解析会直接报错。于是大概研究了一下,解决了

    2024年02月12日
    浏览(44)
  • 通过实现MyBatis的Interceptor接口在SQL头部增加统一注释

    从事运维或DBA工作的童鞋会非常熟悉在SQL前部增加注释的操作。类似如下的SQL语句: 这种注释虽然不会影响SQL执行,但是会为运维和DBA工作带来极大的便利如: 对慢查询进行优化时,可以通过注释信息快速找到研发团队及研发人员,同时研发人员也可以快速定位到对应业务

    2024年02月03日
    浏览(51)
  • 虚拟机扩展磁盘与增加磁盘操作

    正在使用的磁盘空间不足,针对根分区进行扩容 前沿: (1)新的的 /dev/sdb 磁盘 (2)新的项目使用目录 /ceshi (3)将新的磁盘挂载在新的目录,不使用系统盘 1、对新加磁盘进行初始化,全部为默认 2、将新创建的分区格式化为xfs格式 3、创建挂载目录并挂载 重启后reboot,挂

    2024年02月12日
    浏览(43)
  • Three.js 镜面反射Reflector 为MeshStandardMaterial增加Reflector能力

    效果 效果 官方案例 区别:官方的案例更像一个镜子 没有纹理等属性 也没有透明度修改 根据源码进行修改为 MeshStandardMaterial实现反射 使用案例 源码:

    2024年01月16日
    浏览(39)
  • 【人工智能】为什么说大语言模型能力遵循规模理论 Scaling Law(即模型能力随着训练计算量增加而提升) ?

    目录 为什么说大语言模型能力遵循规模理论 Scaling Law(即模型能力随着训练计算量增加而提升) ?

    2024年03月25日
    浏览(73)
  • Kruise Rollout:基于 Lua 脚本的可扩展流量调度方案

    作者:潘梦源 Kruise Rollout [ 1] 是 OpenKruise 社区开源的渐进式交付框架。Kruise Rollout 支持配合流量和实例灰度的金丝雀发布、蓝绿发布、A/B Testing 发布,以及发布过程能够基于 Prometheus Metrics 指标自动化分批与暂停,并提供旁路的无感对接、兼容已有的多种工作负载(Deployment、

    2024年02月09日
    浏览(38)
  • 利用wireshark对TCP抓包分析

    抓包结果已上传可免费下载对应观看: wireshark抓包结果 我的机子192.168.1.131简称A与服务端机子223.166.138.30简称B先三次握手建立TCP连接,再进行HTTP请求,最后四次挥手断开TCP连接 1.三次握手: A先给B发出一个SYN包请求建立连接 B给A发回一个ACK SYN包针对上一个SYN请求且发出请求

    2024年02月09日
    浏览(46)
  • 实验9 利用Wireshark软件分析DHCP

    目录 一、实验目的及任务 二、实验环境 三、预备知识 四、实验步骤  五、实验报告内容 一、实验目的及任务 1.通过协议分析进一步明确DHCP报文格式中各字段语法语义; 2.进一步明确DHCP工作原理并能够描述 二、实验环境 联网的计算机;主机操作系统为Windows;WireShark等软件

    2023年04月23日
    浏览(50)
  • 实验7 利用Wireshark软件分析TCP

    目录 一、 实验目的及任务 二、 实验环境 三、 预备知识 四、 实验步骤 五、 实验报告内容 一、 实验目的及任务 1.通过协议分析进一步明确TCP报文段结构中各字段语法语义; 2.能够描述TCP协议的序号确认机制、连接管理、RTT估算、流量控制机制。 二、 实验环境 联网的

    2023年04月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包