python实现protobuf序列化与反序列化 您所在的位置:网站首页 map序列化和反序列化哪个好 python实现protobuf序列化与反序列化

python实现protobuf序列化与反序列化

2023-12-09 14:42| 来源: 网络整理| 查看: 265

系列文章目录

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

基础-websocket逆向基础-http拦截基础-websocket拦截基础-base64编码与解码基础-python实现protobuf序列化与反序列化基础-前端js实现protobuf序列化与反序列化视频号直播弹幕采集tiktok protobuf序列化与反序列化实战一:Http轮询更新中

python实现protobuf序列化与反序列化 系列文章目录一、基础知识1. 序列化与反序列化2. 常见的数据格式3. 什么是protobuf 二、如何判断网站使用了protobuf1. 通过响应进行分析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 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"] = "[email protected]" # 添加车辆信息到重复字段 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的实际使用。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有