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

news2024/10/6 22:31:43

系列文章目录

训练地址: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的实际使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1092110.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统 内存对齐

文章目录 内存管理内存对齐为什么需要内存对齐内存对齐的规则举例说明两个函数 内存管理 内存是计算机的重要组成部分&#xff0c;内存是与cpu沟通的桥梁&#xff0c;用来暂存cpu中的运算数据。在早期&#xff0c;程序直接运行在物理内存中&#xff0c;直接操作物理内存&#…

MathType7.5最新版本升级教程

MathType7.5是MathType6.9a的升级版本&#xff0c;这是一款好用的数学公式编辑器&#xff0c;软件支持win、mac等操作系统&#xff0c;可以与各类办公软件兼容&#xff0c;能够快速在office文档中进行各类数学公式、符号的输入和运算等操作&#xff0c;coco玛奇朵小编为大家带来…

LiveGBS流媒体平台GB/T28181常见问题-如何禁用删除已注册设备国标设备如何删除

LiveGBS常见问题-如何禁用删除已注册设备国标设备如何删除 1、禁用删除设备2、找到需要删除的设备3、接入控制黑名单4、配置到黑名单5、删除设备6、搭建GB28181视频直播平台 1、禁用删除设备 有的时候&#xff0c;需要将接入到平台的某些设备禁用&#xff0c;并删除。改如何操…

池化技术在真实业务中的实践

一些废话 作为一名Java开发人员&#xff0c;池化技术或多或少在业务代码中使用。常见的包括线程池、连接池等。也是因为Java语言超级丰富的基建&#xff0c;基本上这些池化能力都有着相对成熟的“工具”。比如&#xff0c;需要使用线程池的时候常常会选择Spring提供的 ThreadP…

DL Homework 4

目录 1 整理一下理论收获 1.1 基础理论 1.2 应用到机器学习 1.3 参数学习 1.4 反向传播算法 2.激活函数 3.神经网络流程推导(包含正向传播和反向传播) 4.数值计算 - 手动计算 5.代码实现 - numpy手推 6.代码实现 - pytorch自动 7.激活函数Sigmoid用PyTorch自带函数torc…

蓝桥杯(七段码,C++)

思路&#xff1a; 1、把灯管的连接转为图结构&#xff0c;相邻的灯管即认为有边。 2、用深度搜索&#xff0c;去计算有多少种不同字符。 3、因为有每种字符都会重复算两遍&#xff0c;最后的结果需要数以2。 #include <iostream> using namespace std;int graph[7][7…

震惊!阿里卷成这样?不吃饭了,上厕所、团建都要聊工作,人均上厕所小于一天三次...

上一篇&#xff1a;雷军被小米封号 你敢相信吗&#xff1f;最近一篇名为《坐标阿里 我们组已经不吃饭了》的帖子在大厂社区上引发热议。 作者爆料&#xff1a;坐标阿里&#xff0c;组里已经卷到不吃饭了&#xff0c;之前卷到上厕所要聊工作、团建都要聊工作&#xff0c;现在已经…

B2R靶机渗透

B2R靶机渗透 视频参考&#xff1a;ajest &#xff1a;https://www.zhihu.com/zvideo/1547357583714775040?utm_id0 原文参考&#xff1a;ajest &#xff1a;https://www.zhihu.com/column/c_1403138803561816064 文章目录 B2R靶机渗透1 启动靶机&#xff0c;查看后网卡为ma…

数据特征选择 | Lasso特征选择(Python)

文章目录 效果一览文章概述源码设计小结效果一览 文章概述 Lasso算法是一种经典的线性回归算法,被广泛应用于特征选择和降维问题。相较于传统的线性回归算法,Lasso算法能够在保持预测准确性的同时,自动筛选出对目标变量影响较大的特征变量,从而达到降低模型复杂度、提高泛化…

CSS悬停卡片翻转明信片效果源码附注释

运行效果演示: HTML页面代码: <!DOCTYPE html> <html lang="en" > <head>

kafka安装步骤以及初步入门

安装Java sudo apt install default-jdk # 执行完直接直接查看版本就好了 java -versionhttps://blog.csdn.net/CyberSparkZ/article/details/132441191 安装zookeeper https://blog.csdn.net/supercrsky/article/details/124570611 https://blog.csdn.net/xiaozhang_man/ar…

为什么大多数企业开始转型做私域?

随着互联网的迅猛发展&#xff0c;越来越多的企业纷纷选择转型做私域电商。下面是十大理由&#xff0c;说明为什么大多数企业开始转型做私域。 一、提高用户黏性 通过私域化经营&#xff0c;企业能够更好地掌握用户信息和行为习惯&#xff0c;建立用户数据库&#xff0c;并利…

206、SpringBoot 整合 RabbitMQ 的自动配置类 和 对应的属性处理类 的知识点

目录 ★ Spring Boot 为 RabbitMQ 提供的自动配置▲ 自动配置类&#xff1a;RabbitAutoConfiguration▲ 属性处理类&#xff1a;RabbitProperties相关配置 ★ AmqpAdmin的方法★ AmqpTemplate的方法代码演示创建一个springboot的项目。application.properties 配置属性 ★ Spri…

JavaScript发布—订阅模式

JavaScript发布—订阅模式 1 什么是发布—订阅模式2 DOM 事件3 实现一个发布—订阅模式4 发布—订阅模式的通用实现5 取消订阅的事件6 全局的发布—订阅对象7 模块间通信 1 什么是发布—订阅模式 发布—订阅模式又叫观察者模式&#xff0c;它定义对象间的一种一对多的依赖关系…

第五十六章 学习常用技能 - 执行 SQL 查询

文章目录 第五十六章 学习常用技能 - 执行 SQL 查询执行 SQL 查询检查对象属性 第五十六章 学习常用技能 - 执行 SQL 查询 执行 SQL 查询 要运行 SQL 查询&#xff0c;请在管理门户中执行以下操作&#xff1a; 选择系统资源管理器 > SQL。如果需要&#xff0c;请选择标题…

Servlet与设计模式

1 过滤器和包装器 过滤器可以拦截请求及控制响应&#xff0c;而servlet对此毫无感知。过滤器有如下作用&#xff1a; 1&#xff09;请求过滤器&#xff1a;完成安全检查、重新格式化请求首部或体、建立请求审计日志。 2&#xff09;响应过滤器&#xff1a;压缩响应流、追加或…

softmax激活函数

Softmax激活函数是一种用于多类别分类问题的激活函数&#xff0c;通常用于神经网络的输出层。它将原始分数&#xff08;也称为logits&#xff09;转换为表示概率分布的数值&#xff0c;使得每个类别的概率值都在0和1之间&#xff0c;并且所有类别的概率之和等于1。这使得它适用…

2023年9月 青少年软件编程等级考试Scratch二级真题

202309 青少年软件编程等级考试Scratch二级真题&#xff08;电子学会等级考试&#xff09; 试卷总分数&#xff1a;100分 试卷及格分&#xff1a;60 分 考试时长&#xff1a;60 分钟 第 1 题 点击绿旗&#xff0c;运行程序后&#xff0c;舞台上的图形是?( ) A&#xff1a;画…

极简c++(8)抽象类与多态

类型转换规则 父类定义的指针可以指向子类对象&#xff1b; 指针会误以为&#xff0c;他们指向的对象是Base1类型&#xff0c;导致错误&#xff1b; 虚函数定义 多态 如何实现多态&#xff1a; 1.创建类的继承关系图 2.所以类对象都可以调用的这个函数 3.创建父类指针数组 …