wireshark内置支持protobuf吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wireshark内置支持protobuf吗相关的知识,希望对你有一定的参考价值。

搞网络开发的时候,涉及到很多私有协议。方便是方便,不过抓包分析问题就麻烦了,wireshark是不可能会为我们自己的网络协议开发分析工具的,唯有自己开发协议分析插件。在私有协议方面,google protobuf是一个类似与IDL的语言,用于定义消息接口,并且支持很多语言,原生支持C++、Java和Python,而且还有很多第三方的支持,基本上支持C、C#、object-c,AS3,php等.目前protobuf的解析并不是wireshark内置支持的,不排除以后的版本会支持。当前网络上有一个工程可以支持protobuf的解析(protobuf-wireshark),但是该插件原生支持的只有Linux版本,而且还只支持UDP解析。经本人改造,已经可以支持windows,并且同时支持TCP和UDP解析。TCP时,需要在protobuf之上加上一个4字节的数据长度,用于支持后续的protobuf消息的大小。

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
消息长度 protobuf二进制消息内容
消息长度的值只包含protobuf消息的大小,不包含自己4个字节的长度。例如protobuf长度为12字节时, 消息长度里面的值,应该是 00 00 00 0c,总的数据长度为16个字节.(如果无法解析数据长度,调换一下网络字节序)
另外对protobuf消息的定义也有一定的限制,必须有一个顶层的消息,例如Message1 和Message2如果是并列的消息,需要有一个Message来包含Message1和Message2.
【配置】
protobuf的配置文件放在C:\Program Files\Wireshark\protobuf目录下面,C:\Program Files\Wireshark\为wireshark在电脑上的安装目录。protobuf文件夹默认是没有的,自己创建。
把附件 *.proto;*.conf放在protobuf目录下面,把dll放在plugins\1.8.6目录下面。
参考技术A

Wireshark 2.6.0开始内置支持Protobuf和gRPC,从3.2.0版本开始,加入支持配置*.proto文件。具体可参考:

3.2.0 Release Note

搜索*.proto文件路径的配置说明

基于UDP端口解析Protobuf的配置说明

*.proto文件里如果定义了rpc接口,则会自动解析gRPC消息。

参考技术B 搞网络开发的时候,涉及到很多私有协议。方便是方便,不过抓包分析问题就麻烦了,wireshark是不可能会为我们自己的网络协议开发分析工具的,唯有自己开发协议分析插件。在私有协议方面,google protobuf是一个类似与IDL的语言,用于定义消息接口,并且支持很多语言,原生支持C++、Java和Python,而且还有很多第三方的支持,基本上支持C、C#、object-c,AS3,PHP等.目前protobuf的解析并不是wireshark内置支持的,不排除以后的版本会支持。当前网络上有一个工程可以支持protobuf的解析(protobuf-wireshark),但是该插件原生支持的只有Linux版本,而且还只支持UDP解析。经本人改造,已经可以支持windows,并且同时支持TCP和UDP解析。TCP时,需要在protobuf之上加上一个4字节的数据长度,用于支持后续的protobuf消息的大小。

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
消息长度 protobuf二进制消息内容
消息长度的值只包含protobuf消息的大小,不包含自己4个字节的长度。例如protobuf长度为12字节时, 消息长度里面的值,应该是 00 00 00 0c,总的数据长度为16个字节.(如果无法解析数据长度,调换一下网络字节序)
另外对protobuf消息的定义也有一定的限制,必须有一个顶层的消息,例如Message1 和Message2如果是并列的消息,需要有一个Message来包含Message1和Message2.
【配置】
protobuf的配置文件放在C:\Program Files\Wireshark\protobuf目录下面,C:\Program Files\Wireshark\为wireshark在电脑上的安装目录。protobuf文件夹默认是没有的,自己创建。
把附件 *.proto;*.conf放在protobuf目录下面,把dll放在plugins\1.8.6目录下面。
参考技术C 只要你装了WINPCAP 就可以自己编程抓包,或使用wireshark抓包了。但是无线网卡好像无法通过winpcap抓包,具体如何实现无线网卡抓包,还没有研究过。6930p自带网卡绝对可以抓包,我开发网络抓包程序就是通过笔记本实现的,网卡也是我的三星笔记本自带的。本回答被提问者采纳

谷歌出品:Protobuf 你知道吗?

前言:近期一直在学习微服务方面的内容,Python 玩的少了,后期文章中将加入一些应用广泛的中间件介绍,一切从 0 开始介绍,0 基础也可以看得懂,上手实操。

01| 简介

Protobuf(Protocol Buffers),是 Google 开发的一种跨语言、跨平台的可扩展机制,用于序列化结构化数据。

与 XML 和 JSON 格式相比,protobuf 更小、更快、更便捷。protobuf 目前支持 C++、Java、Python、Objective-C,如果使用 proto3,还支持 C#、Ruby、Go、PHP、JavaScript 等语言。

优点:

  • 性能好

  • 跨语言

缺点:

  • 二进制格式可读性差:为了提高性能,protobuf 采用了二进制格式进行编码,这直接导致了可读性差。

  • 缺乏自描述:XML 是自描述的,而 protobuf 不是,不配合定义的结构体是看不出来什么作用的。

02| 安装

2.1 Windows 下安装

下载 protoc-3.9.1-win64.zip,这个是编译后的压缩包,相当于绿色版,解压后,将其下的 bin 目录添加到环境变量就可以了,省去了安装的麻烦。

谷歌出品:Protobuf 你知道吗?

然后打开命令提示符,输入命令:

protoc --version

成功显示版本号,则表示安装成功。如下图:

谷歌出品:Protobuf 你知道吗?

03| 简单使用

3.1 编译

使用 protobuf 首先需要定义 .proto 文件,先来看一个简单的例子。

定义 Person.proto 文件,内容如下:

syntax = "proto3";
package Test;

message Person {
  string Name = 1;
  int32 Age = 2;
  bool Marriage = 3;
}
  • syntax = "proto3"; 指定正在使用 proto3 语法,否则 protobuf 将默认使用的是 proto2。

  • package Test; 指定命名空间(C# 中)。

  • message 是关键字,定义结构化数据。

  • 等号后面的数字是字段唯一编号(注意不是字段的值),用于二进制格式消息中标识字段。

protoc 是 protobuf 自带的编译器,可以将 .proto 文件编译成 java、python、go、C# 等多种语言的代码,直接引用。

编译命令:

protoc -I=E:GLTest2017 --python_out=E:GLTest2017 Person.proto

编译命令说明:

  • -I 表示源文件(.proto 文件)所在文件夹路径。

  • --python_out 表示目标语言为 python,且指定生成的 .py 文件存放目录。相应的,C# 为 csharp_out,

  • Person.proto 为源文件文件名,如果有多个,空格隔开。

3.2 Python 示例

安装 protobuf(pip 安装即可)。

调用编译命令编译 Person.proto,编译后生成文件:Person_pb2.py,添加至项目中,序列化和反序列化示例如下:

import Person_pb2

person = Person_pb2.Person()
person.Name = '张三'
person.Age = 20
person.Marriage = True

# 序列化
b = person.SerializeToString()
print(b)

# 反序列化
p = Person_pb2.Person()
p.ParseFromString(b)
print(f'Name: {p.Name}; Age: {p.Age}; Marriage: {p.Marriage}')

输出:

b'
x06xe5xbcxa0xe4xb8x89x10x14x18x01'
Name: 张三; Age: 20; Marriage: True

注意,不能这样写,这是错误的:

p = Person_pb2.Person().ParseFromString(b)

3.3 C# 示例

C# 下的 Protobuf 有 3 个版本:

  • Google.ProtoBuf:Google官方版本,https://github.com/google/protobuf/tree/master/csharp

  • protobuf-net:.net 社区版本,由 .net 社区爱好者开发,https://github.com/mgravell/protobuf-net

  • Google.ProtocolBuffers:据说是由谷歌的 .net 员工在官方版本还未出来的时候开发的,https://github.com/jskeet/protobuf-csharp-port

这里我们介绍谷歌官方版本。

在 VS 中,通过 NuGet 安装 'google.protobuf' 包。示例代码如下:

using Google.Protobuf;
using System;
using Test;

namespace Protobuf
{
    class Program
    {
        static void Main(string[] args)
        
{
            Person person = new Person();
            person.Name = "张三";
            person.Age = 20;
            person.Marriage = true;

            // 序列化
            byte[] buffer = person.ToByteArray();

            foreach (byte b in buffer)
            {
                Console.Write(b.ToString("X2") + " ");
            }
            Console.WriteLine();

            // 反序列化
            Person p = Person.Parser.ParseFrom(buffer);

            Console.WriteLine(string.Format("Name: {0}, Age: {1}, Marriage: {2}", p.Name, p.Age, p.Marriage));

            Console.Read();
        }
    }
}

输出:

0A 06 E5 BC A0 E4 B8 89 10 14 18 01
Name: 张三, Age: 20, Marriage: True

比较一下 Python 的输出,好像不一样,Python 中第一个字节是 ,而这里是 0A。 在 ASCII 中的值就是 0A。所以两种语言的序列化结果是一样的。


你点的每个在看,我都认真当成了喜欢

以上是关于wireshark内置支持protobuf吗的主要内容,如果未能解决你的问题,请参考以下文章

谷歌出品:Protobuf 你知道吗?

gRPC 一定要使用 Protobuf 吗?

Protobuf从入门到“顺手”

Protobuf从入门到“顺手”

Protobuf从入门到“顺手”

怎样用wireshark得到cookie?