主要出于学术原因,我一直在学习如何从 NTFS 卷的 MFT 记录的数据属性块解释集群链运行。
我观看了一个演示示例的视频。这是例子:
旗帜| 簇数 | 第一个集群
41
02
f8 38 c7 01
21
02
c5 07
31
04
83 43 01
21
08
c0 fc
31
10
44 0b 00
31
01
f7 ef f9
21
1f
c6 e7
21
10
6b 28
31
01
00 52 e4
现在,视频显示了一些正在解释十六进制输出的磁盘编辑软件。这很有帮助,因为视频的作者完全跳过了至少 3 个基本概念:
- “第一簇”字段是累积的。如果您使用计算器,很容易弄清楚。
- “第一个簇”字段是一个有符号整数,以便它可以在磁盘上向后导航。这很难弄清楚,但我明白了。
- 第三个完全被忽略的概念是当“第一簇”字段的最低有效字节为零时。由于这些字段被解释为小端字节序,并且这是一个灵活长度字段(标志表示有多少字节),那么为什么会有前导零呢?
所以,这就是我的计算方法。
旗帜| 簇数 | 第一个集群
41
02
f8 38 c7 01
2 个集群,从集群 # 29,833,464 开始 另有
21
02
c5 07
2 个集群,从 29,833,464 开始,从 1,989 开始,即集群 # 29,835,453
31
04
83 43 01
又有 4 个集群,从 29,835,453 开始,从 82,819 开始,即集群 # 29,918,272 又有
21
08
c0 fc
8 个集群,从 832 开始,早于29,918,272,这是集群#29,917,440
31
10
44 0b 00
16更多集群从 29,917,440 开始,从 2,884 开始,即集群 # 29,920,324
这是我的数学与他们的数学不同的地方。他们说集群#29,840,452。我这里需要帮助。
31
01
f7 ef f9
21
1f
c6 e7
21
10
6b 28
31
01
00 52 e4
当某一字段中有前导零时,数学如何进行?我还有一个单独的示例,其中前导零位于“簇计数”字段中,而不是“第一个簇”字段中;待遇有什么不同吗?”
这不是你的数学错了,而是视频中演示的那个人错了,或者至少忽略了一个重要问题:
他做了一点作弊,他只是从左侧列的解释值中读取值,就好像他正在即时转换他突出显示的值一样。
但他方便的转换值考虑了他没有提到的更新序列数组。
更新序列数组和修正值
您遇到问题的运行不是
31 10 44 0b 00
. 如果我们仔细观察视频中的字节序列,我们会看到运行的最后两个字节是 512 字节扇区中的最后两个字节:因此 0b 00 不是属于本次运行的两个字节,它是“修复”。要获取实际值,您需要从所谓的“更新序列数组”中读取它们,该数组的偏移量存储在 MFT 条目中的字节偏移量 4 处(通常为 0x30)。
在偏移 0x30 处,您将看到字节 0b 00(修复值),接下来的两个字节将是 MFT 条目第一个扇区的最后两个字节的原始值,接下来的 2 个字节是下一个扇区的原始值。
我将使用驱动器中的 MFT 条目进行说明:
实际上
31 10 44 0b 00
,31 10 44 xx xx
您可以将 xx 替换为更新序列数组中的字节,然后进行数学计算。修复值的目的是检测损坏。因此,一旦我们读取 MFT 条目,我们就会检查修复值并将其与每个扇区的最后 2 个字节进行比较,如果扇区没有损坏,它们应该匹配。然后,为了实际使用该条目,我们需要首先使用更新序列数组中的值来纠正修正值。
老实说,我还没有最模糊的想法。在我研究这个的时候,我这样做是为了编写一个NTFS文件恢复程序(另外,我最近重新发现了它的源代码并重新编译以查看是否仍然可以运行。它确实可以运行!)
不管怎样,重点是,当我弄清楚数据运行时,我再也没有仔细查看过这些运行,因为我编写了代码来处理它们。
但是,是的,你是对的。我再次转向我自己的硬盘并得到以下条目:
所以我们得到:
事实上,据我所知,<< 零没有任何区别。事实上,如果我们要求 DMDE 解释运行列表,它也会忽略零:
参考:https://flatcap.github.io/linux-ntfs/ntfs/concepts/file_record.html