我正在寻找一种高级方法来读取 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)处找到文件的开头。