具有未知定义的反向工程协议缓冲区的工具

protobuf-inspector的Python项目详细描述


原型检查员

可以解析Google Protobuf编码的blob的简单程序 (第2版或第3版)不知道其附带的定义。 它将打印一个漂亮的,彩色的内容表示。示例:

Main screenshot

正如您所看到的,字段名显然丢失了 一些高级细节,例如:

  • 变量是否使用zig-zag encoding(默认情况下将假定没有锯齿形)
  • 32位/64位值是整数还是浮点(默认情况下都显示)
  • 签名(默认情况下自动检测)

但是protobuf inspector能够正确猜测消息结构 大多数时候。当它在字段上找到嵌入的二进制数据时,它将 首先尝试将其解析为消息。如果失败,它将显示数据 作为字符串或十六进制转储。它会犯错误,尤其是小的错误。在

它按照字段在 电线,所以它对那些想熟悉的人很有用 除了逆向工程之外,wire format或解析器开发人员。在

使用

您可以使用pip安装:

pip install protobuf-inspector

这将安装protobuf_inspector命令。快跑,喂那个小家伙 在stdin上:

^{pr2}$

在阅读了blob的第一个(盲)分析之后,通常开始定义 一些字段,这样protobuf inspector可以更好地解析您的blob,直到您得到 你有一个完整的protobuf定义而解析器不再有 猜猜看。在

Read about defining fields here.

分析错误

如果发现解析错误,解析将停止该字段内的,但是 在层次结构的外部不受影响。堆栈跟踪将 在字段内容所在的位置打印,并用十六进制转储指示位置 解析在该块中停止(如果适用)。在

因此,如果您指定了uint32,并且发现了一个更大的变量,您将得到如下结果:

Error on invalid varint

如果指定某个字段包含嵌入消息,但无效数据 在那里找到,你会得到:

Error on invalid message

请注意,如果一个或多个解析,main.py将以非零状态退出 出现错误。在

诡计

在接近水滴时,您可以使用一些技巧来节省时间:

  1. 如果您确定变量不使用zig-zag编码,但是仍然 不确定签名,保留为varint。如果它真的使用之字形编码, 除非确定它是32位而不是64位,否则请使用sint64。在

  2. 如果一个块被错误地识别为packed chunk或嵌入消息, 或者,如果您看到解析后的消息有什么奇怪的地方,希望看到原始字节, 指定bytes类型。相反,如果因为某种原因没有被检测到 作为一个嵌入的消息,它应该强制它message来查看原因。在

  3. 如果要将块的原始数据提取到文件中以更好地分析它,请指定 类型dump和protobuf inspector将创建dump.0dump.1, 每次找到匹配的斑点。在

  4. 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。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用增强的forloop从两个ArrayList检索数据   如何在安卓 java中设置双精度3范围零   java PostgreSQL+Openshift:对于给定的数据库URL,可能是错误的驱动程序?   使用war时IBM Liberty(WLP)中的java组到角色映射   java Android league应用程序不断崩溃   Java错误仅允许对参数进行非法修改   为什么“enum”的实例字段在java中是“enum”?   java无法引用TextView   java SimpleJdbcInsert未在默认模式的表中插入数据   多线程Java多线程共享一个全局映射变量   java如何从WebView获取HTML内容进行打印?   JavaLibGDX:如何更改单个精灵的颜色?   测试Java程序退出函数不工作   欺骗HWID欺骗程序Java