利用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…...
5步攻克TradingAgents-CN本地化部署:从环境搭建到智能体协同
5步攻克TradingAgents-CN本地化部署:从环境搭建到智能体协同 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN 一、问题定位࿱…...
3个突破限制步骤:res-downloader让网络资源获取变得无拘无束
3个突破限制步骤:res-downloader让网络资源获取变得无拘无束 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 在数…...
从零开始:Gemma-3-12B-IT WebUI在A10/A100/V100上的部署实践
从零开始:Gemma-3-12B-IT WebUI在A10/A100/V100上的部署实践 1. 项目简介:为什么选择Gemma-3-12B-IT? 如果你正在寻找一个性能强劲、部署友好,又不需要天价硬件支持的大语言模型,那么Gemma-3-12B-IT可能就是你的理想选…...
CasADi实战:用Python搞定机器人路径规划中的数值优化问题(附IPOPT配置)
CasADi实战:用Python搞定机器人路径规划中的数值优化问题(附IPOPT配置) 机器人路径规划的核心在于如何在复杂环境中找到一条既安全又高效的轨迹。这本质上是一个带约束的数值优化问题——我们需要最小化某种代价函数(如路径长度或…...
Qwen3-TTS多语言语音合成实测:一键部署,生成10种语言的逼真语音
Qwen3-TTS多语言语音合成实测:一键部署,生成10种语言的逼真语音 1. 开篇:语音合成新体验 想象一下,只需输入一段文字,就能让电脑用10种不同语言"开口说话",而且声音自然得几乎分辨不出是机器生…...
手把手教你用ENA-TDR实测USB3.0线:阻抗、延时、串扰一个不漏
深度解析USB3.0线缆全参数测试:从TDR原理到实战报告解读 在高速数据传输领域,一根优质USB3.0线缆的价值往往被严重低估。当工程师们为系统稳定性问题焦头烂额时,很少有人会想到问题可能出在那根不起眼的连接线上。事实上,根据行业…...
实战指南:基于快马平台,快速构建可部署的unet卫星图像分割系统
今天想和大家分享一个实战项目:基于UNet的卫星图像建筑物分割系统。这个项目特别适合在InsCode(快马)平台上快速搭建,因为它涉及从数据处理到模型部署的完整流程,而平台的一键部署功能正好能省去繁琐的环境配置工作。 项目背景与需求分析 卫星…...
noice.nvim终极性能优化指南:让你的Neovim编辑器运行如飞
noice.nvim终极性能优化指南:让你的Neovim编辑器运行如飞 【免费下载链接】noice.nvim 💥 Highly experimental plugin that completely replaces the UI for messages, cmdline and the popupmenu. 项目地址: https://gitcode.com/gh_mirrors/no/noic…...
intv_ai_mk11行业落地:教育机构课件辅助生成、HR招聘文案批量产出案例
intv_ai_mk11行业落地:教育机构课件辅助生成、HR招聘文案批量产出案例 1. 模型能力与行业价值 intv_ai_mk11作为一款基于Llama架构的文本生成模型,在教育培训和人力资源领域展现出独特的实用价值。这个开箱即用的解决方案特别适合需要快速处理大量文本…...
洛雪音乐音源修复实战指南:从零开始的插件化解决方案
洛雪音乐音源修复实战指南:从零开始的插件化解决方案 【免费下载链接】New_lxmusic_source 六音音源修复版 项目地址: https://gitcode.com/gh_mirrors/ne/New_lxmusic_source 当你点击播放按钮却只看到加载动画无限循环,当搜索结果永远停留在&qu…...
