无.proto文件时能否逆向解析Protobuf消息格式?
问题
读取API响应时遇到以下情况:
- API返回内容类型为Protobuf,已获取十六进制(HEX)格式响应内容,通过Protobuf解码器解析后得到的内容值,与该API支持的JSON格式响应值完全匹配。
HEX响应内容(来自Charles Proxy):
00000000 0a 00 12 1b 09 00 00 00 00 00 80 56 40 11 00 00 V@ 00000010 00 00 00 20 bc 40 19 00 00 00 00 00 20 9c 40 @ @
Protobuf解码器输出:
[0a] 1 string: (0): [12] 2 string: (27): [09] 1 fixed64/double: 4636033603912859648 (0x4056800000000000) (90.000000) [11] 2 fixed64/double: 4664638498421080064 (0x40bc200000000000) (7200.000000) [19] 3 fixed64/double: 4655631299166339072 (0x409c200000000000) (1800.000000)
JSON格式响应:
{ "config": { "interval": 90, "timeout": 7200, "timeout2": 1800 } }
但部分API端点不支持JSON格式,仅能获取值,无法得知对应的标签名(如"config"、"timeout"、"timeout2")。请问在没有.proto文件的情况下,是否有方法逆向解析出Protobuf消息格式?
可行的逆向解析方法
当然可以,以下是几种实用的手段:
1. 多组样本对比推导字段名
收集同一API或同类型接口的多组不同输入输出样本,观察字段值的变化规律:
- 若某个字段值随业务操作(如修改配置、提交表单)同步变化,可对应推测其业务含义(比如值从90变到180,大概率是时间间隔类字段);
- 重复出现的字段编号(如示例中的
09、11、19)对应固定业务含义,结合业务场景可推断字段名。
2. 借助Protobuf逆向工具
使用专门的逆向工具辅助解析,无需依赖.proto文件:
- Protobuf Inspector:直接解析HEX或二进制数据,可视化展示字段编号、类型和值,同时支持手动标注字段名并导出.proto模板;
- protofuzz:通过模糊测试生成不同输入,观察输出变化来反向推导字段的约束和含义;
- 抓包工具插件:Charles、Fiddler的Protobuf插件支持自动关联已有JSON映射,或通过多次请求对比自动标注可能的字段名。
3. 结合业务上下文与字段类型推断
根据字段的类型和数值范围,结合业务场景猜解:
- 示例中
fixed64/double类型的数值90、7200、1800,都是典型的时间秒数,对应JSON中的interval(间隔)、timeout(超时)完全符合逻辑; - 嵌套字段(如示例中
12编号对应的子消息),结合业务模块划分,可推测是某个配置组(如config)。
4. 动态调试客户端代码
如果能获取调用API的客户端(如移动端APP、前端代码),可通过动态调试手段获取字段信息:
- 移动端用Frida等Hook工具,拦截Protobuf序列化/反序列化的调用,直接获取客户端内存中的字段名和结构;
- 前端代码查看是否有嵌入的Protobuf定义或编译后的JS文件,从中提取字段映射关系。
内容的提问来源于stack exchange,提问作者Phuc Nguyen
相关产品推荐
相关产品推荐

