APP爬虫之-Protobuf协议逆向解析

这篇具有很好参考价值的文章主要介绍了APP爬虫之-Protobuf协议逆向解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在做APP抓取时,会发现有的APP Response回来的数据有“加密”。不知道返回的内容是什么。

如下:

APP爬虫之-Protobuf协议逆向解析,protobuf

如上,内容不是明文的,没办法解析数据。APP常见的对数据加密有三种情况:第一种是,用诸如AES这类加密算法对数据加密,然后在APP里用key进行解密,这类的数据解密的难度不是很大,弄清楚是用的什么加密算法就能反解。
第二种是,用“私有”协议把数据序列化,只有了解该协议的细节才有可能把数据反序列化出来。这个的难度较大,没有功底,头发撸白都不一定撸出来。游戏和大厂APP盛行搞一个自己的私有协议来交换数据。

第三种是,用第三方厂商的协议来数据序列化,自己搞不出来私有协议的就选用第三方厂商的。比如用 Google 的 Protobuf ,来做数据序列化,也就是数据“加密”。
今天聊的就是第三种,Protobuf 的数据反解析。
先来看一个 Protobuf ,做数据序列化的直观例子。比如一个 APP 的 Response 原先是以 json 格式返回的:

这样很容易被解析,用Protobuf把上面数据序列化再传输就变成类似这样:
这张图片只是样例
这样就没法直接解析数据,如果了解 Protobuf 协议的话就能加快反解速度。所以还得从头来聊 Protobuf 。


一、什么是 Protobuf ?
Protobuf 是 Google 开发的一套数据存储传输协议,跟 xml 和 json 一样的,都是用来储存和传输数据的。 因为 Protobuf 能够把数据压缩得很小,所以传输数据就比 xml 和 json 快几倍,Protobuf 解析数据的速度也比它两快,所以在数据网络传输上,用 Protobuf 而不用 json 就有点受欢迎了。
不过 Protobuf 储存、压缩、传输效率比 json 好,付出的代价就是用法麻烦,不像 json.loads() json.dumps() 一下就搞定了这么简单。Protobuf 有一套自己的语法。不了解 Protobuf 协议语法和用法的话也无法反解数据。
先了解下 Protobuf 序列化和反序列化的整个流程:
1.1.先定义一个 Protobuf 语法文件( .proto 文件)
该语法文件用来说明要传输哪些字段、字段的数据类型、数据间的嵌套关系这些。比如一个APP要返回的数据有电话号码,姓名,年龄这三个字段,你就需要把这三个字段定义在 .proto 文件里,并且指明他们的数据类型,比如姓名和电话是字符串, 年龄是整型。
1.2.使用 Protobuf 提供的工具编译该语法文件。用工具编译 .proto 文件的目的是,把 .proto 文件编译成代码,工具会根据该 .proto 文件自动生产代码。 这个代码就是用来做数据序列化和反序列化的。

1.3.服务端用第2步中的代码,把“明文”数据序列化,变成“密文”后,返回给APP。
1.4. APP 客户端用第2步中的代码,把“密文”数据反序列化,就“解密”成明文拉。


理论说多了很迷糊,再整个完整的直观例子:
二、Protobuf 正向开发流程 

2.1.先配置 Protobuf 环境
https://github.com/protocolbuffers/protobuf/releases/在 Google 官方 github 地址下载 Protobuf  。
下载一个 Protobuf 编译器和一个调用编译器的接口程序,我们这里用Python版的。

如上图,箭头所示,解压 protoc.win64.zip 里有个 protoc 命令就是编译器。PS:注意要给 protoc 配置上环境变量,不然没法全局调用该命令。 
解压 protobuf-python-3.11.4.zip 这是Python模块,cd到python目录里运行 Python setup.py build 和 Python setup.py install 安装Python模块。

Python编辑器里运行 import google.protobuf 可以检测是否安装成功。
example目录里有官方写好的Python示例程序 和 示例 .proto文件。

2.2.写一个 .proto 语法文件
语法文件怎么写,要根据具体的传输数据来定制,比如按照 example 里的示例,如果要传输的数据是如下格式:


那么定义的 .proto 语法文件就如下:


这样就定义好了一个 .proto 语法文件,语法文件如何定义要根据传输数据的不同而变。
更全的 protobuf 语法 可以看这个,有网友翻译成了中文版的。https://colobu.com/2017/03/16/Protobuf3-language-guide/


2.3.使用第一步中下载的 protoc 编译器来编译 .proto 文件


protoc --python_out=. addressbook.proto

上述表示把 addressbook.proto 文件编译成Python版的。
如果文件语法错误,在编译的时候会有提示。编译完后,会多出一个.py文件

APP爬虫之-Protobuf协议逆向解析,protobuf

 


我们就可以调用这个 .py 来序列化上面的数据。

2.4.开始序列化数据

APP爬虫之-Protobuf协议逆向解析,protobuf

 


print里输出的就是序列化(“加密”)后的数据。

2.5.对序列化后的数据进行反序列化(“解密”)

APP爬虫之-Protobuf协议逆向解析,protobuf

 
反序列化就把数据又还原啦。


上述过程就是一个完整的正向数据 protobuf 序列化过程。我们可以看出来,主要是定义一个 .proto 文件,然后把它编译生成代码。 后面就主要用这个代码来做序列化和反序列化工作。


三、逆向解析 Protobuf
正向过程比较轻松,因为对方即有 .proto 文件,也有序列化代码,也知道要传输的数据样式。但是逆向这个过程,APP里是没有 .proto文件的,APP里是有反序列化的代码,但是看得也头晕。那该怎么办呢?
借助工具,我们使用上面下载的protoc编译工具,这个工具提供反解析参数

protoc --decode_raw < people.bin

如上,使用 --decode_raw 参数就能把序列化后的数据,反序列化(解密)出来。

上面只是把数据还原了,那如果我们要完全把 .proto 文件也还原出来该怎么办呢?

如果 APP 发送 request 的数据要先序列化后再发送给服务端的话,那爬虫要做的事情就不只反序列化,还要能序列化。
做序列化是一个正向的过程,按照上面流程,必须先要有 .proto 文件才行。所以继续还原 .proto 文件,还原 .proto 是个体力活和细致活。就是参照反解析出来的数据,还原出 .proto 文件。
 

APP爬虫之-Protobuf协议逆向解析,protobuf

 


上面这张图是关键,看懂了就能还原出来。上图左边是反解析出来的数据,中中间是参照左边写出来的 .proto 文件,右边是人家原本的 .proto 文件。
左边和中间图对比可以看出,就是根据左边的字段,挨个把字段重新定义出来就OK啦。遇到 "{" 就定义一个message。
中间和右边图对比可以看出,变量的名字是无关紧要的,数据类型还原正确就行。变量赋值的那些1,2,3是标识号,message里同一层级的标识号不能重复,一般是按照变量顺序从1开始递增。标识号的数字是个关键,数字写错了反解析出来的数据会不对。
这样就把 .proto 文件还原出来了,然后按照正向流程又去编译,就可以使用它去序列化(“加密”)和反序列化(“解密”)APP数据了。文章来源地址https://www.toymoban.com/news/detail-684365.html

到了这里,关于APP爬虫之-Protobuf协议逆向解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Protobuf-net:C#高效序列化工具,助力接口传输与前端解析

      概述: Protobuf-net是C#中高效的二进制序列化工具,以紧凑、跨语言支持和卓越性能著称。通过定义消息类型、序列化和反序列化实现数据传输,并可适用于Web接口。前端可使用protobuf.js库解析Protobuf格式数据。 Protobuf-net(Protocol Buffers)是一种高效的二进制序列化工具,具有

    2024年03月09日
    浏览(40)
  • 【RPC 协议】序列化与反序列化 | lua-cjson | lua-protobuf

    在分布式计算,远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一个地址空间(通常为一个开放网络的一台计算机)的子程序,而程序员就像调用本地程序一样,无需额外地为这个交互作用编程(无需关

    2024年02月10日
    浏览(40)
  • [golang 微服务] 3. ProtoBuf认识,安装以及golang 中ProtoBuf使用

    在移动互联网时代, 手机流量 、 电量 是最为有限的资源,而移动端的即时通讯应用无疑必须得直面这两点。解决流量过大的基本方法就是 使用高度压缩的 通信协议 ,而数据压缩后流量减小带来的自然结果也就是省电:因为大数据量的传输必然需要 更久的网络操作 、 数据

    2024年02月10日
    浏览(41)
  • protobuf 的bug:ImportError_ cannot import name ‘builder‘ from ‘google.protobuf.internal‘

    今天了解到有一个很强大的数据分析工具streamlit,下载安装完发现启动不了……没错就是本文的bug. 什么是 protobuf ? Protocol Buffers 是 Google 开发的一种数据交换格式,采用了一种类似于 XML 的简单的语法,用于定义数据结构,并且可以将这些结构序列化为二进制文件,以便在不

    2024年01月23日
    浏览(45)
  • 【RPC】—Protobuf编码原理

    ⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记链接👉https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ Spring专栏👉https://blog.csdn.net/weixin_53580595/category_12279588.html SpringMVC专栏👉https://blog.csdn.net/weixin_53580595/category_12281721.html Mybatis专栏👉https://blog.csdn.net/weixin_53580595/catego

    2024年02月13日
    浏览(49)
  • 【RPC】—Protobuf入门

    ⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记链接👉https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ Spring专栏👉https://blog.csdn.net/weixin_53580595/category_12279588.html SpringMVC专栏👉https://blog.csdn.net/weixin_53580595/category_12281721.html Mybatis专栏👉https://blog.csdn.net/weixin_53580595/catego

    2024年02月13日
    浏览(50)
  • Protobuf 反射技术简介

    对于反射大家应该不会陌生,如果你接触过一些框架(如 ORM、IOC、OSGi 等) 的内部实现,应该更能体会反射技术的应用可谓无处不在。 反射概念最早出现于人工智能领域,20 世纪 70 年代末被引入到程序语言设计中。1982 年 MIT 的 Smith, Brian Cantwell 在他的博士论文中最早提出了

    2024年01月22日
    浏览(39)
  • 3.netty和protobuf

    1.ChannelGroup可以免遍历由netty提供,覆盖remove方法即可触发删除channel 2.群聊私聊 13.群聊私聊简单原理图 3.netty心跳检测机制,客户端对服务器有没有读写(读,写空闲) //IdleStateHandler(3,5,7,TimeUnite.SECONDS)是netty提供的检测状态的处理器,也加到pipeline,读,写,读写都没有 //并在handler类实现

    2024年02月14日
    浏览(36)
  • Protobuf编码规则

    该表显示了在  .proto  文件中指定的类型,以及自动生成的类中的相应类型: .proto Type Notes C++ Type Java/Kotlin Type[1] Java/Kotlin 类型 [1] Python Type[3] Go Type Ruby Type C# Type PHP Type Dart Type double double double float float64 Float double float double float float float float float32 Float float float double int32 var

    2024年02月02日
    浏览(26)
  • Protobuf 简介

    protobuf (protocol buffer) 是谷歌内部的混合语言数据标准。通过将结构化的数据进行序列化(串行化),用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。通常说的protobuf包括以下三点: 是一种二进制数据交换格式。支持不同与语言例如C++、j

    2024年02月16日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包