golang拥有wireshark数据包解析能力
golang拥有wireshark数据包解析能力
- 1. 功能和实现
wireshark拥有世界上最全面的协议解析能力并且还在不断更新中,通过调研,没有办法找到与wireshark同水平的解析工具。
为了使得golang语言可以拥有wireshark一样强大的协议解析能力,库 gowireshark通过golang --wrap–> c --wrap–> wireshark dll的形式做到了这点。
1. 功能和实现
简单来看下这个库的功能,并分析它的实现:
-
可以读取离线pcap文件或者抓取指定网卡数据包并解析
其中c封装的接口在include/目录的
lib.h、offline.h、online.h中,print_xxx开头的接口调用的是原生的wireshark接口proto_tree_print打印协议树,print_hex_data打印十六进制;
get_proto_tree_json接口封装的get_proto_tree_json函数明显是改变自原生wireshark接口write_json_proto_tree(print.c文件中),原本write_json_proto_tree生成和输出json结果使用的是jdump对象,修改后使用cJson替代。 -
支持像wireshark一样解析各种协议,并输出为json格式,字段也能翻译成wireshark一样的解释性文字:

json结果:
{"_index": "packets-2020-12-14","_type": "doc","_score": {},"offset": ["0000", "0010", "0020", "0030", "0040", "0050", "0060"],"hex": ["00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 02", "00 58 00 01 40 00 40 84 3c 1d 7f 00 00 01 7f 00", "00 01 98 3a 96 48 a6 25 c3 63 00 00 00 00 00 03", "00 38 e3 0b 04 a7 00 00 00 00 00 00 00 3e 40 01", "00 0e 00 00 02 00 4e 00 02 00 14 00 00 00 01 00", "00 00 00 00 00 00 00 00 00 00 00 00 00 00 d0 55", "79 4b 65 55 00 00 "],"ascii": ["..............E.", ".X..@.@.<.......", "...:.H.%.c......", ".8...........>@.", "......N.........", "...............U", "yKeU.."],"_source": {"layers": {"frame": {"frame.section_number": "1","frame.interface_id": "0","frame.encap_type": "Ethernet (1)","frame.time": "Dec 14, 2020 16:01:11.974420814 UTC","frame.offset_shift": "0.000000000 seconds","frame.time_epoch": "1607961671.974420814 seconds","frame.time_delta": "0.000021538 seconds","frame.time_delta_displayed": "0.000021538 seconds","frame.time_relative": "0.000000000 seconds","frame.number": "5","frame.len": "102","frame.cap_len": "102","frame.marked": "False","frame.ignored": "False","frame.protocols": "eth:ethertype:ip:sctp:f1ap"},"eth": {"eth.dst": "00:00:00:00:00:00 (00:00:00:00:00:00)","eth.dst_tree": {"eth.dst_resolved": "00:00:00:00:00:00","eth.dst.oui": "00:00:00","eth.addr": "00:00:00:00:00:00 (00:00:00:00:00:00)","eth.addr_resolved": "00:00:00:00:00:00","eth.addr.oui": "00:00:00","eth.dst.lg": "Globally unique address (factory default)","eth.lg": "Globally unique address (factory default)","eth.dst.ig": "Individual address (unicast)","eth.ig": "Individual address (unicast)"},"eth.src": "00:00:00:00:00:00 (00:00:00:00:00:00)","eth.src_tree": {"eth.src_resolved": "00:00:00:00:00:00","eth.src.oui": "00:00:00","eth.addr": "00:00:00:00:00:00 (00:00:00:00:00:00)","eth.addr_resolved": "00:00:00:00:00:00","eth.addr.oui": "00:00:00","eth.src.lg": "Globally unique address (factory default)","eth.lg": "Globally unique address (factory default)","eth.src.ig": "Individual address (unicast)","eth.ig": "Individual address (unicast)"},"eth.type": "IPv4 (0x0800)"},"ip": {"ip.version": "4","ip.hdr_len": "20","ip.dsfield": "0x02","ip.dsfield_tree": {"ip.dsfield.dscp": "Default (0)","ip.dsfield.ecn": "ECN-Capable Transport codepoint '10' (2)"},"ip.len": "88","ip.id": "0x0001 (1)","ip.flags": "0x02","ip.flags_tree": {"ip.flags.rb": "Not set","ip.flags.df": "Set","ip.flags.mf": "Not set"},"ip.frag_offset": "0","ip.ttl": "64","ip.proto": "SCTP (132)","ip.checksum": "0x3c1d","ip.checksum.status": "Unverified","ip.src": "127.0.0.1","ip.addr": "127.0.0.1","ip.src_host": "127.0.0.1","ip.host": "127.0.0.1","ip.dst": "127.0.0.1","ip.dst_host": "127.0.0.1"},"sctp": {"sctp.srcport": "38970","sctp.dstport": "38472","sctp.verification_tag": "0xa625c363","sctp.assoc_index": "65535","sctp.port": "38970","sctp.checksum": "0x00000000","sctp.checksum.status": "Unverified","DATA chunk (ordered, complete segment, TSN: 0, SID: 0, SSN: 0, PPID: 62, payload length: 40 bytes)": {"sctp.chunk_type": "DATA (0)","sctp.chunk_type_tree": {"sctp.chunk_bit_1": "Stop processing of the packet","sctp.chunk_bit_2": "Do not report"},"sctp.chunk_flags": "0x03","sctp.chunk_flags_tree": {"sctp.data_i_bit": "Possibly delay SACK","sctp.data_u_bit": "Ordered delivery","sctp.data_b_bit": "First segment","sctp.data_e_bit": "Last segment"},"sctp.chunk_length": "56","sctp.data_tsn": "0","sctp.data_tsn_raw": "3809150119","sctp.data_sid": "0x0000","sctp.data_ssn": "0","sctp.data_payload_proto_id": "F1 AP (62)"}},"f1ap": {"per.choice_index": "1","f1ap.F1AP_PDU": "successfulOutcome (1)","f1ap.F1AP_PDU_tree": {"f1ap.successfulOutcome_element": {"f1ap.procedureCode": "id-F1Setup (1)","per.enum_index": "0","f1ap.criticality": "reject (0)","per.open_type_length": "14","f1ap.value_element": {"f1ap.F1SetupResponse_element": {"per.extension_bit": "0","per.sequence_of_length": "2","f1ap.protocolIEs": "2","f1ap.protocolIEs_tree": {"Item 0: id-TransactionID": {"f1ap.ProtocolIE_Field_element": {"f1ap.id": "id-TransactionID (78)","per.enum_index": "0","f1ap.criticality": "reject (0)","per.open_type_length": "2","f1ap.value_element": {"per.extension_present_bit": "0","f1ap.TransactionID": "20"}}},"Item 1: id-Cause": {"f1ap.ProtocolIE_Field_element": {"f1ap.id": "id-Cause (0)","per.enum_index": "0","f1ap.criticality": "reject (0)","per.open_type_length": "1","f1ap.value_element": {"per.choice_index": "0","f1ap.Cause": "radioNetwork (0)","f1ap.Cause_tree": {"per.extension_present_bit": "0","per.enum_index": "0","f1ap.radioNetwork": "unspecified (0)"}}}}}}}}}}}}
}
- 目前好像还有内存泄露问题和支持多设备实时读取解析功能,wireshark应该无法在线程或协程层面实现并发读取解析,如果使用这个库,也许可以通过docker启动多个微服务来做到。
相关文章:
golang拥有wireshark数据包解析能力
golang拥有wireshark数据包解析能力 1. 功能和实现 wireshark拥有世界上最全面的协议解析能力并且还在不断更新中,通过调研,没有办法找到与wireshark同水平的解析工具。 为了使得golang语言可以拥有wireshark一样强大的协议解析能力,库 gowir…...
Redis_分片集群
10. 分片集群 10.1简介 业务场景,需要存储50G的数据。对于内存和硬盘配置不足,选用两种方式 一种:纵向扩展:加内存,加硬盘,提高CPU。简单、直接。RDB存储效率要考虑。成本要考虑。二种:横向扩…...
测试提升方向:你选测试开发?还是性能测试?
如果想要在测试领域好好发展,提升自己的测试技术是必不可少的,但是,选对方向更为重要,功能测试、自动化测试、测试开发、性能测试、安全测试、测试管理,每个测试方向都不简单,但是,大环境就是&a…...
无涯教程-Perl - print函数
描述 此函数将LIST中的表达式的值打印到当前的默认输出文件句柄或FILEHANDLE指定的句柄中。 如果设置,则$\变量将添加到LIST的末尾。 如果LIST为空,则打印$_中的值。 print接受一个值列表,列表中的每个元素都将被解释为一个表达式。 语法 以下是此函数的简单语法- print…...
python搜索文件夹内类似的文件名
# codingutf8 __author__ Administrator import os """ #编写函数,计算字符串匹配的准确率 def Rate(origin,userInput): if not (isinstance(origin,str) and isinstance(userInput,str)): print(The two parameters must be strings…...
[保研/考研机试] KY3 约数的个数 清华大学复试上机题 C++实现
题目链接: KY3 约数的个数 https://www.nowcoder.com/share/jump/437195121691716950188 描述 输入n个整数,依次输出每个数的约数的个数 输入描述: 输入的第一行为N,即数组的个数(N<1000) 接下来的1行包括N个整数,其中每个…...
cmake扩展(2)——windows下动态设置输出文件(dll/exe)版本
准备 windows下设置文件的版本需要通过VERSIONINFO接口,详情参考VERSIONINFO resource。这里我们根据模板做了一定的修改。 1 VERSIONINFOFILEVERSION ${GIT_VERSION} //文件版本号,必填。以,分隔,输出以.分隔。这里是取CMakeLists里的GIT_…...
Python-OpenCV中的图像处理-颜色空间转换
Python-OpenCV中的图像处理-颜色空间转换 颜色空间转换获取HSV的值 颜色空间转换 在 OpenCV 中有超过 150 中进行颜色空间转换的方法。但是你以后就会 发现我们经常用到的也就两种: BGR G r a y 和 B G R Gray 和 BGR Gray和BGRHSV。 注意:在 OpenCV 的…...
yolov5目标检测多线程Qt界面
上一篇文章:yolov5目标检测多线程C部署 V1 基本功能实现 mainwindow.h #pragma once#include <iostream>#include <QMainWindow> #include <QFileDialog> #include <QThread>#include <opencv2/opencv.hpp>#include "yolov5.…...
[ubuntu]创建root权限的用户 该用户登录后自动切换为root用户
一、创建新用户 1、创建新用户 sudo useradd -r -m -s /bin/bash 用户名 # -r:建立系统账号 -m:自动建立用户的登入目录 -s:指定用户登入后所使用的shell2、手动为用户设置密码 passwd 用户名 二、为用户增加root权限 1、添加写权限 ch…...
大连交通大学813软件工程考研习题
1.什么是软件生存周期模型?有哪些主要模型? 生存周期模型:描述软件开发过程中各种活动如何执行的模型。对软件开发提供强有力的支持,为开发过程中的活动提供统一的政策保证,为参与开发的人员提供帮助和指导,是软件生存周期模型…...
分布式协议与算法——Paxos算法
目录 Paxos算法Basic Paxos算法三种角色如何达成共识(协商过程)小结: Multi-Paxos算法关于 Multi-Paxos 的思考领导者优化Basic PaxosChubby 的 Multi-Paxos 实现小结 参考 Paxos算法 Paxos论文 Paxos Made Simple 、author:Lesli…...
Spring中的Websocket身份验证和授权
目录 一、需要了解的事项二、依赖三、WebSocket 配置3.1 、简单的消息代理3.2 、Spring安全配置 一、需要了解的事项 http和WebSocket的安全链和安全配置是完全独立的。SpringAuthenticationProvider根本不参与 Websocket 身份验证。将要给出的示例中,身份验证不会…...
【果树农药喷洒机器人】Part7:静态PWM变量喷药实验
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...
C++ 网络编程项目fastDFS分布是文件系统(一)
目录 1.项目架构图 1. 项目架构图 1.1 一些概念 1.2 项目架构图 2. 分布式文件系统 2.1 传统文件系统 2.2 分布式文件系统 3. FastDFS 3.1 fastDFS介绍 3.2 fastDFS安装 3.3 fastDFS配置文件 3.4 fastDFS的启动 4. fastDFS状态检测 4.1 对file_id的解释 4. 2上传…...
PoseiSwap 开启“Poseidon”池,治理体系或将全面开启
PoseiSwap 曾在前不久分别以 IDO、IEO 的方式推出了 POSE 通证,但 PoseiSwap DEX 中并未向除 Zepoch 节点外的角色开放 POSE 资产的交易。而在前不久,PoseiSwap 推出了全新的“Poseidon”池,该池将向所有用户开放,并允许用户自由的…...
【C/C++】重载运算符特性
重载运算符是 C 中的一个重要特性,它允许程序员自定义类类型的运算符行为。重载运算符的使用场景包括: 使类类型的对象能够像内置类型一样进行运算:例如,可以重载加号运算符,使两个对象相加时能够像两个整数相加一样。…...
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
公文一键排版系统基本完成,准备继续完善SysInfo,增加用户帐户信息,其中涉及到Win32_Account结构,其C定义如下: [Dynamic, Provider("CIMWin32"), UUID("{8502C4CC-5FBB-11D2-AAC1-006008C78BC7}"…...
24届近3年南京信息工程大学自动化考研院校分析
今天给大家带来的是南京信息工程大学控制考研分析 满满干货~还不快快点赞收藏 一、南京信息工程大学 学校简介 南京信息工程大学位于南京江北新区,是一所以大气科学为特色的全国重点大学,由江苏省人民政府、中华人民共和国教育部、中国气…...
【LeetCode】1572.矩阵对角线元素的和
题目 给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1: 输入:mat [[1,2,3],[4,5,6],[7,8,9]] 输出:25 解释:对角线的和为&a…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...
