Charles解析protobuf之初探

2020/04/29 15:26
阅读数 4.7K
前言

在程序开发以及网络通信传输过程中最常见的数据格式就是JSON、XML,或者是一种压缩效率更高的数据格式——Google的ProtoBuf。ProtoBuf在传输过程中是以二进制的格式传输的,测试抓包的时候如果需要查看请求或返回消息中携带的参数信息就需要对它进行解析。小编之前在Windows环境下使用公司童鞋开发的Fiddler插件可以完成解析工作,但小编在家办公使用的抓包工具是Mac上的Charles。对于不熟悉Charles的小编而言,如何借助Charles来解析并展示ProtoBuf中的内容就尤为重要。本文就介绍一下小编尝试的几种在Mac环境中将ProtoBuf数据流转换为可以直观观察的数据格式的方法。。

1
ProtoBuf简介

Protocol buffers是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。

Protocol Buffers是一种灵活,高效,自动化机制的结构数据序列化方法-可类比XML,但是比XML更小(3~10倍)、更快(20~100倍)、更为简单。

你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。

2
Charles简介

Charles其实是一款代理服务器,通过成为电脑或者浏览器的代理,然后截取请求和请求结果达到分析抓包的目的。该软件是用Java写的,能够在Windows、Mac、Linux上使用,安装Charles的时候要先装好Java环境。Charles的具体安装方法就不在此详细展开了,但是Charles应该算是Mac上最好用的抓包工具了。下面详细介绍下使用Charles查看PB文件的方法。

3
方法一:Charles的Rewrite功能

通过阅读Charles关于ProtoBuf的官方文档可以得出当Content-Type的类型为application/x-protobuf时,通过Charles查看内容可以使用两个新的HTTP正文内容查看器,Protobuf文本查看器和Protobuf结构化查看器。但是小编在测试过程中发现我们的请求的Content-type并不是application/x-protobuf的,而是text/plain; charset=utf-8的,所以考虑使用Charles的Rewrite功能将Content-type修改替换一下。

正常看到的请求如下图所示:

打开Tools->Rewrite界面配置,新增配置如下:

其中规则的详细配置是:

配置完成之后再去请求就可以看到Content-Type如下图所示。

此时就可以在Contents中看到对应的ProtoBuf以及ProtoBuf Text内容了。

        需要注意的是使用这种方式查看到的都是ProtoBuf里的value内容,没有对应的key,所以可读性较差,下面介绍可读性更强的第二种方式。

4
方法二:Charles解析PB功能

一、生成ProtoBuf的.desc解析文件

protoc工具安装:如果想解析一个ProtoBuf数据流,就必须要有对应的.proto文件,Charles需要一个.proto文件转换的.desc文件才能完成后续的解析工作。首先需要在Mac上安装protoc工具:brew install protobuf。

执行protoc --version能够展示以下内容就代表protoc工具安装成功了。

单个proto文件生成.desc文件将proto_test.proto文件放到固定路径/xx/下,然后执行命令:protoc -I=/xx/ --descriptor_set_out=/xx/proto_test.desc /xx/proto_test.proto就可以在对应路径下生成proto_test.desc文件了。

多个proto文件生成.desc文件:多个proto文件对应生成一个desc文件命令:protoc -I=/x/xx/ --descriptor_set_out=/x/xx/test.desc /x/xx/a.proto /x/xx/b.proto。


二、解析ProtoBuf格式

PB文件未解析时的Request和Response内容如下,可以看到基本全是乱码,可读性极差,通过添加之前生成的.desc文件并配置解析规则就完成PB文件的解析工作,步骤如下:

View Request/Response As:在对应的请求上右键选择View Request(Response) As->Protocol Buffers。

添加.desc文件:进入Charles提供的解析ProtoBuf的配置界面后,可通过点击Open Descriptot Registry将自己的ProtoBuf描述性文件(.desc文件)注册进去。

Descriptor Registry有两个默认支持的desc描述文件,我们可通过点击add添加自己需要的desc文件。

配置message type添加成功后,可以在Message type中搜索需要解析的消息体对应的ProtoBuf Message,并配置对应的payload encoding。

   设置成功后,可以通过ProtoBuf以及ProtoBuf Text两种方式查看PB数据,其中ProtoBuf Text可以看到二进制的消息体已经转换为可以直观查看的类似JSON的数据体了,到此为止简单的PB数据解析工作就告一段落了。


5
Charles的相关配置

Viewer Mappings功能View Request/Response As功能只能设置单一请求的request body或者response body的proto解析,但如果是批量请求的解析需要进行大量的重复性工作,比较繁琐,具有较差的便利性,此时可通过Viewer Mappings功能解决该问题。

Protobuf Settings功能desc文件的添加不仅可以通过Viewer Mappings功能和View Request/Response As功能,还可以通过菜单栏上的Protobuf Settings功能进行设置。

好啦,上述内容就是小编关于Charles查看PB数据格式请求的初探索,谢谢各位童鞋的阅读~

◆  ◆  ◆  ◆  ◆ 

本期编辑 / sufflower


本文分享自微信公众号 - 搜狗测试(SogouQA)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部