You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于filetype.py,通过文件头字节检测Protobuf的可行性咨询

实现Protobuf二进制文件检测的可行性与方案

当然可以通过分析文件头部字节来实现Protobuf二进制格式的检测!虽然Protobuf不像GZIP那样有固定的魔数(比如GZIP的1f 8b),但它的二进制编码有自己可识别的特征,完全可以基于这些特征在filetype.py中新增检测逻辑。

Protobuf二进制编码的核心特征

Protobuf的二进制数据是由一系列键值对构成的,每个键的前3位表示字段类型(比如0代表Varint、2代表长度限定型),剩下的位是字段编号(用Varint编码)。所以绝大多数Protobuf文件的开头会符合这些模式:

  • 第一个字节通常是0x08(字段编号1+Varint类型)、0x10(字段编号2+Varint类型)、0x1a(字段编号3+长度限定型)这类值——毕竟字段编号一般从1开始,Varint和长度限定型是最常用的字段类型。
  • 紧跟的字节会符合Varint编码规则(最高位为1表示后续还有字节,为0表示结束),或者是长度限定型的字段长度值。

基于filetype.py的具体实现步骤

filetype.py的核心逻辑就是匹配文件头部的字节模式,你可以按照下面的步骤新增Protobuf检测:

  1. 定义Protobuf类型匹配规则
    先定义一个Protobuf的类型对象,指定它的MIME类型、扩展名,以及需要匹配的头部字节模式:

    import filetype
    
    # 定义Protobuf类型,覆盖常见的开头场景
    protobuf_type = filetype.Type(
        mime='application/protobuf',
        ext='protobin',
        patterns=[
            b'\x08', b'\x10', b'\x18', b'\x20',  # 字段编号1-4,Varint类型开头
            b'\x1a', b'\x2a', b'\x3a', b'\x4a',  # 字段编号1-4,长度限定型开头
        ]
    )
    
  2. 注册自定义类型
    把这个新定义的类型注册到filetype的检测体系中,这样工具在检测文件时就会检查这些模式:

    filetype.add_type(protobuf_type)
    
  3. 进阶优化(可选)
    如果需要更高的检测准确性,可以在匹配到开头字节后,进一步验证后续的字节是否符合Protobuf的编码规则。比如检查Varint的结构是否合法,或者尝试解析一个简单的字段来确认这确实是Protobuf数据,避免误判其他类似开头的二进制文件。

小提示

  • 如果你有自定义的Protobuf文件(比如开头加了自定义魔数),可以直接把对应的魔数字节添加到patterns列表里,针对性检测。
  • 为了减少误判,可以结合文件长度检查——Protobuf消息一般不会只有1-2个字节,所以可以在检测时先判断文件大小是否符合基本要求。

内容的提问来源于stack exchange,提问作者lony

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:07:23