我正在尝试编写一个 yara 签名集合,这些签名将根据其创建的工件标记 zip 文件。
我知道EOCD有一个神奇的数字0x06054b50,它位于存档结构的末尾。它有一个可变长度的注释字段,最大长度为 0xFFFF,因此 EOCD 最多可以达到 0xFFFF+ ~20 字节。但是,zip 结构之后可能会有数据可能会抛弃任何偏移相关扫描。
有没有办法在不扫描整个文件以查找魔术字节的情况下找到记录?如果 EOCD 之后可以有数据,您如何验证魔术字节是否巧合不存在?
这通常是通过从文件末尾向后扫描直到找到 EOCD 签名来完成的。是的,可以在注释中找到嵌入的相同签名,因此您需要检查EOCD记录的其他部分,以查看它们是否与您正在阅读的文件一致。
例如,如果 EOCD记录不在文件末尾,则 EOCD 中的comment length
字段不能为零。它应与文件中剩余的字节数匹配。
同样,如果这是单个磁盘存档,则offset of start of central directory
需要指向 zip 存档大小范围内的某个位置。如果要跟踪该偏移量,则应找到中央目录记录的签名。
等等。
请注意,我忽略了Zip64
记录和加密记录的复杂性,但原理是相同的。您需要检查记录中的字段是否与正在读取的文件一致。