如何读取 USB 硬盘(NTFS,1TB)上的 MFT?

如何读取 USB 硬盘(NTFS,1TB)上的 MFT?

我正在寻找一种高级方法来读取 Seagate 1TB 内置硬盘的 NTFS 文件系统上的 MFT 条目。平台是 Windows 7。

我需要获取文件名、块大小和 LBA。

这是一项专门的任务吗?我需要编写程序来完成它吗?

答案1

这些信息可通过碎片整理 API。第三方碎片整理工具可能会暴露它。在最近的 Windows 系统上(8.1 可用,7 未测试),您可以使用fsutil它来查询它:

目录:\>fsutil 文件查询范围例子.txt
VCN:0x0 集群:0x2 LCN:0x18f85e

还有另一个子命令可以转储全部文件中所有数据流的信息:

目录:\>fsutil 卷文件布局示例程序

********* 文件 0x01390000000008dd *********
文件参考编号:0x01390000000008dd
文件属性:0x00000020:存档
...
流:::$FILE_NAME
    属性:0x00000000:*无*
    标志:0x0000000c:常驻 | 未分配集群
    尺寸 :80
    分配大小:80
流:::$DATA (主数据流)
    属性:0x00000000:*无*
    标志:0x00000000:*无*
    尺寸:1681920
    分配大小:1683456
    范围:1 范围
                        :1:VCN:0 集群:411 LCN:8527618

在两个命令的输出中,对于每个“范围”(连续的簇范围),您可以获得“虚拟簇号”(从文件开头的偏移量)、范围内的簇数和“逻辑簇号”(从卷开头的偏移量)。

笔记:小文件,适合 MFT 基础记录存储(“常驻”)在其 MFT 记录中并且将具有零范围。对于这些,您需要使用其他方式挖掘 MFT 本身。(此外,在某些情况下,文件可能并且只有一小部分分配在磁盘上;其余部分则被假定为空字节。)

集群是文件系统级别的,因此你需要将它们转换为块设备级扇区;我的系统每个簇有 8 个扇区:

目录:\>fsutil fsinfo ntfsinfo c:
...
每扇区字节数:512
每簇字节数:4096
...

目录:\>设置/a 0x18f85e * (4096 / 512)
13091568

目录:\>设置/a 0x18f85e * 4096
6702882816

这意味着您可以\\.\C:使用 HxD 或类似程序打开,并在扇区 13091568(或字节 6702882816)处找到文件的开头。

相关内容