从编译的二进制文件中逆向工程 Protobuf 定义

主要观点:几年前发布了 protodump 工具,可从编译二进制文件中提取完整源 protobuf 定义,本文解释其工作原理并展示演示。
关键信息:

  • 通过查看test.proto示例,说明 protobuf 支持运行时反射,protoc 编译器在生成代码中存储 protobuf 定义。
  • 提取二进制文件中 protobuf 定义的策略是遍历程序二进制内容,查找类似 FileDescriptors 的字节序列并解码。
  • 查找 FileDescriptors 时采用在程序二进制中搜索“.proto”字符串的简单方法,要确定读取的范围需了解 protobuf 有线格式。
  • 为将 FileDescriptor 对象转换为源“.proto”文件,作者编写了自己的实现。
  • 该方法有局限性,仅适用于 Google 的 protoc 编译器,存在命名、混淆、字段顺序等问题,且很多编译器可抑制嵌入。但实际使用中多数二进制文件可成功提取完整 protobuf 定义。
    重要细节:
  • 给出test.proto示例代码及编译后生成的 golang 代码。
  • 详细解释 protobuf 有线格式中变量长度整数和“Tag-Length-Value”方案。
  • 展示程序二进制中“Program memory”和“Annotated file descriptor”的图示。
  • 介绍用于单元测试的小工具及测试过程。
阅读 15
0 条评论