逆向分析:还原 App protobuf 协议加密
前言
之前有记录js逆向、安卓逆向等,今天这里记录下一些协议逆向,这种一般出现在websocket 协议、 protobuf 协议等,某音,B站 APP等都有用到这些协议加密,而我们不再是像 js 端一样去找定义的类型 id 了。
基本流程和原理
一、什么是 protobuf 协议? Protobuf (Protocol Buffers) 是谷歌开发的一款无关平台,无关语言,可扩展,轻量级高效的序列化结构的数据格式,用于将自定义数据结构序列化成字节流,和将字节流反序列化为数据结构。所以很适合做数据存储和为不同语言,不同应用之间互相通信的数据交换格式,只要实现相同的协议格式,即后缀为 proto 文件被编译成不同的语言版本,加入各自的项目中,这样不同的语言可以解析其它语言通过 Protobuf 序列化的数据。目前官方提供 c++,java,go 等语言支持。
二、protobuf 堆栈输出
syntax = proto3; message FeedData { message Message{ string url = 2; } message Info{ string user_id = 1; string user_name = 3; repeated Message data = 7; } message FeedView{ string item_id = 1; repeated Info info = 4; } repeated FeedView message = 5; }
3、执行如下命令,编译为 python protobuf 可执行文件:
protoc --python_out=. *.proto
代码实现
整个项目完整代码实现如下:
from dyFeed_pb2 import FeedData from google.protobuf.json_format import MessageToDict def main(): with open(feed2.bin, rb) as f: _info = FeedData() _info.ParseFromString(f.read()) _data = MessageToDict(_info, preserving_proto_field_name=True) items = _data.get("message", []) for item in items: item_id = item.get("item_id") info = item.get("info")[0] user_id = info.get("user_id") user_name = info.get("user_name") icon = info.get("data")[0].get("url") print(item_id, user_id, user_name, icon) if __name__ == __main__: main()
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
搭建属于自己的影视网站