主要观点:几年前发布了 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”的图示。
- 介绍用于单元测试的小工具及测试过程。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。