• 逆向分析:还原 App protobuf 协议加密


    前言

    之前有记录js逆向、安卓逆向等,今天这里记录下一些协议逆向,这种一般出现在websocket 协议、 protobuf 协议等,某音,B站 APP等都有用到这些协议加密,而我们不再是像 js 端一样去找定义的类型 id 了。

    基本流程和原理

    一、什么是 protobuf 协议?
    Protobuf (Protocol Buffers) 是谷歌开发的一款无关平台,无关语言,可扩展,轻量级高效的序列化结构的数据格式,用于将自定义数据结构序列化成字节流,和将字节流反序列化为数据结构。所以很适合做数据存储和为不同语言,不同应用之间互相通信的数据交换格式,只要实现相同的协议格式,即后缀为 proto 文件被编译成不同的语言版本,加入各自的项目中,这样不同的语言可以解析其它语言通过 Protobuf 序列化的数据。目前官方提供 c++,java,go 等语言支持。

    二、protobuf 堆栈输出

    1、首先我们从 charles 应用中保存我们抓到的某音数据包,截图如下所示:
    在这里插入图片描述

    2、访问协议接口,将 response 响应内容保存为 .bin 格式文件,截图如下所示:
    在这里插入图片描述

    3、使用 protobuf_inspector python 第三方包打印 protobuf 文件堆栈信息,截图如下所示:
    在这里插入图片描述
    总结:打印 protobuf 数据堆栈信息后,接下来我们只需要根据打印的堆栈信息定义 proto id 类型文件并编译为 python 可执行文件即可完成对某音 protobuf 协议还原。

    三、proto 文件定义及编译
    1、通过分析打印的堆栈信息,确定我们本次要提取的文字内容,截图如下所示:
    在这里插入图片描述
    2、确定我们要提取的文字内容后,定义 proto 文件格式,定义后的结构体如下所示:

    syntax = 'proto3';
    message FeedData {
      message Message{
        string url = 2;
      }
    
      message Info{
        string           user_id   = 1;
        string           user_name = 3;
        repeated Message data      = 7;
      }
    
      message FeedView{
        string        item_id = 1;
        repeated Info info    = 4;
      }
      repeated FeedView message = 5;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    3、执行如下命令,编译为 python protobuf 可执行文件:

    protoc  --python_out=. *.proto
    
    • 1

    4、运行命令后,生成 python protobuf py 文件,截图如下所示:
    在这里插入图片描述
    总结:走到这里 protobuf 协议就完全还原了,接下来让我们进入完整代码实现环节吧。

    代码实现

    整个项目完整代码实现如下:

    from dyFeed_pb2 import FeedData
    from google.protobuf.json_format import MessageToDict
    
    def main():
        with open('feed2.bin', 'rb') as f:
            _info = FeedData()
            _info.ParseFromString(f.read())
            _data = MessageToDict(_info, preserving_proto_field_name=True)
            items = _data.get("message", [])
            for item in items:
                item_id = item.get("item_id")
                info = item.get("info")[0]
                user_id = info.get("user_id")
                user_name = info.get("user_name")
                icon = info.get("data")[0].get("url")
                print(item_id, user_id, user_name, icon)
    
    if __name__ == '__main__':
        main()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    代码编写完成后,我们运行代码,代码输出截图如下所示:
    在这里插入图片描述
    以上一套完整逆向分析协议加密就此完成,特此记录~
    分析给大家,希望对大家有用!

  • 相关阅读:
    最简单的RNN预测股票收盘价
    dos2unix命令
    视频监控汇聚平台EasyNVR安防视频平台新版本无法对接到EasyNVS平台并报错login error,该如何解决?
    从Vue 2到Vue 3:深入了解路由配置的变化与升级建议
    快捷键记录
    github使用教程
    Mybatis实战练习二【查询详情】
    Graphviz代码流程图-智慧交通结构图
    【golang】分布式缓存 - 一致性哈希算法
    systemd 强大的初始化系统和服务管理器
  • 原文地址:https://blog.csdn.net/weixin_42277380/article/details/126306126