使用Lua编写Wireshark解析ProtoBuf插件

文章目录

  • Wireshark Protobuf Lua-dissector
    • Step 1: 获取 Wireshark
    • Step 2: 配置ProtoBuf相关设置
      • 添加ProtoBuf查找路径
    • Step 3 运行和调试Lua代码
      • 1. 添加Lua脚本
      • 2. 运行和调试
    • Step 4: 写Lua Dissector代码 :)
    • Step 5(Optional): Decode As
    • Github工程地址

Wireshark Protobuf Lua-dissector

最近工作中遇到需要Wireshark抓包排查项目网络库的问题,并且需要用ProtoBuf协议解析抓到的二进制数据。网络上查了一圈都没有找到简单明了的教程能让我快速上手的,就搞了这个教程,帮自己纪录的同时也希望能帮到遇到同样问题的你。

这个教程专注于帮你写Lua插件帮你解析Wireshark中的ProtoBuf包,请确保已经掌握基础的Wireshark使用方法。如果还没掌握,网上有很多教学,很快就可以上手了!

Step 1: 获取 Wireshark

直接从 官网 下载。

Step 2: 配置ProtoBuf相关设置

添加ProtoBuf查找路径

顾名思义,告诉Wireshark去哪里查询你的.proto文件。我把我的所有(其实就一个).proto文件都放到了同一个文件夹里,然后添加到Wireshark里即可。

在版本 4.2.3中, 你可以通过一下方法配置ProtoBuf查找路径:

Edit -> Preferences,接着在左侧菜单中找到并展开Protocols标签,然后找到Protobuf并打开对应页面,就会得到以下的界面:

添加Proto文件路径

然后点击 “Protobuf search paths” 旁边的Edit按钮打开新窗口:

设置Proto文件路径

我把所有.proto文件都放一起了,也没有其他外部引用,所以我只添加了一个文件夹路径就OK啦。

Step 3 运行和调试Lua代码

1. 添加Lua脚本

创建并将我们自己写的Lua脚本放到指定文件夹中,Wireshark才能识别到我们的Lua脚本:

Help -> About Wireshark

插件路径

点击Folder页签,双击Personal Lua Plugins路径打开文件夹,并将我们写好的脚本放入其中。

为了测试方便,我们现在只需要写一行简单的打印即可:

print("Hello World")

2. 运行和调试

成功将Lua脚本放到对应文件夹后,Wireshark会在每次启动的时候都运行一下你的脚本。你可以打开Lua控制台窗口看看脚本运行的结果。

打开控制台很简单,点击 Tools -> Lua Console

在这里插入图片描述

上半部分的文本输入框是可以实时输入并且运行的Lua代码,我们这里用不到先不管它。重点放在下半部的输出窗口,可以看到我们脚本运行的结果已经打印出来了。

不过我们不希望每次改了代码还要重新运行Wireshark怎么办呢?Wireshark提供了重载Lua脚本的功能,可以在 Analysis -> Reload Lua Plugins 中找到,或者直接点击快捷键 Ctrl+Shift+L

需要注意的是,重载Lua脚本之后,Wireshark会在已经捕获的每个包上重新跑一遍我们的Lua脚本。如果你此时已经捕获了大量的包,那么重载可能会消耗不少的时间。

Step 4: 写Lua Dissector代码 😃

到这步为止,所有的配置都已经完成,只需用Lua实现我们的ProtoBuf Dissector即可。

在我们写之前还有一些很有用的参考资料:

  1. Wireshark有Lua APIs的文档在这里。

  2. 还有两个很好的简单教程在这里和那里。

以下的代码示例是在我综合了上面的内容之后,摘掉非必要的代码而实现的一个极简的Lua Dissector。不过也存在过于精简而不符合实际运用的需要,这个就需要使用者根据自己的实际需求和协议设计去修改代码了。

--获取Wireshark库里现成的ProtoBuf解析器
local protobuf_dissector = Dissector.get("protobuf");

--Proto类可以拿来实现自己的解析器
--不过我这里只用来帮我注册上Wireshark的回调
--然后需要实际解析ProtoBuf的时候,我会调用上面获取到的官方解析器
--@param myProto 名字
--@param "My Proto" 描述
local my_proto = Proto("MyProto", "My Proto");

---Wireshark会在每个包上调用这个预设函数
---@param tvb table 一个辅助操作读取到的二进制流的类对象
---@param pinfo table 储存了包体信息的类对象
---@param tree table GUI上展示信息用的根节点
-- 我的数据流会截取到的数据格式如下:(因项目而异)
-- [Header][Message Data]
-- Header: [2 bytes length]
my_proto.dissector = function(tvb, pinfo, tree)
    if tvb:captured_len() == 0 then return end;
    if pinfo.port_type == 2 then --TCP
        pinfo.columns.columns.protocol:set(my_proto.name);
        --创建一个新的UI节点来展示我们ProtoBuf解析的数据,当然也可以不创建新节点,直接展示在tree上
        local subtree = tree:add(my_proto, tvb());
        local offset = 0;
        local length = tvb(0, 2):le_uint(); --[2 bytes length]
        local data_len = length - 2; --计算实际的数据长度
        offset = offset + 2;
        --这行很关键,官方的解析器会根据这个字段去.proto文件里找对应的协议去解析
        pinfo.private["pb_msg_type"] = "message,myProto.Message";
        pcall(Dissector.call, protobuf_dissector, tvb(offset, data_len), pinfo, subtree);
    end
end

--将我的Proto类对象注册到TCP端口上
--要注意的是,当你还不清楚实际发生的端口号时,先填0,后续再配置即可(具体配置方法看下一部分"Decode As")
DissectorTable.get("tcp.port"):add(0, my_proto);

Step 5(Optional): Decode As

当你需要动态调整Tcp端口时,可以在以下的菜单中手动配置:

Analyze -> Decode As

手动绑定端口

点击"+"号添加新的一行,字段选"TCP port"然后填入实际端口号,最后在Current下拉框中,找到我们刚刚添加的"MYPROTO"解析器后单击选择。

最后点击保存就配置完成啦!

PS:如果你的代码无误,又看不到你的解析器,请检查一下你是不是没有重载Lua代码。

Github工程地址

源码和教程我都有上传到Github,有需要的同学可以自行上去取源码
https://github.com/Kayn-Liu/WiresharkProtoBufDissectorLua.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/462839.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最新潮乎盲盒系统源码,附搭建教程

搭建方法 宝塔创建网站,上传后端程序到根目录,在.env修改数据库账号密码 上传数据库,伪静态thinkphp 运行目录public PHP扩展安装下面的 禁用函数先禁用下面那个,就可以了 前端是uniapp 后台admin 禁用函数putenv、 扩展fileinfo…

python问题:vscode切换环境,pip安装库网络错误

python问题:vscode切换环境,pip安装库网络错误 vscode切换环境pip安装库网络错误 记录一下遇见的python问题。 vscode切换环境 在vscode上面的搜索框输入 > select interpreter然后选择需要的环境。 pip安装库网络错误 用requirements.txt来安装…

【目标检测】原始的 YOLOv1 网络结构(GoogLeNet 作为 backbone 的实现)

现在看网上的很多 YOLOv1 的代码实现,基本都是使用新的 backbone,例如 ResNet 或者 VGG 来实现的,因为这些后面的通用的 backbone 可能比较方便的获得预训练模型,不需要从头开始训练。 但是我就是想看一下,一开始 YOL…

IntelliJ IDEA 面试题及答案整理,最新面试题

IntelliJ IDEA中的插件系统如何工作? IntelliJ IDEA的插件系统工作原理如下: 1、插件架构: IntelliJ IDEA通过插件架构扩展其功能,插件可以添加新的功能或修改现有功能。 2、安装和管理: 通过IDEA内置的插件市场下载…

游戏服务端配置“热更”及“秒启动”终极方案(golang/ygluu/卢益贵)

游戏服务端配置“热更”及“秒启动”终极方案(golang/ygluu/卢益贵) 关键词:游戏微服务架构、游戏服务端热更、模块化解耦、golang 一、前言 众所周知,游戏服务端配置信息热更有几大问题(非lua架构)&…

电脑那个部件坏了或者是哪个软件需要修复来看价钱

电脑维修价格表是多少? 价格取决于计算机的哪个部分损坏或哪个软件需要修复。 由于电脑中的部件非常多,而且会以各种奇怪的方式出现问题,下面我们就来看看具体的充电方法。 电脑维修价格表: 1. 重新安装系统。 安装XP系统通常需…

Tomcat Session 集群 ---------会话保持

一、 负载均衡、反向代理 环境搭建: nginx服务器192.168.246.7 tomcat 1服务器192.168.246.8 tomcat 2服务器192.168.246.9 7-1 nginx服务器搭建 [rootzzcentos1 ~]#systemctl stop firewalld [rootzzcentos1 ~]#setenforce 0 [rootzzcentos1 ~]#yum install …

Visual Studio配置libtorch(cuda安装一步到位)

Visual Studio配置libtorch visual Studio安装cuDNN安装CUDAToolkit安装libtorch下载Visual Studio配置libtorch(cuda版本配置) visual Studio安装 visual Studio点击安装 具体的安装和配置过程这里就不进行细讲了,可以参考我这篇博客Visual Studio配置OpenCV(保姆…

openCV实现拖拽虚拟方块

一、项目效果: 二、核心流程: openCV读取视频流、在每一帧图片上画一个矩形。使用mediapipe获取手指关键点坐标。根据手指坐标位置和矩形的坐标位置,判断手指点是否在矩形上,如果在则矩形跟随手指移动。 三、代码流程&#xff1…

基于SpringBoot框架实现的B2B平台的医疗病历交互系统

采用技术 基于SpringBoot框架实现的B2B平台的医疗病历交互系统的设计与实现~ 开发语言:Java 数据库:MySQL 技术:SpringBootMyBatis 工具:IDEA/Ecilpse、Navicat、Maven 页面展示效果 管理员角色 医院管理 医院注册 医院文…

C语言—打印如图矩阵

输出矩阵 在一个二维数组中形成并输出如下矩阵: #include <stdio.h> main() { int i,j,a[5][5];for(i0;i<4;i)for(j0;j<4;j)if(i<j) a[i][j]1;else a[i][j]i-j1;for(i0;i<4;i){ for(j0;j<4;j)printf("%d ",a[i][j]);printf("…

介绍一款鼠标无边界软件

"Mouse without Borders" 是一款由微软开发的免费工具&#xff0c;旨在帮助用户在多台计算机之间实现无缝的鼠标和键盘共享。通过 Mouse without Borders&#xff0c;用户可以在一个主控制台上控制多台计算机&#xff0c;就像操作一个大型虚拟桌面一样。 这个工具可…

zookeeper基础学习之六: zookeeper java客户端curator

简介 Curator是Netflix公司开源的一套zookeeper客户端框架&#xff0c;解决了很多Zookeeper客户端非常底层的细节开发工作&#xff0c;包括连接重连、反复注册Watcher和NodeExistsException异常等等。Patrixck Hunt&#xff08;Zookeeper&#xff09;以一句“Guava is to Java…

数字IC实践项目(9)—SNN加速器的设计和实现(tiny_ODIN)

数字IC实践项目&#xff08;9&#xff09;—基于Verilog的SNN加速器 写在前面的话项目整体框图完整电路框图 项目简介和学习目的软件环境要求 Wave&CoverageTiming&#xff0c;Area & Power总结 写在前面的话 项目介绍&#xff1a; SNN硬件加速器是一种专为脉冲神经网…

nanodet笔记

nanodet简单笔记 这里简单记录下nanodet的结构. 网络stride8,16,32的feature 经过共享卷积处理后cat在一起再transpose,直接产生shape为(B, n_grid, n_class8*4),其中B为batchsize, n_grid为feature map上点的个数, 4:表示top,bottom, left, right 4个值,每个值使用8个bin的概…

QT C++ QButtonGroup应用

//QT 中&#xff0c;按钮数量比较少&#xff0c;可以分别用各按钮的信号和槽处理。 //当按钮数量较多时&#xff0c;用QButtonGroup可以实现共用一个槽函数&#xff0c;批量处理&#xff0c;减少垃圾代码&#xff0c; //减少出错。 //开发平台&#xff1a;win10QT6.2.4 MSVC…

《计算机视觉中的深度学习》之目标检测算法原理

参考&#xff1a;《计算机视觉中的深度学习》 概述 目标检测的挑战&#xff1a; 减少目标定位的准确度减少背景干扰提高目标定位的准确度 目标检测系统常用评价指标&#xff1a;检测速度和精度 提高精度&#xff1a;有效排除背景&#xff0c;光照和噪声的影响 提高检测速度…

GitHub Actions持续部署

一、概述 1.1Github Action介绍 什么是Github Action ? GitHub Actions是GitHub提供的CI/CD&#xff08;持续集成/持续部署&#xff09;服务。它允许你在GitHub仓库中自动化、定制和执行你的软件开发工作流。你可以发现、创建和分享用于执行任何你想要的工作的操作&#xff0…

媒体发稿:澳门媒体发稿7个流程

推广平台澳门是一个重要的度假旅游娱乐终点&#xff0c;都是媒体领域热议的话题。对于澳门的媒体发稿营销推广要求&#xff0c;大家提供了一个简单易用的套餐系统软件&#xff0c;帮助大家在澳门媒体上发表推广文章。下面我们就根据7个阶段&#xff0c;详解构建这一套餐推广平台…

Vue+SpringBoot打造教学过程管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 教师端2.2 学生端2.3 微信小程序端2.3.1 教师功能如下2.3.2 学生功能如下 三、系统展示 四、核心代码4.1 查询签到4.2 签到4.3 查询任务4.4 查询课程4.5 生成课程成绩 六、免责说明 一、摘要 1.1 项目介绍 基于JAVAVu…