系列文章目录
训练地址:https://www.qiulianmao.com
- 基础-websocket逆向
- 基础-http拦截
- 基础-websocket拦截
- 基础-base64编码与解码
- 基础-protobuf序列化与反序列化
- 视频号直播弹幕采集
- 实战一:Http轮询
- 更新中
websocket逆向-protobuf序列化与反序列化基础
- 系列文章目录
- 一、基础知识
- 1. 序列化与反序列化
- 2. 常见的数据格式
- 3. 什么是protobuf
- 二、如何判断网站使用了protobuf
- 1. 通过响应进行分析
- 2. 通过请求头进行分析
- 3. 分析js
- 三、protobuf的序列化与反序列化
- 1. 环境配置【python】
- 2.定义proto结构
- 3. 编译 .proto 文件
- 4. 序列化
- 5. 反序列化
- 四、总结
一、基础知识
1. 序列化与反序列化
- 序列化:就是将明文转化成字节序列的过程、方便传输。
- 反序列化:就是将字节序列转化成明文的过程、方便使用。
- 服务器【明文序列化为二进制】-------传输------> 客户端【二进制反序列化为明文】
2. 常见的数据格式
- 文本化协议:json,xml。可视化效果好,便于维护。
- 开源协议:protobufer,json。有现成的序列化与反序列化库,都是经过长期检验的。
- 自定义的二进制数据:自行定义序列化与反序列化规则,自由度高,应用范围不广。
3. 什么是protobuf
- protobuf是二进制数据序列化协议。
- 优点:比json、xml等体积小、传输快。
- 特点:序列化与反序列化需要借助proto文件。像结构体、有顺序、有string、int32、bool、bytes等数据类型。
二、如何判断网站使用了protobuf
1. 通过响应进行分析
请求响应是二进制的,抓包工具显示为乱码。
2. 通过请求头进行分析
在请求标头或者url地址参数中出现protobuf关键字
3. 分析js
js中出现1,2,3这样的顺序,出现string,int64,bytes…数据类型
分析js是非常重要的,在逆向过程中,需要借助js进行反推proto文件,才能对消息进行序列化与发序列化。
三、protobuf的序列化与反序列化
1. 环境配置【python】
- 下载protoc.exe:https://github.com/protocolbuffers/protobuf/releases
- 安装相关库【注意版本对应】
pip install protobuf
pip install google
# 如果提示没有安装google库
pip install google-cloud
pip install google-cloud-vision
2.定义proto结构
- 文件名称:message.proto
syntax = "proto3";
// 定义一个 Person 消息类型
message Person {
string name = 1;
int32 age = 2;
Gender gender = 3; // 枚举类型字段
map<string, string> email = 4; // Map 类型字段,将字符串键映射到字符串值
repeated Cars cars = 5; // 重复字段,表示一个 Cars 类型的数组
bool is_student=6; //布尔类型
bytes hi = 7;
}
// 定义一个 Gender 枚举类型
enum Gender {
UNKNOWN = 0;
MALE = 1;
FEMALE = 2;
OTHER = 3;
}
// 定义一个 Cars 嵌套消息类型
message Cars{
string make = 1; // 假设 Cars 类型有一个名为 make 的字符串字段
int32 year = 2; // 假设 Cars 类型有一个名为 year 的 32 位整数字段
}
3. 编译 .proto 文件
有的电脑是不需要前面的.\
进入proto所在cmd路径后,执行
.\protoc --python_out=. person.proto
4. 序列化
# 秋恋猫
import person_pb2
def serialize_person():
# 创建一个 Person 对象
person = person_pb2.Person()
person.name = "秋恋猫"
person.age = 30
person.gender = person_pb2.Gender.FEMALE # 使用枚举值
# 添加 email 信息到 Map 字段
person.email["plat"] = "qq"
person.email["number"] = "qiulianmao@qq.com"
# 添加车辆信息到重复字段
car1 = person.cars.add()
car1.make = "奥迪"
car1.year = 2020
car2 = person.cars.add()
car2.make = "奔驰"
car2.year = 2018
# 布尔类型
person.is_student = True
# 字节型
persion.hi = b'hi'
# 将 Person 对象序列化为字节流
serialized_data = person.SerializeToString()
return serialized_data
serialized_data = serialize_person()
5. 反序列化
# 秋恋猫
import person_pb2
from google.protobuf.json_format import MessageToDict
def deserialize_person(serialized_data):
# 创建一个空的 Person 对象
person = person_pb2.Person()
# 将字节流反序列化为 Person 对象
person.ParseFromString(serialized_data)
# Person 对象 转为字典
obj1 = MessageToDict(person, preserving_proto_field_name=True)
deserialize_person(serialized_data)
四、总结
本文主要介绍了protobuf序列化与反序列化的知识点,主要讲解了序列化与反序列、常见的数据传输格式以及protobuf的实际使用。