码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • websocket逆向-protobuf序列化与反序列化


    系列文章目录

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


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

    python实现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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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 位整数字段
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    3. 编译 .proto 文件

    有的电脑是不需要前面的.\
    进入proto所在cmd路径后,执行

    .\protoc --python_out=. person.proto
    
    • 1

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    四、总结

    本文主要介绍了protobuf序列化与反序列化的知识点,主要讲解了序列化与反序列、常见的数据传输格式以及protobuf的实际使用。

  • 相关阅读:
    Java+JSP+MySQL基于SSM的在线投票系统-计算机毕业设计
    数组方法
    使用环形缓冲区ringbuffer实现串口数据接收
    Git常见命令
    mysql数据库基础:DQL数据查询语言
    ABP微服务学习系列-修复System.Text.Json不支持序列化Exception
    算法通关村——数字中的统计、溢出、进制转换处理模板
    ICC2: 限制指定net绕线区域
    Compose LazyColumn 对比 RecyclerView ,谁的性能更好?
    Java多线程:线程池详解(2)
  • 原文地址:https://blog.csdn.net/tdl320721/article/details/133827636
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号