我正在对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足以让我反序列化应用和服务器之间的消息?
答案 0 :(得分:2)
当您编写.proto
文件时,您可以将选项optimize_for
设置为LITE_RUNTIME
(请参阅here),这将省略生成的代码中的描述符以减少二进制的大小。我认为这是移动开发的常见做法,因为代码大小是该环境中的稀缺资源。这可以解释为什么您只找到一个.proto
文件。应用程序实际上不太可能使用descriptor.proto
传输任何数据,因为这主要是协议缓冲区库的实现细节。
如果找不到任何其他描述符,最好的办法是尝试在没有它们的情况下解释协议缓冲区。您可以阅读协议缓冲区有线格式here。一个简单的入门方法是创建一个不包含字段的proto2消息类型,并尝试将数据解析为该类型。然后,您可以使用反射API来检查消息中所谓的“未知字段”,并尝试找出它们代表的内容。
答案 1 :(得分:1)