通过偏移定位 ZIP 文件中的 EOCD

Locating EOCD in ZIP files by offset

我正在尝试编写一组 yara 签名,这些签名将根据创建的工件标记 zip 文件。

我知道 EOCD 有一个幻数 0x06054b50,它位于存档结构的末尾。它有一个可变长度的注释字段,最大长度为 0xFFFF,因此 EOCD 可以达到 0xFFFF+ ~20 字节。但是,在 zip 结构之后可能会有数据可以摆脱任何依赖于偏移量的扫描。

有什么方法可以在不扫描整个文件寻找魔法字节的情况下定位记录?如果在 EOCD 之后可以有数据,您如何验证魔法字节不是巧合?

这通常是通过从文件末尾向后扫描直到找到 EOCD 签名来完成的。是的,有可能在评论中找到相同的签名,所以你需要检查EOCD记录的其他部分,看看它们是否与你正在阅读的文件一致。

例如,如果 EOCD 记录不在文件末尾,则 EOCD 中的 comment length 字段不能为零。它应该与文件中剩余的字节数相匹配。

同样,如果这是单个磁盘存档,offset of start of central directory 需要指向 zip 存档大小内的某个位置。如果您想遵循该偏移量,您应该找到中央目录记录的签名。

以此类推

请注意,我忽略了Zip64记录和加密记录的复杂性,但原理是一样的。您需要检查记录中的字段是否与正在读取的文件一致。