简单的程序,可以解析 Google Protobuf 编码的 blob(版本 2 或 3),而无需知道其附带的定义。它将打印出其内容的漂亮的彩色表示。例子:
正如您所看到的,字段名称以及一些高级详细信息显然丢失了,例如:
但 protobuf-inspector 大多数时候都能正确猜测消息结构。当它发现字段上嵌入的二进制数据时,它会首先尝试将其解析为消息。如果失败,它会将数据显示为字符串或十六进制转储。它可能会犯错误,尤其是小块时。
它仅按照字段在线路中编码的顺序显示字段,因此除了逆向工程之外,它对于那些想要熟悉线路格式或解析器开发人员的人也很有用。
您可以使用 pip 安装:
pip install protobuf-inspector
这将安装protobuf_inspector
命令。运行它,在 stdin 上提供 protobuf blob:
protobuf_inspector < my-protobuf-blob
在阅读完 blob 的第一次(盲)分析后,您通常会开始定义一些字段,以便 protobuf-inspector 可以更好地解析您的 blob,直到您拥有完整的 protobuf 定义并且解析器不再需要猜任何东西。
在此处阅读有关定义字段的信息。
如果发现解析错误,解析将在该字段内停止,但在层次结构外部将继续进行,不受影响。堆栈跟踪将打印在字段内容所在的位置,以及指示该块中解析停止位置的十六进制转储(如果适用)。
因此,如果您指定了uint32
并且找到了更大的 varint,您会得到类似以下内容的信息:
如果您指定某个字段包含嵌入消息,但在那里发现了无效数据,您将得到:
请注意,如果发生一个或多个解析错误, main.py
将以非零状态退出。
在接近斑点时,您可以使用一些技巧来节省时间:
如果您确定 varint不使用 zig-zag 编码,但仍不确定符号性,请将其保留为varint
。如果它确实使用 zig-zag 编码,请使用sint64
除非您确定它是 32 位而不是 64 位。
如果一个块被错误地识别为packed chunk
或嵌入消息,或者如果您在解析的消息中看到一些奇怪的东西并且想要查看原始字节,请指定bytes
类型。相反,如果由于某种原因它没有被检测为嵌入消息(而它应该被检测到),则强制它发送message
以查看原因。
如果您想将块的原始数据提取到文件中以便更好地分析它,请指定dump
类型,protobuf-inspector 每次找到匹配的 blob 时都会创建dump.0
、 dump.1
等。
protobuf-inspector 将 blob 解析为root
类型的消息,但这只是默认值。如果定义了很多消息类型,则可以传递类型名称作为可选参数,protobuf-inspector 将使用它而不是root
:
protobuf_inspector request < my-protobuf-blob
简单的例子:
from protobuf_inspector . types import StandardParser
parser = StandardParser ()
with open ( 'my-blob' , 'rb' ) as fh :
output = parser . parse_message ( fh , "message" )
print ( output )
不过,该项目最初并不是为用作库而设计的,并且其 API 可能会发生变化。有关更复杂的示例,请参阅protobuf_inspector/__main__.py
。