Wireshark自定义协议解析器插件C语言开发

文章目录

概要

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

软件编译过程

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。

bash 复制代码
cmake -G "Visual Studio 16 2019" -A x64 -DUSE_qt6=OFF ..\wireshark

3.执行cmake 构建生成exe及插件dll

4.插件dll结果路径

相关推荐
qq_421833671 小时前
计算机网络——ftp
计算机网络
ZachOn1y2 小时前
计算机网络:物理层 —— 物理层下的传输媒体
计算机网络·传输媒体·知识点汇总
程序员-珍4 小时前
虚拟机ip突然看不了了
linux·网络·网络协议·tcp/ip·centos
魏大橙5 小时前
linux RCE本地/公网测试
网络·网络协议·udp
陈逸轩*^_^*5 小时前
Java 网络编程基础
java·网络·计算机网络
鄃鳕6 小时前
HTTP【网络】
网络·网络协议·http
CXDNW8 小时前
【网络篇】计算机网络——应用层详述(笔记)
服务器·笔记·计算机网络·http·web·cdn·dns
BeyondESH10 小时前
计算机网络—大端序和小端序
计算机网络
秋夫人10 小时前
http cache-control
网络·网络协议·http
limengshi13839214 小时前
通信工程学习:什么是RIP路由信息协议
网络·网络协议·学习·智能路由器·信息与通信