Joe*_*Joe 2 reverse-engineering protocol-buffers
作为安全项目的一部分,我正在对 Android 应用程序进行逆向工程。我的第一步是发现应用程序和服务器之间交换的协议。我发现正在使用的协议是协议缓冲区。鉴于 protobuf 的性质,需要原始 .proto 文件才能反序列化 protobuf 编码的消息。因为我没有,所以我使用protod来反汇编 Android 应用程序并恢复使用的任何 .proto 文件。
我的 Android 应用程序的形式是一堆 .smali 和 .so 文件。针对 .so 文件运行 protod 仅生成一个 .proto 文件 - google/protobuf/descriptor.proto。
我的印象是协议缓冲区的用户编写自己的 .proto 文件,这些文件可能引用 google/protobuf/descriptor.proto,但根据 protod google/protobuf/descriptor.proto 是应用程序使用的唯一原型文件。这实际上是可能的吗? google/protobuf/descriptor.proto 足以让我反序列化应用程序和服务器之间的消息吗?
小智 7
当您编写.proto文件时,您可以设置一个选项optimize_for(LITE_RUNTIME请参阅此处),这将从生成的代码中省略描述符以减少二进制文件的大小。我相信这是移动开发的常见做法,因为代码大小在该环境中是稀缺资源。这可以解释为什么您只找到一个.proto文件。应用程序不太可能实际使用传输任何数据,descriptor.proto因为这主要是协议缓冲区库的实现细节。
如果找不到任何其他描述符,最好的选择可能是尝试在没有它们的情况下解释协议缓冲区。您可以在此处阅读有关协议缓冲区有线格式的信息。一个简单的开始方法是创建一个不包含字段的 proto2 消息类型,并尝试将数据解析为该类型。然后,您可以使用反射 API 检查消息中所谓的“未知字段”,并尝试找出它们代表的内容。