vlambda博客
学习文章列表

抓包+逆向app分析protobuf

万事俱备,只欠东风。

前面的实验环境已经搭好了。下面来抓包分析下,看看protobuf协议在抓包软件上长什么样子。

首先明确我们的目标。我们的最终目标是还原proto文件,有了这个文件,我们就能对数据做序列化和反序列化,最终用python请求和解析数据。

1.抓包分析

拿到一款app(前面的demo),首先抓包

如果协议头是application/x-protobuf,那么charles可以大致解析出来响应的文本。可以看到甚至连序号以及类型。注意这个前面的1,2,3不是charles自动标的序号,而是proto文件里面message中定义的字段编号。为了验证,我换了编号,请求响应如下:
抓包+逆向app分析protobuf
如果传输内容不多,比较简单的话,基本上我们根据抓包结果就可以编写proto配置文件了。编写proto文件的时候注意,字段编号和类型一定得对上,不然就会出现问题。
但是现在大多数app,一般用了protobuf协议,基本上都是配合gzip压缩或者结合一些加密算法一起使用,提高效率和增加安全性。由于是直接传输的二进制流,charles并不能正确解析协议。

比如这样:
抓包+逆向app分析protobuf
这时候就需要根据url或者其它一些可以利用的信息去分析app。
根据url搜,由于demo比较简单,一下就能找到封装请求的地方。抓包+逆向app分析protobuf找到 ProtobufHandle.Request声明的地方.

这样就找到了它的编号。然后结合上下文分析它的类型等等。可能有嵌套关系。  

有些app封装的比较好,不需要怎么分析,直接照着它的写也能还原出proto文件。

比如携程app:  

这里它用的protocbuf2的版本,最后照着它的样子写出.proto文件即可。里面的变量名不需要与app中的一致(建议一致,方便校验)。但编号一定要对上。
还原了.proto文件之后,之后的操作就是用protoc转换,然后按照它的格式字段发包就行了(参考之前的文章: flask实现python后台,最后写了python客户端怎么发包)。 

还有种方式,就是如果你分析app知道它是protobuf传输且使用了什么加密方式。可以利用中间人攻击的方式,解密数据并显示在charles上也可以。就算没有字段说明,spider们根据页面数据展示,也能大概猜出这些编号对应什么意思。(或许这是没有必要的,毕竟你连别人的加密都分析出来了。)

github上还有相关分析protobuf协议的工具

  1. https://github.com/marin-m/pbtk