protobuf协议_Protobuf协议逆向和仿真&举个栗子

本文通过携程App举例,介绍了如何进行Google Protobuf协议的逆向分析和协议仿真。内容包括Protobuf协议头解析、数据解码、proto文件理解和序列化反序列化操作,以及socket网络编程和加密参数逆向。适合对网络通信协议和逆向工程感兴趣的读者。
摘要由CSDN通过智能技术生成
6809e3ba975a296044df61d2a07b45c4.png 本文为看雪论坛优秀文章 看雪论坛作者ID:帅逼李三郎 一、前言

产品有需求要全力满足,产品没有需求创造需求也要满足。

本次的主角是携程App。以它为例子介绍一下Protobuf协议逆向分析及协议仿真。

本文你将了解到Google Protobuf的逆向分析及协议还原等知识。

二、目标

机票价格接口。

三、逆向过程

按照正常的过程,我们逆向第一步应该是抓包。下面是我抓到的。

72b520fb586250eef32a6d5f6c9d6538.png

看到这里不要怀疑,我们抓包没有问题,那为什么会这样呢。

133d1033d0a20fc30ec5d60f0ac3996c.png

正常情况下,抓到的包应该是标准的HTTP协议格式,我们实现完成整个报文的仿真模拟,然后发包即可。但是现在,我们什么都看不到。

抓包我使用的工具是Packet Capture,它是基于本地VPN实现的抓包,可以支持TCP及以上层的消息捕获。

那么,我们现在就有理由怀疑,携程的网络通信,没有使用HTTP协议,而是自建协议完成的。

分析完毕,那么下一步我们怎么来找到收发包位置呢。

7a53c2726b523bdf378291afd2d30104.png

(此处省略几万字的定位过程)

经过长时间的寻找,后来灵机一动,如果是我来写接收数据的代码,很可能我要写个while True的循环,然后用已经建立连接的socket进行循环接收数据。以此为标识,我们找找看。

a07734890869124d97e025ae8a4e0965.png

紧接着,我们在最后一个结果中找到了想要的接收数据的标识。

cf56b5717e95b64f9d6a976972d44a24.png

当我们跟着这个invokeResponse一直下去,就能找到一个神奇的地方“ctrip.business.comm.ProcoltolHandle”,(在这里你能找到所有的序列化和反序列化过程)到这里,具体的逆向就不表了。相信看到这的同学继续找下去不是问题。

从这里我们可以知道,每一个包前面有14个字节的协议头,之后是gzip压缩的结果。再后面是4字节的包体的长度,然后是消息内容。

这样我们就可以写出来解码的代码。

76997761c194005af1948c12df4540e0.png

需要说明一下的是,data的来源即是我们抓包抓到的十六进制,copy出来就可以。

接下来着重说一下这个proto_decode。

c41dd24468b901db854a82ebc269556a.png

我们反序列化protobuf是利用google提供的工具protoc.exe,带参数执行可以解码成可读的形式。(感谢YungGong协助)

982f1d94d7c2057467b6be99a130ce80.png

这个其实就是相当于HTTP协议里的header了,可是我们现在还不知道字段名,记住这些数字。我们在代码里找找看。

8f0469c54c8c87fb96e8a5f0920a62ce.png

通过这个文件我们就知道了文件名和数字序号的关系,然后我们自己写代码,组建一样的message,就可以序列化成他一样的结构了。

0602800535343de0324472d18b80e0f7.png

这个就是proto文件了,我们再通过命令行,让工具帮我们把这个结构生成为序列化反序列化的类。

protoc.exe --proto_path=D:\code\ctrip\src\main\proto --java_out=D:\code\ctrip\src\main\java D:\code\ctrip\src\main\proto\ResponseHead.proto

然后我们直接调用生成类的接口即可实现参数设置及序列化成byte[]。接下来就要展现出我们正向编码的能力了。完成Header的生成和整个body的组装,通过socket发出即可。

这里还涉及到发送的代码和接收的代码编写,如果不会的话抄一抄Android里的代码。

对了,需要注意的是,这里有一些参数是防爬虫的参数,计算写在so里面,如果不会逆的话,可以参考之前的文章。

安卓逆向 | Java/Native方法强制调用实现方案(一)

这样我们就能嘿嘿嘿。

096d01e09d5ef41c676d060eb5a45570.png

43ddc84108621be9287d4d605f57b5c3.png

返回中,除了header就是json格式的body了。下面就是收到的航班信息和价格了。

f3a3338a67082e892bd89fcde836eaf2.png29af3a669ba837058b2c6f32f9c02948.png

到这里,整个任务就完成了。

四、总结

这个任务,我们需要学习和具备的知识有:

  • Proto数据反序列化和Proto文件生成
  • 收发包socket网络编程
  • 加密参数逆向和调用
  • 一大罐耐心

d647df9b3fa333af11165122cd468426.png

以上。欢迎阅读转发~

0953df9206eae468faa9c723b6f4a9ed.gif -End - 39a8a87aff0e1081a8326511c969e5c0.gif

看雪ID:帅逼李三郎

https://bbs.pediy.com/user-867442.htm 

*这里由看雪论坛 帅逼李三郎 原创,转载请注明来自看雪社区。

推荐文章++++

595308a7413dd829f094621d9236e812.png

*   glibc字符编码研究

*   TP-Link Archer路由器LAN RCE

*   深入理解静态变量

*   KERNEL PWN状态切换原理及KPTI绕过

*   暴力爆破靶场建设及爆破实验

好书推荐06587dbebaea61094acb5b34ea720ee5.png

﹀ ﹀ ﹀ a11d4763cfb0177d2d7c863d206c345f.png 公众号:ikanxue 官方微博:看雪安全 商务合作:wsc@kanxue.com 4f07b882ffbbbe9268138f16cad40847.gif 戳 “阅读 原文 ”  一起来充电吧!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值