在尝试数据恢复闪存驱动器时,我正在尝试编写一个可以搜索FAT目录条目的工具。由于我无法依靠FAT告诉我在哪里查看,我正在对驱动器扇区进行简单扫描(实际上是驱动器的图像转储)。
问题是我找不到有关如何检测扇区/群集是否包含FAT目录条目的任何信息。我知道structure of a directory entry,但不知道如何检测一堆给定的字节是否真的包含一个。
查找子目录的 start 非常简单,因为您只能在字节0x00处搜索.
而在字节0x20处搜索..
,但这仅对子目录的第一个扇区,不是后续扇区,也不是其他位置的根目录或子目录片段。
我尝试使用日期范围,文件大小,群集范围,无效的文件名字符作为粗略指南,但当然,这不太可靠。
如果我在磁盘编辑器中打开图像并按住 PgDn 键,我的大脑可以检测到包含有效目录条目的扇区何时通过我的视野,但这怎么可能在程序中实现?有没有办法检测FAT目录条目?
答案 0 :(得分:0)
您不太可能完美地识别目录条目,但您应该能够通过使用一些简单的启发式方法获得合理的结果。
正如您所说,您可以首先在偏移量0x00处查找.
字符。如果它不存在,则该条目绝对不是目录。
如果是目录条目,则设置文件属性的第4位(偏移量0x0B)。如果未设置该位,则它绝对不是目录。此外,文档说永远不会为磁盘设备设置第6位。因此,如果设置了第6位,那么它几乎肯定不是有效的FAT条目。虽然要小心,因为值0x0F指定一个VFAT长文件名条目。
0x0E处的两个字节是创建时间。如果解码的小时数> 23,或解码的分钟数> 59,或解码秒> 29,那么你可以将其视为可疑。 可能是一个目录条目,有人捣乱或以某种方式损坏,但它不太可能。
0x14处的访问权限表示必须将12-15位设置为0.如果设置了这些位中的任何一位,请将其视为可疑。
0x1C处的四个字节给出文件大小。对于目录条目,应该为0。如果不是,请认为它是可疑的。
似乎该结构中还有其他此类迹象。您需要做的是让您的代码识别出可能的代码,然后根据证据做出决定。它不是100%正确(即你可以愚弄它),但我怀疑它会很好。