主要出于学术原因,我一直在学习如何从 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
从簇编号 29,833,464 开始的 2 个簇
21
02
c5 07
另外 2 个簇,从 29,833,464 开始,即簇编号 29,835,453,从 1,989
31
04
83 43 01
开始 另外 4 个簇,从 29,835,453 开始,即簇编号 29,918,272,从 82,819
21
08
c0 fc
开始 另外 8 个簇,从 832 开始早于29,918,272,即集群#29,917,440
31
10
44 0b 00
从 29,917,440 开始的另外 16 个集群,即集群#29,920,324
这是我的数学与他们的数学不同的地方。他们说集群编号为 29,840,452。我需要帮助。
31
01
f7 ef f9
21
1f
c6 e7
21
10
6b 28
31
01
00 52 e4
如果某个字段中有前导零,那么数学运算该如何进行?我还有一个单独的示例,其中前导零位于“群集计数”字段中,而不是“第一个群集”字段中;这有什么不同吗?
答案1
31 10 44 0b 00,从 29,917,440 开始还有 16 个簇,从 2,884 开始,即簇 # 29,920,324 这就是我的计算与他们的计算有偏差的地方。他们说簇 # 29,840,452。我需要帮助
不是你的数学错了,是视频里演示的人错了,或者至少忽略了一个重要问题:
他稍微作弊了一下,他只是从解释值从左边的列中,就好像他正在“动态”转换他突出显示的值。
但他的得力助手已经转换后的值考虑到更新序列数组他没有提及并指出这一点。
更新序列数组和修复值
您遇到问题的运行是不是 31 10 44 0b 00
如果我们仔细观察视频中的字节序列,我们会发现运行的最后两个字节是 512 字节扇区的最后两个字节:
因此 0b 00 是不是属于此运行的两个字节,即“修复”。要获取实际值,您需要从所谓的“更新序列数组”中读取它们,该数组的偏移量存储在 MFT 条目中的字节偏移量 4 处(通常为 0x30)。
在偏移量 0x30 处,您将看到字节 0b 00(修复值),接下来的两个字节将是 MFT 条目的第一个扇区的最后两个字节的原始值,接下来的两个字节将是下一个扇区的最后两个字节的原始值。
我将使用我的驱动器中的 MFT 条目来说明:
所以31 10 44 0b 00
实际上是31 10 44 xx xx
用更新序列数组中的字节替换 xx,然后进行计算。
修复值的目的是检测损坏。因此,一旦我们读取 MFT 条目,我们就会检查修复值并将其与每个扇区的最后 2 个字节进行比较,它们应该匹配,如果不匹配,则该扇区已损坏。然后,要实际使用该条目,我们需要先使用更新序列数组中的值来更正修复值。
由于这些字段被解释为小端字节序,并且由于这是一个灵活长度的字段(标志表示有多少个字节),那么为什么会有前导零?
老实说,我一点概念都没有。当我研究这个的时候,我是为了编写一个 NTFS 文件恢复程序(除此之外,我最近重新发现了它的源代码,并重新编译以查看它是否还能运行)。它做了!
无论如何,重点是,当我弄清楚数据运行后,我再也没有仔细查看过这些运行,因为我编写了代码来处理它们。
但是,是的,你是对的。我再次打开自己的硬盘,得到了以下条目:
因此我们得到:
31 - 38 - 12 39 09
43 - 76 2B 01 - 42 77 BB 03
43 - A7 82 01 - 91 14 D6 00 <<
33 - DC D1 01 - 5B 2B FE
33 - D9 E4 01 - A2 B3 FD
etc ..
就我所见,<< 零确实没有任何区别。事实上,如果我们要求 DMDE 解释运行列表,它也会忽略零:
参考:https://flatcap.github.io/linux-ntfs/ntfs/concepts/file_record.html