通过偏移定位 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
记录和加密记录的复杂性,但原理是一样的。您需要检查记录中的字段是否与正在读取的文件一致。
我正在尝试编写一组 yara 签名,这些签名将根据创建的工件标记 zip 文件。
我知道 EOCD 有一个幻数 0x06054b50,它位于存档结构的末尾。它有一个可变长度的注释字段,最大长度为 0xFFFF,因此 EOCD 可以达到 0xFFFF+ ~20 字节。但是,在 zip 结构之后可能会有数据可以摆脱任何依赖于偏移量的扫描。
有什么方法可以在不扫描整个文件寻找魔法字节的情况下定位记录?如果在 EOCD 之后可以有数据,您如何验证魔法字节不是巧合?
这通常是通过从文件末尾向后扫描直到找到 EOCD 签名来完成的。是的,有可能在评论中找到相同的签名,所以你需要检查EOCD记录的其他部分,看看它们是否与你正在阅读的文件一致。
例如,如果 EOCD 记录不在文件末尾,则 EOCD 中的 comment length
字段不能为零。它应该与文件中剩余的字节数相匹配。
同样,如果这是单个磁盘存档,offset of start of central directory
需要指向 zip 存档大小内的某个位置。如果您想遵循该偏移量,您应该找到中央目录记录的签名。
以此类推
请注意,我忽略了Zip64
记录和加密记录的复杂性,但原理是一样的。您需要检查记录中的字段是否与正在读取的文件一致。