在没有 .proto 文件的情况下解析 Protocol-Buffers

Parsing Protocol-Buffers without .proto file

我正在对 Android 应用程序进行逆向工程,作为安全项目的一部分。我的第一步是发现应用程序和服务器之间交换的协议。我发现正在使用的协议是协议缓冲区。鉴于 protobuf 的性质,需要原始 .proto 文件才能反序列化 protobuf 编码的消息。因为我没有,所以我使用 protod 反汇编了 Android 应用程序并恢复了所有使用的 .proto 文件。

我的 Android 应用程序是一堆 .smali 和 .so 文件。 运行 protod 针对 .so 文件只产生一个 .proto 文件 -- google/protobuf/descriptor.proto.

我的印象是协议缓冲区的用户编写了他们自己的 .proto 文件,这些文件可能引用 google/protobuf/descriptor.proto,但根据 protod google/protobuf/descriptor.proto 是唯一使用的协议文件应用程序。这真的可能吗? google/protobuf/descriptor.proto 足以让我反序列化应用程序和服务器之间的消息吗?

当您编写 .proto 文件时,您可以将选项 optimize_for 设置为 LITE_RUNTIME(请参阅 here),这将从生成的代码中省略描述符减少二进制文件的大小。我相信这是移动开发的常见做法,因为代码大小在该环境中是一种稀缺资源。这可以解释为什么您只找到一个 .proto 文件。该应用不太可能实际使用 descriptor.proto 传输任何数据,因为这主要是协议缓冲区库的实现细节。

如果找不到任何其他描述符,最好的办法可能是尝试在没有它们的情况下解释协议缓冲区。您可以阅读协议缓冲区有线格式 here。一种简单的入门方法是创建一个不包含任何字段的 proto2 消息类型,并尝试将数据解析为该类型。然后,您可以使用反射 API 检查消息中所谓的 "unknown fields" 并尝试弄清楚它们代表什么。