改进暴力破解 DEFLATE 块位置的启发式方法

问题描述 投票:0回答:1

我从事数据恢复行业。有时,文档 (.docx) 的开头被覆盖,但文件的大部分内容可能仍然完好无损。 “docx”实际上只是一个 zip 文件,主要文档存储在文件“word/document.xml”中。

一个文档可以被压缩成多个 deflate 块,因此即使开头被覆盖,如果我们只能找到后面的块,它们也可能是可以挽救的。该计划将采用强力方式,尝试在每个位位置解码流。例如,200k 文件意味着尝试解码最多 1.6 兆位次(给予或接受)。

一个有用的事情是块永远不应该以“011”或“111”开头,因为第 2 和 3 位只能是 00、01 或 10(我相信)。这样就淘汰了很多候选人。

还有其他线索可以用来淘汰候选人吗?我们可以假设一个“标准”流,没有奇怪的编码,因为它来自 Microsoft Word。

ms-word zip compression deflate data-recovery
1个回答
0
投票

zlib 的 inflate 会在遇到所有被排除的模式时自动排除它们。例如,动态块头中有几个约束,如果违反,将立即检测到。类似地,将立即检测到存储的块长度的不匹配。存在无效的固定哈夫曼码,会出现在几百字节以内的随机数据中,一遇到就会被检测到。此外,您的无效块类型(3)将立即被检测到。

您不需要自己实施任何特殊规则。 zlib 会检测到它们。

正如评论中所指出的,即使您找到了块的第一位,您也会遇到对该块之前的未压缩数据的引用。你只需要继续前进,直到你希望到达那些你都没有的地方。尽管从文件的开头到结尾,完全有可能继续引用同一个字符串。除非您可以从上下文中正确猜测该字符串是什么,否则压缩数据是不可恢复的。

© www.soinside.com 2019 - 2024. All rights reserved.