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