当前位置: 首页 > news >正文

使用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 --TCPpinfo.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.lryc.cn/news/319318.html

相关文章:

  • ClickHouse副本节点数据损坏恢复
  • YOLOv9改进策略:注意力机制 | SimAM(无参Attention),效果秒杀CBAM、SE
  • 宝塔 安装对外服务Tomcat和JDK
  • rust最新版本安装-提高下载速度
  • 数据清洗与预处理:打造高质量数据分析基础
  • Linux服务器(Debian系)包含UOS安全相关巡检shell脚本
  • BS4网络提取selenium.chrome.WebDriver类的方法及属性
  • Prompt Engineering(提示工程)
  • 移远通信亮相AWE 2024,以科技力量推动智能家居产业加速发展
  • Java中上传数据的安全性探讨与实践
  • Leetcode 17. 电话号码的字母组合
  • 蓝桥杯单片机快速开发笔记——独立键盘
  • Swift 面试题及答案整理,最新面试题
  • 微信小程序上传图片c# asp.net mvc端接收案例
  • 57、服务攻防——应用协议RsyncSSHRDP漏洞批扫口令猜解
  • java:Druid工具类解析sql获取表名
  • MySQL--深入理解MVCC机制原理
  • 数据挖掘简介与应用领域概述
  • 瑞熙贝通打造智慧校园实验室安全综合管理平台
  • openstack调整虚拟机CPU 内存 磁盘 --来自gpt
  • 【IC设计】Verilog线性序列机点灯案例(三)(小梅哥课程)
  • 【打工日常】使用Docker部署团队协作文档工具
  • (一)Neo4j下载安装以及初次使用
  • QT for Mcu的学习建议
  • 【C语言初阶(五)】数组
  • 词令微信小程序怎么添加到我的小程序?
  • 【PyTorch】基础学习:在Pycharm等IDE中打印或查看Pytorch版本信息
  • SDN网络简单认识(2)——南向接口
  • 如何保存缓存和MySQL的双写一致呢?
  • 第十三篇:复习Java面向对象