1. 认识Protobuf数据逆向第一次接触Protobuf逆向时我盯着那一串串乱码数据完全摸不着头脑。后来才发现这其实是Google开发的一种高效数据序列化格式在Web开发、微服务通信等领域应用非常广泛。简单来说它就像是一个数据压缩包把结构化信息变成紧凑的二进制格式传输效率比JSON高3-10倍。在实际Web逆向工作中我们经常会遇到两种典型场景一种是请求头明确带有content-type: application/grpc-webproto标识另一种是响应数据看起来像乱码但用普通解码方法无效。这时候就需要考虑是不是遇到了Protobuf数据。Protobuf数据有几个明显特征二进制格式用文本编辑器打开显示为乱码通常以.bin文件形式出现请求头可能包含proto/grpc相关标识数据体积比同等信息的JSON小很多我遇到过最棘手的情况是某电商APP的商品详情接口返回数据用常规JSON解析完全无效后来用hexdump查看才发现是Protobuf格式。下面我就分享两种经过实战验证的解析方法。2. 方法一blackboxprotobuf模块实战2.1 环境准备与安装blackboxprotobuf是我最常用的Python第三方库它的优势是不需要.proto定义文件就能直接解析。先确保你的Python环境是3.6版本然后一条命令就能安装pip install blackboxprotobuf这里有个小坑要注意如果同时安装了protobuf库最好指定版本pip install protobuf3.20.*避免版本冲突导致解析异常。我在Windows和Mac上都测试过安装过程一般很顺利。2.2 核心解析代码假设我们已经从网络请求中获取到了二进制数据比如通过Charles或Fiddler抓包保存为response.bin。解析的核心代码其实非常简单import blackboxprotobuf with open(response.bin, rb) as f: data f.read() result, types blackboxprotobuf.decode_message(data) print(result)这段代码我用了不下50次其中decode_message()函数会返回两个值result是解析后的字典结构包含原始数据types是各字段的类型映射对理解数据结构很有帮助2.3 常见问题排查但事情并不总是一帆风顺。上周解析一个短视频APP的接口时就遇到了DecodeError: Error parsing message错误。经过反复测试发现几个常见失败原因数据不完整抓包时可能丢失了部分字节建议用Wireshark完整捕获TCP流嵌套过深遇到多层嵌套时可以尝试max_depth参数调整特殊字段类型新版Protobuf的一些类型可能需要更新库版本我常用的调试技巧是先用hex编辑器查看文件头尾确认数据完整性。如果还是失败可以尝试下面的第二种方法。3. 方法二protoc工具链解析3.1 工具安装配置protoc是Google官方的Protocol Buffers编译器需要手动安装从GitHub releases页面下载对应系统版本建议选最新稳定版解压后把bin/protoc添加到系统PATH验证安装protoc --version这里有个实际案例去年分析某智能硬件协议时blackboxprotobuf解析失败但用protoc却成功了。关键区别在于protoc需要类型定义文件(.proto)但有时可以通过--decode_raw绕过。3.2 基础解析命令最基础的解析命令格式如下protoc --decode_raw response.bin这个命令会直接输出解析结果适合快速查看内容。但更专业的做法是配合.proto定义文件protoc --decodeMyMessage myproto.proto response.bin其中MyMessage是.proto文件中定义的消息类型。如果没有定义文件怎么办这时候就需要逆向工程了。3.3 高级逆向技巧通过--decode_raw的输出我们可以反推proto结构。比如看到输出中有1: 100 2: example 3 { 1: 200 }对应的proto定义可能是message MyMessage { optional int32 field1 1; optional string field2 2; optional SubMessage field3 3; } message SubMessage { optional int32 sub_field1 1; }这个过程需要反复试验。我通常会先用小样本测试逐步完善proto定义直到能完整解析所有数据。4. 实战案例对比分析最近逆向一个物联网设备协议时我同时使用了两种方法对比结果很有意思对比项blackboxprotobufprotoc准备时间5分钟安装库15分钟下载配置解析速度较快极快数据完整性可能丢失部分复杂类型完整解析输出可读性直接生成Python字典需要转换输出格式适用场景快速探索未知结构有.proto文件时的精确解析实际工作中我建议先用blackboxprotobuf快速摸底遇到复杂情况再上protoc。两种方法配合使用能覆盖90%的Protobuf逆向场景。5. 进阶技巧与优化建议经过几十个项目的实战我总结出一些教科书上找不到的经验混合使用两种方法先用blackboxprotobuf获取字段映射关系再编写.proto文件用protoc解析处理大文件的技巧对于超过100MB的bin文件可以用mmap方式读取避免内存溢出自动化解析脚本我写了个自动重试的wrapper函数遇到解析失败会自动尝试不同编码def safe_decode(data, retry3): for i in range(retry): try: return blackboxprotobuf.decode_message(data) except Exception as e: if i retry - 1: raise data data[:-i*10] # 尝试截断尾部常见字段类型识别记住这些映射关系能提高效率1→int32, 2→float, 3→string5→bool, 9→bytes最后提醒一点Protobuf数据可能包含敏感信息解析时要注意数据脱敏。我曾遇到过直接包含用户手机号的案例这在正式报告中必须做模糊处理。
【Web逆向】实战解析:Protobuf数据逆向的两种高效方法
1. 认识Protobuf数据逆向第一次接触Protobuf逆向时我盯着那一串串乱码数据完全摸不着头脑。后来才发现这其实是Google开发的一种高效数据序列化格式在Web开发、微服务通信等领域应用非常广泛。简单来说它就像是一个数据压缩包把结构化信息变成紧凑的二进制格式传输效率比JSON高3-10倍。在实际Web逆向工作中我们经常会遇到两种典型场景一种是请求头明确带有content-type: application/grpc-webproto标识另一种是响应数据看起来像乱码但用普通解码方法无效。这时候就需要考虑是不是遇到了Protobuf数据。Protobuf数据有几个明显特征二进制格式用文本编辑器打开显示为乱码通常以.bin文件形式出现请求头可能包含proto/grpc相关标识数据体积比同等信息的JSON小很多我遇到过最棘手的情况是某电商APP的商品详情接口返回数据用常规JSON解析完全无效后来用hexdump查看才发现是Protobuf格式。下面我就分享两种经过实战验证的解析方法。2. 方法一blackboxprotobuf模块实战2.1 环境准备与安装blackboxprotobuf是我最常用的Python第三方库它的优势是不需要.proto定义文件就能直接解析。先确保你的Python环境是3.6版本然后一条命令就能安装pip install blackboxprotobuf这里有个小坑要注意如果同时安装了protobuf库最好指定版本pip install protobuf3.20.*避免版本冲突导致解析异常。我在Windows和Mac上都测试过安装过程一般很顺利。2.2 核心解析代码假设我们已经从网络请求中获取到了二进制数据比如通过Charles或Fiddler抓包保存为response.bin。解析的核心代码其实非常简单import blackboxprotobuf with open(response.bin, rb) as f: data f.read() result, types blackboxprotobuf.decode_message(data) print(result)这段代码我用了不下50次其中decode_message()函数会返回两个值result是解析后的字典结构包含原始数据types是各字段的类型映射对理解数据结构很有帮助2.3 常见问题排查但事情并不总是一帆风顺。上周解析一个短视频APP的接口时就遇到了DecodeError: Error parsing message错误。经过反复测试发现几个常见失败原因数据不完整抓包时可能丢失了部分字节建议用Wireshark完整捕获TCP流嵌套过深遇到多层嵌套时可以尝试max_depth参数调整特殊字段类型新版Protobuf的一些类型可能需要更新库版本我常用的调试技巧是先用hex编辑器查看文件头尾确认数据完整性。如果还是失败可以尝试下面的第二种方法。3. 方法二protoc工具链解析3.1 工具安装配置protoc是Google官方的Protocol Buffers编译器需要手动安装从GitHub releases页面下载对应系统版本建议选最新稳定版解压后把bin/protoc添加到系统PATH验证安装protoc --version这里有个实际案例去年分析某智能硬件协议时blackboxprotobuf解析失败但用protoc却成功了。关键区别在于protoc需要类型定义文件(.proto)但有时可以通过--decode_raw绕过。3.2 基础解析命令最基础的解析命令格式如下protoc --decode_raw response.bin这个命令会直接输出解析结果适合快速查看内容。但更专业的做法是配合.proto定义文件protoc --decodeMyMessage myproto.proto response.bin其中MyMessage是.proto文件中定义的消息类型。如果没有定义文件怎么办这时候就需要逆向工程了。3.3 高级逆向技巧通过--decode_raw的输出我们可以反推proto结构。比如看到输出中有1: 100 2: example 3 { 1: 200 }对应的proto定义可能是message MyMessage { optional int32 field1 1; optional string field2 2; optional SubMessage field3 3; } message SubMessage { optional int32 sub_field1 1; }这个过程需要反复试验。我通常会先用小样本测试逐步完善proto定义直到能完整解析所有数据。4. 实战案例对比分析最近逆向一个物联网设备协议时我同时使用了两种方法对比结果很有意思对比项blackboxprotobufprotoc准备时间5分钟安装库15分钟下载配置解析速度较快极快数据完整性可能丢失部分复杂类型完整解析输出可读性直接生成Python字典需要转换输出格式适用场景快速探索未知结构有.proto文件时的精确解析实际工作中我建议先用blackboxprotobuf快速摸底遇到复杂情况再上protoc。两种方法配合使用能覆盖90%的Protobuf逆向场景。5. 进阶技巧与优化建议经过几十个项目的实战我总结出一些教科书上找不到的经验混合使用两种方法先用blackboxprotobuf获取字段映射关系再编写.proto文件用protoc解析处理大文件的技巧对于超过100MB的bin文件可以用mmap方式读取避免内存溢出自动化解析脚本我写了个自动重试的wrapper函数遇到解析失败会自动尝试不同编码def safe_decode(data, retry3): for i in range(retry): try: return blackboxprotobuf.decode_message(data) except Exception as e: if i retry - 1: raise data data[:-i*10] # 尝试截断尾部常见字段类型识别记住这些映射关系能提高效率1→int32, 2→float, 3→string5→bool, 9→bytes最后提醒一点Protobuf数据可能包含敏感信息解析时要注意数据脱敏。我曾遇到过直接包含用户手机号的案例这在正式报告中必须做模糊处理。