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
我目前正在尝试以编程方式从我的硬盘驱动器的原始数据中解析 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