基于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检测:
定义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,长度限定型开头 ] )注册自定义类型
把这个新定义的类型注册到filetype的检测体系中,这样工具在检测文件时就会检查这些模式:filetype.add_type(protobuf_type)进阶优化(可选)
如果需要更高的检测准确性,可以在匹配到开头字节后,进一步验证后续的字节是否符合Protobuf的编码规则。比如检查Varint的结构是否合法,或者尝试解析一个简单的字段来确认这确实是Protobuf数据,避免误判其他类似开头的二进制文件。
小提示
- 如果你有自定义的Protobuf文件(比如开头加了自定义魔数),可以直接把对应的魔数字节添加到
patterns列表里,针对性检测。 - 为了减少误判,可以结合文件长度检查——Protobuf消息一般不会只有1-2个字节,所以可以在检测时先判断文件大小是否符合基本要求。
内容的提问来源于stack exchange,提问作者lony
相关产品推荐
相关产品推荐

