【问题标题】:Detecting FAT directory entries检测 FAT 目录条目
【发布时间】:2014-11-19 04:00:58
【问题描述】:

在尝试对闪存驱动器进行数据恢复时,我正在尝试编写一个可以搜索 FAT 目录条目的工具。由于我不能依靠 FAT 来告诉我去哪里看,我正在对驱动器扇区进行简单扫描(实际上是驱动器的图像转储)。

问题是我找不到任何有关如何检测扇区/群集是否包含 FAT 目录条目的信息。我知道structure of a directory entry,但不知道如何检测一堆给定字节是否实际上包含一个。

查找子目录的开始非常简单,因为您可以在字节 0x00 处搜索 .,在字节 0x20 处搜索 ..,但这仅对子目录,不是后续扇区,也不是根目录或其他位置的子目录碎片。

我尝试使用日期范围、文件大小、集群范围、无效文件名字符作为粗略的指导,但当然,这不太可靠。

如果我在磁盘编辑器中打开图像并按住 PgDn 键,我的大脑可以检测到包含有效目录条目的扇区何时通过我的视野,但这怎么可能在程序中实施?有没有办法检测 FAT 目录项?

【问题讨论】:

  • 是的,我都看过(事实上,我的问题的唯一链接是您链接到的维基百科页面)。也没有说任何关于识别标记的事情,只是布局。没有理由不能将随机的一堆字节解释作为目录条目。我正在尝试确定是否有办法确定它是否是有效目录条目。
  • 看看tavi.co.uk/phobos/fat.html ,即“文件属性”部分,它说 0x10 '该条目描述了一个子目录。'
  • 这表明所指向的特定条目是一个子目录,但它没有说明条目本身。它可能是 0x10 偶然,并且作为 FAT 目录条目完全无效。

标签: data-structures directory detection fat


【解决方案1】:

您不可能完美地识别目录条目,但您应该能够通过使用一些简单的启发式方法获得合理的结果。

正如您所说,您可以从在偏移量 0x00 处查找 . 字符开始。如果不存在,那么该条目肯定不是目录。

如果是目录条目,则设置文件属性的第 4 位(偏移量 0x0B)。如果未设置该位,那么它绝对不是目录。此外,文档说永远不会为磁盘设备设置第 6 位。因此,如果设置了第 6 位,则几乎可以肯定它不是有效的 FAT 条目。虽然要小心,因为 0x0F 的值表示 VFAT 长文件名条目。

0x0E 处的两个字节是创建时间。如果解码小时 > 23,或解码分钟 > 59,或解码秒 > 29,则您可以将其视为可疑。它可能是一个目录条目,有人乱用或以某种方式损坏,但这不太可能。

0x14 处的访问权限表示必须将第 12-15 位设置为 0。如果设置了这些位中的任何一个,则认为这是可疑的。

0x1C 处的四个字节给出了文件大小。对于目录条目,这些应该是 0。如果不是,请认为这是可疑的。

该结构中似乎还有其他此类迹象。您需要做的是让您的代码识别出它可以识别的代码,然后根据证据做出决定。它不会是 100% 正确的(即你可能会欺骗它),但我怀疑它会非常好。

【讨论】:

  • If it's not there, then the entry is definitely not a directory. 就像我说的,它只标识一个目录的 start。目录可以分段,后续分段不会包含扇区开头的目录。 (就此而言,即使是未分段的目录也不会包含该目录第一个扇区之后的内容。)
猜你喜欢
  • 2011-12-30
  • 2010-11-26
  • 2020-09-15
  • 2019-01-09
  • 2011-05-28
  • 2012-01-20
  • 2011-12-03
  • 1970-01-01
相关资源
最近更新 更多