websocket逆向-protobuf序列化与反序列化

系列文章目录

训练地址:https://www.qiulianmao.com



websocket逆向-protobuf序列化与反序列化基础


一、基础知识

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】

python 复制代码
pip install protobuf
pip install google
# 如果提示没有安装google库
pip install google-cloud
pip install google-cloud-vision

2.定义proto结构

  • 文件名称:message.proto
python 复制代码
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路径后,执行

python 复制代码
.\protoc --python_out=. person.proto

4. 序列化

python 复制代码
# 秋恋猫
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. 反序列化

python 复制代码
# 秋恋猫
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的实际使用。

相关推荐
2501_9216494919 分钟前
亚太股票数据API:日股、韩股、新加坡股票、印尼股票市场实时行情,实时数据API-python
开发语言·后端·python·websocket·金融
卓码软件测评31 分钟前
第三方软件评测机构:【Apifox API密钥管理指南的密钥安全存储和密钥使用凭证】
网络·测试工具·测试用例
LaoZhangGong12332 分钟前
uip之TCP服务器
服务器·网络·stm32·tcp/ip·tcp·uip
小跌—34 分钟前
Linux:理解HTTPS
网络协议·https
llilian_1635 分钟前
精准时序赋能千行百业——IEEE1588PTP授时主时钟应用解析 PTP授时服务器 IEEE1588主时钟
运维·服务器·网络·嵌入式硬件·其他
老蒋新思维38 分钟前
创客匠人 2025 万人峰会深度:AI+IP 信任三角重构知识变现 —— 从单次成交到终身绑定的生态逻辑
大数据·网络·人工智能·tcp/ip·重构·创始人ip·创客匠人
乾元40 分钟前
从命令行到自动诊断:构建 AI 驱动的故障树与交互式排障机器人引言
运维·开发语言·网络·人工智能·华为·自动化
老蒋新思维41 分钟前
创客匠人峰会总结:私域 AI 化引爆知识变现 —— 创始人 IP 的智能增长新范式
网络·人工智能·网络协议·tcp/ip·重构·创始人ip·创客匠人
bleach-41 分钟前
文件描述符及Linux下利用反弹shell的各种方法
linux·websocket·web安全·网络安全·系统安全·信息与通信
咋吃都不胖lyh41 分钟前
urllib3.util.retry.Retry 是 Python HTTP 客户端库 urllib3 中的一个核心组件,用于实现智能的请求重试机制
网络·网络协议·http