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

2024-03-29 07:20

本文主要是介绍Wireshark自定义协议解析器插件C语言开发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 概要
    • Wireshark 软件整体架构
    • 基本概念
    • 解析器实现逻辑
    • 解析器编译环境搭建
    • 软件编译过程

概要

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。

cmake -G "Visual Studio 16 2019" -A x64 -DUSE_qt6=OFF ..\wireshark

在这里插入图片描述

3.执行cmake 构建生成exe及插件dll
在这里插入图片描述
4.插件dll结果路径
在这里插入图片描述

这篇关于Wireshark自定义协议解析器插件C语言开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/857964

相关文章

C语言程序设计(一)

1、指令、程序、软件 2、计算机语言:机器语言、汇编语言、高级语言 高级语言的发展:非结构化语言(FORTRAN)、结构化语言(C语言)、面向对象的语言(C++、面向对象) 3、源程序、二进制程序、可执行文件 4、C语言的发展和特点 5、C语言注释 6、课后题

序列化协议:Protobuf入门

[零] 序列化与Protobuf 实际传输中,我们会面临各种问题,例如: 要传输的数据量很大,但其实有效的数据却不多 例如,传输下面这样一个数组: // 传递一个长整型数组long long arr[5] = {1, 2, 3, 4, 1000000000000} 要传输的的数据类型非常复杂,难以传递: // 传递一个结构体struct Bar {int integer;std::strin

利用PHP开发的微信公共平台游戏

一直想利用微信公告平台提供的接口开发一个文字类型游戏,但是苦于没有什么点子,知道看到redraiment在OSChina上托管的微信游戏--开窗,让我觉得我也可以完成此类文字游戏的开发.redraiment利用的是Emacs Lisp脚本语言完成的,可惜我对这个脚本完全没有了解,而且我的微信接口环境是基于PHP的,所以就没办法参考他的源码了,好在游戏模式十分简单,不必利用redrainment提

跟我一起做微信开发(一)——开通微信公共号(开发模式)

做微信开发,首先得有个微信公共号! 公共号注册地址:https://mp.weixin.qq.com/cgi-bin/readtemplate?t=register/step1_tmpl&lang=zh_CN 册完了就可以去mp.weixin.qq.com登录了,之后就是创建公共号的一些具体步骤,公共号创建完了之后会有大概一个礼拜左右的审核期(一般都是就2,3天就可以审核完

开发经验总结

一、validation的使用 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency> 采用注解校验 实体类的字段采用相关注解修饰,如@NotNull,@Null  @NotBlankp

如何禁用WordPress的自动更新(包括主题、插件和核心文件)

这几天发现我的一个网站突然打不开了,提示“此站点遇到了致命错误”,如图: 这个网站一直都是正常运行的,最近也没有过什么更新,按理说不应该会出现问题,我担心可能是主机方面做了什么调整导致,所以联系了Hostease的客服进行确认,他们检查过后告诉我有一款插件存在错误,可能是是由于我的主机使用的PHP版本过低导致,我按技术给我的步骤把主机的PHP版本调整到8.1之后,网站果然恢复了。 让我

天问ASRPRO语音模块开发

文章目录 一、开发环境1、外观尺寸2、天问Block软件安装3、编译烧写 二、代码开发 一、开发环境 1、外观尺寸 2、天问Block软件安装 下载地址 把天问Block加入win10白名单(需要知道天问Block的安装目录路径):

Android如何使用XML自定义属性

1、定义 在res/values文件下定义一个attrs.xml文件,代码如下: 2、使用 在布局中使用, 示例代码如下: 3、获取 最终来到这里:

C语言趣味代码(四)

这一篇主要编写几个打字练习的小程序,然后通过这些小程序的实现来回顾复习我们之前学过的知识,然后通过这写打字练习的小程序来提升我们的打字技术和编程技术。 1. 打字练习 1.1 基本打字练习 1.1.1 基本实现 首先我们来制作一个用于计算并显示输入一个字符串所需时间的打字练习软件(在这里我们会用到上一篇博客中的“getputch.h”库): #include<stdio.h>#incl

CMUS狮身人面像(四)-构建语言模型

构建语言模型 语言模型是配置的重要组成部分,它告诉解码器可以识别哪些单词序列。 模型有多种类型:关键词列表、语法和统计语言模型以及语音语言模型。它们具有不同的功能和性能特性。您可以根据需要选择任何解码模式,甚至可以在运行时在模式之间切换。有关更多详细信息,请参阅Pocketsphinx 教程。 关键词列表 Pocketsphinx 支持关键字发现模式,您可以在其中指定要查找的关键字列表。这