上一篇文章《FAT32文件系统详解》中做者介绍了FAT32文件系统存储数据的原理,接下来做者就介绍一下NTFS文件系统。NTFS、用过Windows系统的人都知道,它是一个很强大的文件系统,支持的功能不少,存储的原理也很复杂。目前绝大多数Windows用户都是使用NTFS文件系统,它主要以安全性和稳定性而闻名,下面是它的一些主要特色。数据库
安全性高:NTFS支持基于文件或目录的ACL,而且支持加密文件系统(EFS)。安全
可恢复性:NTFS支持基于原子事务概念的文件恢复,比较符合服务器文件系统的要求。服务器
文件压缩:NTFS支持基于文件或目录的文件压缩,能够很方便的节省磁盘空间。数据结构
磁盘配额:NTFS支持磁盘配额,可针对系统中每一个用户分配磁盘资源。ide
分析NTFS文件系统的结构加密
当用户将硬盘的一个分区格式化为NTFS分区时,就创建了一个NTFS文件系统。NTFS文件系统同FAT32文件系统同样,也是用“簇”为存储单位,一个文件老是占用一个或多个簇。spa
NTFS文件系统使用逻辑簇号(LCN)和虚拟簇号(VCN)对分区进行管理。3d
逻辑簇号:既对分区内的第一个簇到最后一个簇进行编号,NTFS使用逻辑簇号对簇进行定位。code
虚拟簇号:既将文件所占用的簇从开头到尾进行编号的,虚拟簇号不要求在物理上是连续的。blog
NTFS文件系统一共由16个“元文件”构成,它们是在分区格式化时写入到硬盘的隐藏文件(以"$"开头),也是NTFS文件系统的系统信息。
以下表:是NTFS的16个元文件介绍
以下:是NTFS文件系统大体的结构图
分析NTFS文件系统的元文件
在此,咱们先复习一下前面的文章《MBR分区结构和GPT分区结构》,若是磁盘采用的是MBR分区结构的话,则硬盘的第一个扇区是MBR扇区,MBR扇区中有分区表,能够根据分区表得知分区的起始位置(也就是DBR的位置)。若是磁盘采用的是GPT的分区结构,那么磁盘的第一个扇区应该是MBR保留扇区,第二个扇区应该是GPT头,第三个扇区应该是分区表,从分区表中我就能够找到分区的起始位置(既DBR)。所以,做者后面的内容都是从分区起始位置(既DBR)开始的,而不是磁盘的0号扇区。
因为各元文件的内容太多,做者只分析工做中所用到的,若是读者感兴趣能够自行去阅读相关资料。
一、分析$Boot元文件
$Boot元文件由分区的第一个扇区(既DBR)和后面的15个扇区(既NTLDR区域)组成,其中DBR由“跳转指令”、“OEM代号”、“BPB”、“引导程序”和“结束标志”组成,这里和FAT32文件系统的DBR同样。下图是一个NTFS文件系统完整的DBR。
下面咱们分析一下DBR中的各参数
跳转指令:自己占2字节它将程序执行流程跳转到引导程序处。
OEM代号:这部分占8字节,其内容由建立该文件系统的OEM厂商具体安排。
BPB:NTFS文件系统的BPB从DBR的第12个字节开始,占用73字节,记录了有关该文件系统的重要信息,下表中的内容包含了“跳转指令”、“OEM代号”以及“BPB”的参数。
引导程序:DBR的引导程序占用426字节,其负责完成将系统文件NTLDR装入,对于没有安装系统的分区是无效的。
结束标志:DBR的结束标志与MBR,EBR的结束标志相同,为“55 AA”。
分析$MFT元文件
在NTFS文件系统中,磁盘上的全部数据都是以文件的形式存储,其中包括元文件。每一个文件都有一个或多个文件记录,每一个文件记录占用两个扇区(既1字节),而$MFT元文件就是专门记录每一个文件的文件记录。因为NTFS文件系统是经过$MFT来肯定文件在磁盘上的位置以及文件的属性,因此$MFT是很是重要的,$MFT的起始位置在DBR中有描述。$MFT的文件记录在物理上是连续的,而且从0开始编号。$MFT的前16个文件记录老是元文件的,而且顺序是固定不变的,其顺序和表1相同(第一张图片)。
分析文件记录
一、文件记录的结构
文件记录由两部分构成,一部分是文件记录头,另外一部分是属性列表,最后结尾是四个“FF”。以下是一个完整的文件记录:
分析文件记录头的结构
在同一系统中,文件记录头的长度和具体偏移位置的数据含义是不变的,而属性列表是可变的,其不一样的属性有着不一样的含义。后文将对属性进行具体分析,先来看看文件记录头的信息。以下表:是文件记录头的相关信息解释。
分析文件记录属性结构
在NTFS文件系统中全部与文件相关的数据结构均被认为是属性,包括文件的内容。文件记录是一个与文件相对应的文件属性数据库,它记录了文件的全部属性。每一个文件记录中都有多个属性,他们相对独立,有各自的类型和名称。每一个属性都由两部分组成,既属性头和属性体。属性头的前四个字节为属性的类型。以下是以10H属性为例的属性结构。
另外属性还有常驻与很是驻之分。当一个文件很小时,其全部属性体均可以存放在文件记录中,该属性就称为常驻属性。若是某个文件很大,1KB的文件记录没法记录全部属性时,则文件系统会在$MFT元文件以外的区域(也称数据流)存放该文件的其余文件记录属性,这些存放在非$MFT元文件内的记录就称为很是驻属性。
分析属性的属性头
每一个属性都有一个属性头,这个属性头包含了一些该属性的重要信息,如属性类型,属性大小,名字(并不是都有)及是否为常驻属性等。
以下是常驻属性的属性头分析表:
以下是很是驻属性的属性头分析:
前面说过了,属性的种类有不少,所以各属性体的含义也不一样。下表是NTFS文件系统中的全部属性体的简介。
因为属性体的解释内容太多了,做者就不一一作解释了,只介绍几个工做时经常使用的属性,其余属性的介绍请查阅相关资料。
分析10H属性
10H类型属性它包含文件的一些基本信息,如文件的传统属性,文件的建立时间和最后修改时间和日期,文件的硬连接数等等。以下:是一个10H类型的属性。
以下:是10H类型属性的解释。
上表中所描述的传统属性补充以下:
分析20H属性
20H类型属性既属性列表,当一个文件须要好几个文件记录时,才会用到20H属性。20H属性记录了一个文件的下一个文件记录的位置。以下:是20H属性的解释。
分析30H属性
30H类型属,该属性用于存储文件名 ,它老是常驻属性。最少68字节,最大578字节,可容纳最大Unicode字符的文件名长度。以下:是一个30H属性的实例。
以下:是30H属性的解释
分析80H属性
80H属性是文件数据属性,该属性容纳着文件的内容,文件的大小通常指的就是未命名数据流的大小。该属性没有最大最小限制,最小状况是该属性为常驻属性。常驻属性就不作多的解释了,以下是一个很是驻的80H属性。
以下:是数据“Run List”部分的解释。
其中该属性的“Run List”值为“32 0C 1B 00 00 0C”,其具体含义以下:
分析90H属性
90H属性是索引根属性,该属性是实现NTFS的B+树索引的根节点,它老是常驻属性。该属性的结构以下图:
索引根的解释以下表:
索引头的解释以下表:
索引项的解释以下表:
分析A0H属性
A0属性是索引分配属性,也是一个索引的基本结构,存储着组成索引的B+树目录索引子节点的定位信息。它老是常驻属性。以下:是一个A0H属性的实例。
根据上图A0H属性的“Run List”能够找到索引区域,偏移到索引区域所在的簇,以下图:
标准索引头的解释以下;
索引项的解释以下:
至此属性分析已经介绍完毕了,下面咱们来分析一下数据存储在NTFS文件系统中的具体位置。
一、定位DBR,经过DBR能够得知“$MFT”的起始簇号及簇的大小。
二、定位“$MFT”,找到“$MFT”后,在其中寻找根目录的文件记录,通常在5号文件记录。以下:
四、分析根目录中的文件记录属性,从上图中能够看出文件记录的属性一共有7个,咱们能够根据前面分析过的属性进行对照可知道各属性的意思。因为是根目录,目录比较大,因此90H属性是没有内容的,重点在A0属性上。经过属性中的“Run List”定位到其数据流,以下图:是“Run List”的分析。
经过上图A0H属性中的分析,咱们能够计算出有6个数据流,以下表:
五、分析NTFS的索引
从上表中分许出6个数据流所对应的LCN号,如今只须要偏移到相应的簇就能够找到索引区域了。
以下图:
六、偏移到索引区域后发现,索引区域的索引项都有子节点,咱们根据本身须要找的目标文件,找到相应的索引项并查找索引缓冲区的LCN和VCN对应关系,可得知子节点的起始簇号。以下图:
七、从索引项中能够获取“$MFT”的参考号,而后进入到“$MFT”找到对应的文件记录,以下图:
而后再根据80H属性中的数据流就能够找到文件真正的数据了。
因为NTFS实在是太复杂了,因此文章内容写的有限,而且有大量的截图,因此看起来很乱。就请你们多多包含,写这么多也不容易。
做者:邓奇