NTFS 从 RAW 定位并读取 $MFT

NTFS locate and read $MFT from RAW

我目前正在尝试以编程方式从我的硬盘驱动器的原始数据中解析 MFT,以便枚举具有特定扩展名的所有文件(在非常短的时间内)。

我正在按照该教程指导自己:A Programmers View of Raw Filesystem Data Extraction

我已经使用 CreateFileA 成功打开了 \.\PhysicalDrive0,而且我确实找到了 Windows 分区的第一个扇区,我在其中找到了 BPB.

我的问题是我无法正确找到 MFT

如上所示(我的Windows分区第一个扇区的原始数据),MFT的逻辑簇号等于0x56a6.

然后我计算出每个簇的扇区数是 0x20 (0x20 * 512 = 0x4000 bytes)

所以逻辑上 MFT 的偏移量 0x4000 * 0x56a6 等于 0x15a98000.

当我寻找那个偏移量并检索前 512 个字节时,我没有看到应该以 FILE 开头的预期数据(我只看到一些随机字节)。

我也试过不从分区的第一个扇区寻找,而是从硬盘驱动器的一个扇区寻找,但它也不起作用(我想这是正常的)。

我想我错过了什么,但我不知道是什么。

希望我说得足够清楚,如果您需要更多详细信息和信息,我会提供。

谢谢。

根据文档中NTFS_BOOT_SECTOR结构体的定义,uchSecPerClust的偏移量为3 + 4 + 4 + sizeof(WORD)= 0x0D。(忽略字节对齐)

或者您可以使用包含驱动器信息的 DeviceIoControl with the IOCTL_DISK_GET_DRIVE_GEOMETRY control code to fill a DISK_GEOMETRY 结构:

https://docs.microsoft.com/en-us/windows/win32/devio/calling-deviceiocontrol

另一个有用的控制代码:FSCTL_ENUM_USN_DATA