Charles解析protobuf之初探

前言

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

1 ProtoBuf简介

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

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

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

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修改替换一下。

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

img

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

img

其中规则的详细配置是:

img

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

img

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

img

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

4 方法二:Charles解析PB功能

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

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

img

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

img

单个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文件的解析工作,步骤如下:

img

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

img

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

img

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

img

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

img

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

5 Charles的相关配置

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

img

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

img

雷电模拟器无法抓包

配置好各种配置后,发现雷电模拟器无法获取数据包

1
adb shell settings put global http_proxy 192.168.1.100:8888

设置全局代理即可