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结果路径

相关推荐
也无晴也无风雨1 小时前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
憨子周1 小时前
2M的带宽怎么怎么设置tcp滑动窗口以及连接池
java·网络·网络协议·tcp/ip
UestcXiye4 小时前
《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项
c++·计算机网络·ip·tcp
不爱学习的YY酱5 小时前
【计网不挂科】计算机网络第一章< 概述 >习题库(含答案)
java·数据库·计算机网络
ZachOn1y7 小时前
计算机网络:运输层 —— 运输层端口号
网络协议·tcp/ip·计算机网络·udp·tcp·端口号
QQ_7781329748 小时前
信息收集、漏洞扫描、漏洞利用、权限提升、数据泄露
网络·计算机网络
qq_254674418 小时前
在C2M(Customer-to-Manufacturer)柔性制造模式下,算法
网络协议
橘色的喵8 小时前
工业通信协议对比:OPC-UA、Modbus、MQTT、HTTP
mqtt·网络协议·http·modbus·opc-ua·工业协议
迷途小码农零零发9 小时前
http的发展史
网络·网络协议·http
cocapop9 小时前
IP地址 与 DNS
网络协议·tcp/ip·智能路由器