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

前言

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

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

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

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

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

想多说点

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

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

那么利用Wireshark Lua脚本将其固化下来,将是非常好的实践!

解析器基本组件

组件 说明
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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值