一、概要
Wireshark是一款全球使用与开发维护人数最多的遵循GPL协议开源的网络协议分析软件,全球开发者为Wireshark编写了数千种协议的解析插件。
在实际的工作中,往往需要分析某些私有协议的报文,或者用到官方wireshark没有提供的某些功能,或者需要将Wireshark的报文解析功能移植到自己的特定应用场景中……这一切,都需要我们在理解Wireshark工作原理的基础上,对其进行二次开发。
Wireshark的两大特点使二次开发比较容易:
● 代码是遵循GPL协议开源的,任何人无论出于私人还是商业目的,都可以下载并且使用 Wireshark。
● 提供了插件plugins机制,可基于C或Lua语言进行二次开发
本文编写于2024年3月,参考版本wireshark-4.2.3,QT6.6.3 community ,cmake3.29.0
二、Wireshark 软件整体架构
wireshark的基本软件框架如下。
其中有几个重要的依赖库,
● glib, libpcap, Qt 是 Wireshark 的重要第三方依赖库
● wiretap, wsutil, epan 实现为动态库, epan 的库文件名是 libwireshark.so
● tshark 和 wireshark 是可执行程序, 其中 wireshark 带有图形界面, 它是通过 Qt 实现的, 而 tshark 为命令行程序
三、基本概念
- C 解析器可分为内置解析器和插件(plugins)解析器
- 注册register
- 交接handoff
- 解析dissector
四、解析器实现逻辑
Wireshark 协议解析器dissector负责解析报文中与当前协议相关的部分,然后把后面数据的解析权交给下一个解析器subdissector。解析器流程总是先从一个名为"Frame"的伪协议解析器开始,之后根据像 TCP/IP 这样的协议层依次推进解析, 直到表示协议数据的"Data"解析器,然后解析过程又回退,最后又回到 Frame 解析器,基本上就是一个解嵌套字节过程。下图演示了一个以太网典型报文的解析过程.
要与 Wireshark 主框架交互, 解析器插件必须要做三件事:
● 注册(register). 声明要处理的协议名, 要处理的协议字段等
● 交接(handoff). 声明与其他解析器如何交接
● 解析(dissect). 对协议数据的解析
注册和交接发生在 Wireshark 启动阶段,当某一插件存在异常wireshark都将崩溃无法打开,而解析发生在用户打开离线报文, 抓包, 或者点击报文列表(Packet List)中某一项等时候。
协议解析器的解析结果存放在协议树(Proto Tree)中,在Wireshark UI 正是通过一个树型控件来展示的:
五、解析器编译环境搭建
● 阅读 Wireshark 开发手册
https://www.wireshark.org/docs/wsdg_html_chunked/index.html
● 准备一份 Wireshark 代码, 官方仓库是 https://gitlab.com/wireshark/wireshark/-/tree/master
● 在你所需的系统上成功编译 WIreshark 原始代码,至少一次。
● 了解 Wireshark 编码规范, 协议解析器的基本原理, 解析器插件的实现方法. 这三个文档分别位于 Wireshark 源码的 doc/README.developer, doc/README.dissector 和 doc/README.plugins. doc 目录下的其他 README 文件也对你的开发很有帮助。这些文件都很长, 如果急于开发功能, 可以简要阅读,直接使用example。
● Wireshark 使用 EditorConfig 来规范代码格式, 如果用 VSCode 可以安装 EditorConfig for VS Code插件来让自己的代码符合规范。
必要的安装环境:
- Micosoft Visual Studio 2019/2022
- QT6或QT5.12版本以上
- Cmake
- python3
- winflexbison
六、软件编译过程
把从github上下载的Wireshark 4.2.3 源码放在文件夹D:\wiresharkdev\wireshark-4.2.3
, 新建一个空文件夹在 D:\wiresharkdev\wireshark-build
目录中存放CMAKE编译内容, 并把编译过程中下载的依赖项放在新建文件夹D:\wiresharkdev\wireshark-win64-libs-4.2
目录
为了便于设置环境变量, 在编译路径文件夹建立一个批处理文件 setenv.bat, 内容如下
若安装的是QT5,在执行CMAKE编译过程需要进行说明。具体在下面补充。
1.当前环境切换到环境设置脚本路径,设置环境变量
2.执行cmake生成解决方案,结果在编译路径。
若使用QT5,则需执行下面这句禁掉QT6。
cmake -G "Visual Studio 16 2019" -A x64 -DUSE_qt6=OFF ..\wireshark
3.执行cmake 构建生成exe及插件dll
4.插件dll结果路径
以上步骤完成后,已经准备好wireshark插件开发的前期准备工作,那么开始充满创造性的自定义插件开发吧。