前言

本节我们将了解 NTFS 格式分区的结构、引导扇区、以及元文件 $MFT

你可以在 https://winhex.im0o.top/ 中查看所有例题文件

知识点总览

  • NTFS 文件系统的大致结构
  • NTFS 文件系统的 DBR 恢复
  • NTFS 文件系统的元文件 $MFT

NTFS 文件系统的结构

概述

NTFS 文件系统与 FAT32 文件系统一样,都是以为基本单位对磁盘空间和文件存储进行管理。一个文件总是占有若干个簇,即使在最后一个簇没有完全使用完的情况下,也会占用整个簇的空间。

image-20211027090228717

这也能解释为何文件的占用空间总是大于文件大小,也是造成磁盘空间浪费的主要原因。

文件系统通过簇来管理磁盘,并不需要知道磁盘扇区的大小,这样就使 NTFS 保持了与磁盘扇区大小的独立性,从而使不同大小的磁盘选择合适的簇。

簇的大小与卷大小的关系

在 NTFS 文件系统中,当一个簇占用的空间太小时,会出现太多的磁盘碎片,这样在空间和访问文件的时间会造成浪费;而相反的当一个簇占用的空间太大时,直接造成了磁盘空间的浪费。因此,最大限度地优化系统对文件的访问速度和最大限度地减少磁盘地浪费是确定簇大小地主要因素。簇地大小一定是扇区大小地整数倍,通常是 2^n(n 为整数)。

下表为 NTFS 文件系统中不同卷地大小和簇地一般关系(大都数情况下都是这样,并不是完全一定的,为系统格式化磁盘地默认情况)

卷大小(MB) 每簇扇区数 默认簇大小
≤512 1 512 字节
513~1024 2 1024 字节(1KB)
1025~2048 4 2048 个字节(2KB)
≥2049 8 4KB

通常情况下,只要分区大于 2GB,每簇扇区数为 8

DBR 引导扇区

和 FAT 文件系统一样,NTFS 的第一个扇区为引导扇区,即 DBR 扇区。其中有 NTFS 分区的引导程序和一些 BPB 参数,系统根据这些 BPB 参数来得到分区的重要信息。如果没有这些信息,分区将不能正常使用。

$BOOT 文件

在 DBR 后 15 个扇区为 NTLDR 区域,这 16 个扇区共同构成了 $BOOT 文件。

$MFT 文件

在 NTLDR 后(不一定是物理上相连的)是主文件表(Master File Table,MFT)区域,主文件表由文件记录构成,每个文件记录占 2 个扇区,文件记录简称为 FR(File Record)。

在 NTFS 文件系统中,文件名、扩展名、建立时间、访问时间、修改时间、文件属性、文件大小、文件在磁盘中所占用的簇等信息称之为属性,各种属性被放入文件记录中进行管理。当一个属性太大,文件记录中存放不下时,就会分配多个文件记录进行存放;而当一个文件非常小时,可能这个文件的所有属性都包含在一个文件记录中了,甚至包括了这个文件的数据,这样做的好处是节约了磁盘空间并提高了文件访问效率。

其他元文件

NTFS 文件系统中的主文件表($MFT)中还记录了一些非常重要的数据,这些数据被称为元数据文件(metadata file),简称为“元文件”,其中包括了用于文件定位和恢复的数据结构、引导程序数据及整个卷的分配位图等信息。

在 NTFS 文件系统中,这样的文件主要有 16 个:

  • $MFT(主文件表,是每个文件的索引)
  • $MFTMirr(主文件表镜像)
  • $LogFile(日志文件)
  • $Volume(卷文件)
  • $AttrDef(属性定义表)
  • $Root(根目录)
  • $Bitmap(位图文件)
  • $Boot(引导文件)
  • $BadClus(坏簇文件)
  • $Secure(安全文件)
  • $UpCase(大写文件)
  • $Extended metadata directory(扩展元数据文件)
    • $Extend\$Reparse(重解析点文件)
    • $Extend\$UsnJrnl(变更日志文件)
    • $Extend\$Quota(配额管理文件)
    • $Extend\$ObjId$(对象 ID 文件)

在这 16 项记录之后就是用户建立的文件和文件夹的记录了。

NTFS 文件系统大致结构

image-20211027143633341

上图的结构只是 NTFS 文件系统的示意图,并不成完全比例;

元文件在图中只体现了一部分,没有画完整,并且除了$BOOT文件以外,其他元文件的位置不是固定的,例如$MFT 文件也可以在$MFTMirr 文件之后。

在 NTFS 文件系统所在分区的最后一个扇区是 DBR 的备份,但该扇区并不属于 NTFS 文件系统。

NTFS 文件系统的 DBR 恢复

NTFS 文件系统的引导扇区是$Boot第一个扇区,它的结构与 FAT 文件系统的 DBR 类似,所以习惯上也称该扇区为 DBR 扇区。DBR 扇区在操作系统的引导过程起着非常重要的作用,如果这个扇区遭到破坏,系统将不能正常启动。

NTFS 文件系统的 DBR 扇区与 FAT 文件系统的结构一样,也包括跳转指令、OEM 代号、BPB 参数、引导程序和结束标志。

NTFS文件系统引导扇区分析

  1. 跳转指令

跳转指令本身 2 字节,它将程序执行流程跳转到引导程序处。例如,当前 DBR 中的“EB 52”,就是代表汇编语言的“JMP 52”。

注意:该指令本身占用 2 字节,计算跳转目标地址时以该指令的下一字节为基准,所以实际执行的下一条指令应该位于 54H。紧接着跳转指令的是一条空指令 NOP(90H)。

  1. OEM 代号

这部分占 8 个字节,其内容有创建该文件系统的 OEM 厂商具体安排。例如,微软的 Windows 系统将此处直接设置为“NTFS”,在 NTFS 文件系统中也称为“文件系统 ID”。

  1. BPB(BIOS Parameter Block,BPB 参数)

BPB 从 DBR 的第 12(0BH 偏移处)个字节开始,到偏移 53H 结束,共占用 73 个字节,记录了有关该文件系统的重要信息。

NTFS文件系统引导扇区分析

(1)0BH ~ 0CH:每扇区字节数

每扇区字节数记录每个逻辑扇区的大小,其常见值为 512 字节,但 512 并不是固定值,该值可以由程序定义,合法值包括 512 字节、1024 字节、2048 字节和 4096 字节。

(2)0DH ~ 0DH:每簇扇区数

每簇扇区数记录着文件系统的簇大小,即由多少个扇区组成一个簇。

如果这个分区是在系统安装前被格式化而来的,一般大于 2GB 的分区每簇默认占用 8 个扇区,也就是每簇大小为 4KB,这个字节的内容就为十六进制值“08”。如果这个分区是由一个 FAT 分区转换而来,则每个簇一般占用 1 个扇区的空间,也就是每簇大小为 512 字节,这个字节的内容就是“01H”。

在 NTFS 文件系统中所有的簇从 0 开始进行编号,每个簇都有一个自己的地址编号,并且从分区的第一个扇区就开始编簇。

(3)0EH ~ 0FH:DBR 保留扇区数

NTFS 文件系统中 DBR 没有保留扇区,该值常为“0000”。

(4)10H ~ 12H:总是 0

这 3 个字节总是“00 00 00”。

(5)13H ~ 14H:未用

这两个字节不用。

(6)15H ~ 15H:介质描述符

这个字节为介质描述字节,一般硬盘为“F8H”;双面 5.25 英寸软盘为“F9H”;双面 3.5 英寸软盘 RAM 虚拟盘为“FAH”;3.5 英寸、1.44MB 的软盘一般为“F0H”。因为 NTFS 分区一定在硬盘上,所以此处常为 16 进制数“F8”。

(7)16H ~ 17H:未用

这两个字节不用。

(8)18H ~ 19H:每磁道扇区数

这是逻辑 C/H/S 中的一个参数,其值一般为 63,NTFS 已经不用此参数。

(9)1AH ~ 1BH:磁头数

这是逻辑 C/H/S 中的一个参数,其值一般为 255,NTFS 已经不用此参数。

(10)1CH ~ 1FH:隐藏扇区数

隐藏扇区数是指本分区之前使用的扇区数,该值与分区表中所描述的该分区的起始扇区号一致。对于主磁盘分区来讲,是 MBR 到该分区 DBR 之间的扇区数;对于扩展分区中的逻辑驱动器来讲,是其 EBR 到该分区 DBR 之间的扇区数。

(11)20H ~ 23H:未用

这 4 字节不用。

(12)24H ~ 27H:未用

这 4 字节不用,但总为 80008000。

(13)28H ~ 2FH:扇区总数

扇区总数是指分区的总扇区数。NTFS 的 BPB 中记录的分区大小比分区表中记录的少一个扇区,因为分区最后一个扇区留给 DBR 备份使用了。

(14)30H ~ 37H:$MFT 的起始簇号

这 8 字节为$MFT 的起始簇号,注意这个位置使用簇号定义的,而不是扇区号,并且该地址不是固定值。

(15)38H ~ 3FH:$MFTMirr 的起始簇号

这 8 字节为$MFTMirr的起始簇号,这个位置也使用簇号定义,而不是扇区号。$MFTMirr 的地址也不是固定值的,可以在$MFT之后,也可以在$MFT 之前。本例中,$MFTMirr的地址就在$MFT 之前。

(16)40H ~ 40H:文件记录的大小描述

这一个字节描述每个文件记录的簇数。注意该参数为带符号数,当其是负数时,说明每个文件记录的大小要小于每簇扇区数,在这种情况下,文件记录的大小用字节数表示,计算方法为:2-1× 每个文件记录的簇数。例如,图 4-401 的 DBR 中该参数值为“F6H”,换算为十进制等于“-10”,所以每个文件记录的大小是 2-1×-10 = 210 = 1024 字节。

(17)41H ~ 43H:未用

这 3 字节不用。

(18)44H ~ 44H:索引缓冲的大小描述

这一个字节描述每个索引缓冲的簇数。注意该参数也是带符号数,当其是负数时,说明每个索引缓冲的大小要小于每簇扇区数,在这种情况下,索引缓冲的大小用字节数表示,计算方法为:2-1× 每个索引缓冲的簇数。

(19)45H ~ 47H:未用

这 3 字节不用。

(20)48H ~ 4FH:卷序列号

这 8 字节为分区的逻辑序列号,也就是在命令行下输入 DIR 命令后显示的一排数据,这个序列号是硬盘格式化时随机产生的。

(21)50H ~ 51H:校验和

BPB 的最后四个字节是其校验和,一般都为 0。

  1. 引导程序

NTFS 的 DBR 引导程序占用 426 字节(54H ~ 1FDH),其负责完成将系统文件 NTLDR 装入。对于一个没有安装操作系统的分区来讲,这段程序没有用处。

  1. 结束标志

DBR 的结束标志与 MBR、EBR 的结束标志都相同,为55 AA

以上 5 个部分共占用 512 字节,正好是 1 个扇区,这个扇区属于$BOOT 文件的组成部分。该部分的内容中除了第 5 部分结束标志是固定不变之外,其余 4 部分都是不完全确定的,都因操作系统版本的不同而不同,也因硬盘的逻辑盘参数的变化而变化。

恢复 NTFS DBR

如果 $BOOT 的第一个扇区(引导扇区)损坏,我们可以进行参数的填写,以恢复 NTFS DBR。

从备份复制

通过解析元文件,计算出分区大小,从 DBR 位置跳转大小后找到该分区的备份,复制备份至 DBR 即可。

手动填写

计算 BPB 参数,进行手工填写跳转指令、BPB 参数、结束标志以恢复 NTFS 分区

从别的 NTFS DBR 复制

在分区大小 ≥2GB 时,我们可以直接复制一个现有的 NTFS DBR 至需要恢复的引导扇区处,修改位置、大小参数(有些需要修改每簇扇区数、MFT、MFTMirr 位置等)即可恢复其 DBR。

NTFS 文件系统的元文件 $MFT

将一个分区格式化为 NTFS 后,格式化程序会往该分区中写入很多重要的系统信息,这些系统信息在 NTFS 文件系统中称为元文件。这些元文件用户是不能访问的,它们的文件名的第一个字符都是“$”,表示该文件是隐藏的,用户无法访问和修改。

在 NTFS 文件系统中,元文件主要有 16 个。

序号 元文件 功能
0 $MFT 主文件表本身,是每个文件的索引
1 $MFTMirr 主文件表的部分镜像
2 $LogFile 事务型日志文件
3 $Volume 卷文件,记录卷标等信息
4 $AttrDef 属性定义列表文件
5 $Root 根目录文件,管理根目录
6 $Bitmap 位图文件,记录了分区中簇的使用情况
7 $Boot 引导文件,记录了用于系统引导的数据情况
8 $BadClus 坏簇列表文件
9 $Quota(NTFS4) 在早期的 Windows NT 系统中此文件为磁盘配额信息
10 $Secure 安全文件
11 $UpCase 大小写字符转换表文件
12 $Extend metadata directory 扩展元数据目录
13 $Extend$Reparse 重解析点文件
14 $Extend$UsnJrnl 加密日志文件
15 $Extend$Quota 配额管理文件
16 $Extend$ObjId 对象 ID 文件

$MFT 文件介绍

每个文件都有一个文件记录,包括元文件本身,而主文件表($MFT)就是专门用来存储文件记录的一个元文件,在$MFT 中前 16 个文件记录总是元文件的纪录。16 个元文件中主文件表($MFT)是一个非常重要的元文件,它由文件记录构成,每个文件记录占用 2 个扇区。

由于$MFT文件本身的重要性,为了确保文件系统结构的可靠性,系统专门为它准备了一个镜像文件($MFTMirr),也就是$MFT 中的第 2 个记录。不过这并不是$MFT的完整镜像,而是一个小部分镜像,一般只镜像$MFT 中的前四个文件记录。

$MFT 中前 16 个文件记录总是元文件的记录,并且这 16 个文件记录的顺序是固定的,下面对这 16 个记录简单做一个介绍:

  • 第 1 个记录就是$MFT 自身的记录,也就是说$MFT 首先对自己进行管理。

  • 第 2 个记录是$MFTMirr 的记录,也就是$MFT前 4 个文件记录的镜像

  • 第 3 个记录是日志文件($LogFile)的记录,该文件是 NTFS 为实现可恢复性和安全性而设计的。当系统运行时,NTFS 就会在日志文件中记录所有影响 NTFS 卷结构的操作,包括文件的创建和改变目录结构的命令,从而可在系统失败时能够恢复 NTFS 卷。

  • 第 4 个记录是卷文件($Volume)的记录,它包含卷名、NTFS 的版本和一个标明该磁盘是否损坏的标志位,NTFS 文件系统以此决定是否需要调用 Chkdsk 程序来进行修复。

  • 第 5 个记录是属性定义表($AttrDef,attribute definition table)的记录,其中存放着卷所支持的所有文件属性,并指出它们是否可以被索引和恢复等。

  • 第 6 个记录是根目录($ROOT)的记录,其中保存着该卷根目录下的所有文件和目录的索引。在访问一个文件后,NTFS 就保留该文件的 MFT 引用,第二次就能够直接访问该文件。

  • 第 7 个记录是位图文件($Bitmap)的记录,NTFS 卷的簇使用情况都保存在这个位图文件中,其中每一位(bit)代表卷中的一簇,标识该簇是空闲还是已分配。

  • 第 8 个记录是引导文件($Boot)的记录,该文件中存放着操作系统的引导程序代码。该文件必须位于特定的磁盘位置才能够正确地引导系统,一般都是位于卷的最前面。

  • 第 9 个记录是坏簇文件($BadClus)的记录,它记录着该卷中所有损坏的簇号,防止系统对其进行分配使用。

  • 第 10 个记录是安全文件($Secure)的记录,它存储着整个卷的安全描述符数据库。NTFS 文件和目录都有各自的安全描述符,为节省空间,NTFS 将文件和目录的相同描述符存放在此公共文件中。

  • 第 11 个记录为大写文件($UpCase,upper case file)的记录,该文件包含一个大小写字符转换表。

  • 第 12 个记录是扩展元数据目录($Extended metadata directory)的记录。

  • 第 13 个记录是重解析点文件($Extend$Reparse)的记录。

  • 第 14 个记录是变更日志文件($Extend$UsnJrnl)的记录。

  • 第 15 个记录是配额管理文件($Extend$Quota)的记录。

  • 第 16 个记录是对象 ID 文件($Extend$ObjId)的记录。

  • 第 17 ~ 23 记录是系统保留的记录,暂时不用,用于将来扩展。

  • 从第 24 个记录开始存放用户文件的记录。

$MFT文件在文件系统中的存放地址,可以通过BPB中的“$MFT 开始簇号”之一参数值获得。