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

标签 reverse-engineering protocol-buffers

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

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

我的印象是 Protocol Buffer 的用户编写了他们自己的 .proto 文件,这些文件可能引用了 google/protobuf/descriptor.proto,但根据 protod google/protobuf/descriptor.proto 是该应用程序使用的唯一原型(prototype)文件.这真的可能吗?google/protobuf/descriptor.proto 足以让我反序列化应用程序和服务器之间的消息吗?

最佳答案

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

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

关于reverse-engineering - 在没有 .proto 文件的情况下解析 Protocol-Buffers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37960368/

相关文章:

go - 解码 JSON 时接受 proto 结构中的动态键

c - 逆向工程——使用调试信息进行编译

java - Java 源代码的数据流图创建器

c# - Entity Framework Core 从现有数据库创建模型

go - 我应该如何使用 protoc-gen-go-grpc?

go - 如何用数据动态填充结构?

c - 将非 ASCII 字符写入 tty 上程序的标准输入(通过 ssh)

java - 如何防止jar/war/ear文件的逆向工程

android - 通过 Android Intent 传递 Protocol Buffer 对象

protocol-buffers - Nanopb -解码失败: zero tag