利用wireshark lua扩展能力增加自定义解析器[注释解读版]
前言
Wireshark提供了lua扩展能力,可以定制一些Listner和Dissector,用于一些自定义的使用场景,例如:
| 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.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 + 1subtree: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)endend-- 增加自动解析配置,按照端口号进行解析
local udp_encap_table = DissectorTable.get("udp.port")
udp_encap_table:add(7555, p_multi)
参考
- Dissector Example
- Proto API
- Tvb API
相关文章:
利用wireshark lua扩展能力增加自定义解析器[注释解读版]
前言 Wireshark提供了lua扩展能力,可以定制一些Listner和Dissector,用于一些自定义的使用场景,例如: lua插件适应场景Listener报文统计、内容抽取等Dissector协议树解析,在wireshark中立等可看 已在以前的文档中积累了对于List…...
GPT-5不叫GPT-5?下一代模型会有哪些新功能?
OpenAI首席执行官奥特曼在上周三达沃斯论坛接受媒体采访时表示,他现在的首要任务就是推出下一代大模型,这款模型不一定会命名GPT-5。虽然GPT-5的商标早已经注册。 如果GPT-4目前解决了人类任务的10%,GPT-5应该是15%或者20%。 OpenAI从去年开…...
2024.1.23(347.前k个高频元素)
2024.1.23(347.前k个高频元素) 思路 这道题目主要涉及到如下三块内容: 1.要统计元素出现频率 2.对频率排序 3.找出前K个高频元素 首先统计元素出现的频率,这一类的问题可以使用map来进行统计。 然后是对频率进行排序,这里我们可以使用一种…...
MySQL对数据库的操作
前腰:本节只是的数据库本身进行增删查改、备份、恢复等操作,而不是对数据库内的数据表做操作,还请您区分好这两点。 1.创建数据库 # 创建数据库的语法形式 CREATE DATABASE [IF NOT EXISTS] database_name [create_specification]# 大写的是…...
解决Unity WebGLInput插件全屏输入的问题
unity webgl的中文输入插件WebglInput在全屏的时候会出现无法输入中文/输入的英文会字母出现在光标后面/什么都输入不了的等无法正常使用的情况。 插件官网作者给出了unity的2017,2018,2019版本的全屏输入解决方法。 最新插件下载地址:http…...
Android14实战:调整A2DP音量曲线(五十三)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…...
vector讲解
在学习玩string后我们开始学习vector,本篇博客将对vector进行简单的介绍,还会对vector一些常用的函数进行讲解 vector的介绍 实际上vector就是一个数组的数据结构,但是vector是由C编写而成的,他和数组也有本质上的区别ÿ…...
nvm 配置淘宝镜像失效,以及安装node后 npm-v 无效
win11 nvm版本 1.1.4 和1.1.7和1.1.12(目前最新版本24年 一月二十三日) 以上nvm版本都会出现一下问题, 从https://github.com/coreybutler/nvm-windows/releases 下载nvm安装包如下图 傻瓜式安装后,不用去配置环境变量&#…...
【Android Gradle 插件】Gradle 基础配置 ④ ( Gradle Wrapper 配置作用 | Gradle 下载的依赖库存放位置 )
一、Gradle Wrapper 配置作用 gradle wrapperdistributionBaseGRADLE_USER_HOME distributionPathwrapper/dists distributionUrlhttps\://services.gradle.org/distributions/gradle-6.7.1-bin.zip zipStoreBaseGRADLE_USER_HOME zipStorePathwrapper/distsGradle Wrapper 配…...
Deepin_Ubuntu_查看树形目录结构(tree)
Linux系统(Deepin、Ubuntu)中,可以使用tree命令来查看树形目录结构,下面是一些示例: 查看当前目录的树形结构: tree查看指定目录的树形结构,例如/etc/X11/fonts目录: tree /etc/X…...
Java Excel分割成许多小文件
最近在处理excel,数据很多,需要将excel拆分成许多小块,并保留原来的格式,于是写了该算法,并能保留原来的样式,使用很简单: Sheet splitSheet ExcelUtil.split(sheet, 0, 20, 5, 8); 传入开始…...
【心得】java从CC1链入门CC链个人笔记
来劲了,感觉离真正的CTF又近了一步。 本文仅从一个萌新的角度去谈,如有纰漏,纯属蒟蒻。 目录 CC链概念 CC链学习前置知识 CC1链 Version1 Version2 Version3 CC链概念 CC链 Commons Collections apache组织发布的开源库 里面主要对…...
Django migration 新增外键的坑
TL;DR 永远不要相信 makemigrations! migrate 之前一定好好看看 migrate 了啥东西,必要时手动修改生成的 migrate 文件。 最好把db的更新与服务代码更新解耦 场景 先描述下场景: 现在有两个表,一个是 question,一…...
相关系数(皮尔逊相关系数和斯皮尔曼相关系数)
本文借鉴了数学建模清风老师的课件与思路,可以点击查看链接查看清风老师视频讲解:5.1 对数据进行描述性统计以及皮尔逊相关系数的计算方法_哔哩哔哩_bilibili 注:直接先看 ( 三、两个相关系数系数的比较 ) 部分&#x…...
了解 Vite 插件
众所周知 Vite 是基于 Rollup 的构建工具,Vite 插件为了优化、扩展项目构建系统功能的工具。 比如 vite-plugin-eslint 为我们提供了代码分析的功能,帮助我们在开发过程中的风格一致性。 简单示例 本文中的示例是基于 Vite Vue3.x TypeScript 来实现…...
算法竞赛基础:C++双向链表的结构和实现(普通链表、List、静态链表)
算法竞赛基础:双向链表 本文将会介绍在算法竞赛中双向链表的几种使用方式,适合有一定基础的人阅读。 双向链表的结构 一般来说,普通的链表结构是这样的: struct node {int num;node *next; }next指针指向下一个链表ÿ…...
openssl3.2/test/certs - 019 - ca-nonca trust variants: +serverAuth, +anyEKU
文章目录 openssl3.2/test/certs - 019 - ca-nonca trust variants: serverAuth, anyEKU概述笔记 ca-nonca.pem from exp 016openssl3.2/test/certs - 019 - ca-nonca trust variants: serverAuth, anyEKUEND openssl3.2/test/certs - 019 - ca-nonca trust variants: serverAu…...
Unity SRP 管线【第五讲:URP烘培光照】
本节,我们将跟随数据流向讲解UEP管线中的烘培光照。 文章目录 一、URP烘培光照1. 搭建场景2. 烘培光照参数设置MixedLight光照设置:直观感受 Lightmapping Settings参数设置: 3. 我们如何记录次表面光源颜色首先我们提取出相关URP代码&#…...
Mysql运维篇(一) 日志类型
一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人,如有侵权请留言,我及时删除。 一、mysql相关日志 首先,我们能接触到的,一般我们排查慢查询时,会去看慢查询日志。如果做过数据备份会恢复的,可能接触或用过BinLog。那还有其他的吗?对MySQL原理…...
【C语言】结构体与内存操作函数 总结
结构体 一、结构体简介 C 语言内置的数据类型,除了最基本的几种原始类型,只有数组属于复合类型,可以同时包含多个值,但是只能包含相同类型的数据,实际使用中并不够用。 实际使用中,主要有下面两种情况&a…...
Hello Robot 发布 Stretch 4 移动操作机器人,推动具身智能迈向家庭实用化
近日,机器人公司 Hello Robot 正式推出了其新一代产品——Stretch 4 移动操作机器人。作为 Stretch 3 的全面升级迭代,全新的 Hello Robot 具身智能平台 在移动灵活性、环境感知、运行性能与续航能力上实现了显著突破,并将设计重心明确转向…...
【鸿蒙 HarmonyOS】从零到一:Node.js 环境配置与 DevEco Studio 无缝对接指南
1. 为什么需要Node.js环境? 如果你刚刚接触鸿蒙开发,可能对DevEco Studio里弹出的"Node.js not found"提示感到困惑。其实Node.js在鸿蒙生态中扮演着重要角色——它不仅是npm包管理器的运行环境,更是鸿蒙应用编译工具链的基础依赖。…...
Rust命令行工具开发实战:从架构设计到工程化发布
1. 项目概述:为什么是Rust,为什么是命令行工具?最近几年,如果你关注过系统编程或者高性能工具领域,Rust这个词出现的频率会越来越高。它不再是一个“未来之星”,而是实实在在地在重塑我们手中的工具链。我自…...
ENSP实战:从Console到AAA,详解交换机安全登录的进阶配置
1. 从零开始:认识交换机登录安全的基本面 第一次接触企业级交换机时,很多新手都会被各种登录方式搞得晕头转向。我刚开始做网络运维时,就曾经因为没设置好登录认证,导致测试环境的交换机被隔壁团队的同事误操作重启。今天我们就从…...
Banana Pi BPI-M2S边缘AI开发板:双千兆网口与5TOPS NPU实战指南
1. 项目概述:一块为边缘AI与网络应用而生的全能型单板计算机 最近在捣鼓一些边缘计算和轻量级网络服务的项目,一直在寻找一块性能足够、接口丰富,同时性价比又不错的开发板。市面上常见的树莓派4B固然经典,但在面对需要一定AI推理…...
避开这些坑:用Padim+ONNX做工业缺陷检测时,预处理和后处理的那些关键细节
PadimONNX工业缺陷检测实战:预处理与后处理的7个致命陷阱与解决方案 当你在生产线上部署Padim模型时,最危险的往往不是算法本身,而是那些容易被忽略的预处理和后处理细节。一位工程师曾因为0.1%的标准化参数误差导致整个质检系统误判…...
掌握这四大趋势,让你的AI Agent真正“能干活”!CSDN收藏必备指南
本文深入探讨了企业级AI Agent的四大核心趋势:MCP协议实现可扩展集成、GraphRAG提升回答一致性、AgentDevOps确保行为质量与推理链路稳定性、RaaS模式实现结果计费。文章指出,这些趋势共同推动AI Agent从“可用”到“好用”的跨越,并提供了实…...
AI 项目经理 Agent:拆解任务、分配资源与监控风险
AI项目经理Agent:拆解任务、分配资源与监控风险的全流程落地指南从GPT-4发布以来,“AI替代白领”的声音此起彼伏,但作为一名在互联网大厂带过3个亿级SaaS交付项目、同时搞了2年AI辅助项目管理(AIPM)落地的软件工程师&a…...
开源APM探针bee-apm:无侵入式Java应用性能监控与链路追踪实战
1. 项目概述:从“蜜蜂”视角重新审视应用性能在分布式系统和微服务架构成为主流的今天,一个用户请求的背后,可能串联着十几个甚至几十个不同的服务。当线上出现一个性能瓶颈或一个诡异的错误时,定位问题的过程就像在漆黑的迷宫里寻…...
