具有未知定义的反向工程协议缓冲区的工具
protobuf-inspector的Python项目详细描述
原型检查员
可以解析Google Protobuf编码的blob的简单程序 (第2版或第3版)不知道其附带的定义。 它将打印一个漂亮的,彩色的内容表示。示例:
正如您所看到的,字段名显然丢失了 一些高级细节,例如:
- 变量是否使用zig-zag encoding(默认情况下将假定没有锯齿形)
- 32位/64位值是整数还是浮点(默认情况下都显示)
- 签名(默认情况下自动检测)
但是protobuf inspector能够正确猜测消息结构 大多数时候。当它在字段上找到嵌入的二进制数据时,它将 首先尝试将其解析为消息。如果失败,它将显示数据 作为字符串或十六进制转储。它会犯错误,尤其是小的错误。在
它按照字段在 电线,所以它对那些想熟悉的人很有用 除了逆向工程之外,wire format或解析器开发人员。在
使用
您可以使用pip安装:
pip install protobuf-inspector
这将安装protobuf_inspector
命令。快跑,喂那个小家伙
在stdin上:
在阅读了blob的第一个(盲)分析之后,通常开始定义 一些字段,这样protobuf inspector可以更好地解析您的blob,直到您得到 你有一个完整的protobuf定义而解析器不再有 猜猜看。在
Read about defining fields here.
分析错误
如果发现解析错误,解析将停止该字段内的,但是 在层次结构的外部不受影响。堆栈跟踪将 在字段内容所在的位置打印,并用十六进制转储指示位置 解析在该块中停止(如果适用)。在
因此,如果您指定了uint32
,并且发现了一个更大的变量,您将得到如下结果:
如果指定某个字段包含嵌入消息,但无效数据 在那里找到,你会得到:
请注意,如果一个或多个解析,main.py
将以非零状态退出
出现错误。在
诡计
在接近水滴时,您可以使用一些技巧来节省时间:
- 在
如果您确定变量不使用zig-zag编码,但是仍然 不确定签名,保留为
在varint
。如果它真的使用之字形编码, 除非确定它是32位而不是64位,否则请使用sint64
。在 - 在
如果一个块被错误地识别为
在packed chunk
或嵌入消息, 或者,如果您看到解析后的消息有什么奇怪的地方,希望看到原始字节, 指定bytes
类型。相反,如果因为某种原因没有被检测到 作为一个嵌入的消息,它应该强制它message
来查看原因。在 - 在
如果要将块的原始数据提取到文件中以更好地分析它,请指定 类型
在dump
和protobuf inspector将创建dump.0
,dump.1
, 每次找到匹配的斑点。在 - 在
protobuf inspector将blob解析为
root
类型的消息,但这只是一个 违约。如果定义了许多消息类型,则可以将类型名作为 可选参数,protobuf inspector将使用该参数而不是root
:
在protobuf_inspector request < my-protobuf-blob
程序访问
简单示例:
fromprotobuf_inspector.typesimportStandardParserparser=StandardParser()withopen('my-blob','rb')asfh:output=parser.parse_message(fh,"message")print(output)
不过,这个项目最初并不是为图书馆而设计的,
它的API可能会改变。对于更复杂的例子,
请参见protobuf_inspector/__main__.py
。在
- 项目
标签: