【问题标题】:Parsing Protocol-Buffers without .proto file解析没有 .proto 文件的协议缓冲区
【发布时间】:2016-06-22 06:40:13
【问题描述】:

我正在对一个 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 是应用程序使用的唯一 protofile .这真的可能吗? google/protobuf/descriptor.proto 足以让我反序列化应用程序和服务器之间的消息吗?

【问题讨论】:

  • 你用那个 proto 文件试过了吗?
  • 在让 Charles 代理使用从该 protofile 生成的 .desc 来解码 protobuf 消息时遇到了一些麻烦,并且想知道这是否值得我弄清楚(因此上面的问题)。是否有一些命令行工具我可以传递一条消息和一个 protobuf .desc 文件,它会给我解码后的消息?

标签: reverse-engineering protocol-buffers


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 2012-12-05
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多