「NTFS:让你的硬盘更安全、更高效!」NTFS文件系统详解,

NTFS(New Technology File System)是一种现代的文件系统,是Windows操作系统中最常用的文件系统之一。它是一种高效、可靠、安全的文件系统,支持大容量存储、文件加密、压缩、权限控制等功能。本文将详细介绍NTFS文件系统的结构、$Boot文件、$MFT元文件、文件记录、属性的属性头和属性体分析、MFT偏移地址计算以及遍历分区文件列表的思路。

 

一、NTFS文件系统的结构

 

NTFS文件系统由三个主要部分组成:引导扇区、文件记录和元文件。引导扇区包含启动代码和分区表,文件记录存储文件的数据和元数据,元文件存储文件系统的元数据。

引导扇区:NTFS文件系统的引导扇区包含了启动代码和分区表。启动代码是用来启动操作系统的程序代码,分区表则记录了分区的信息,包括分区的起始位置、大小、分区类型等。

文件记录:NTFS文件系统中的文件记录是用来存储文件的数据和元数据的。每个文件记录都包含了文件的属性信息、文件名、文件数据等。文件记录的大小是固定的,通常为1KB或4KB。

元文件:NTFS文件系统中的元文件是用来存储文件系统的元数据的。元数据包括文件系统的信息、文件记录的信息、磁盘空间的分配情况等。元文件通常包括$MFT(文件记录表)、$Bitmap(位图)、$LogFile(日志文件)等。

二、$Boot文件

$Boot文件是NTFS文件系统中的一个特殊文件,它包含了文件系统的一些基本信息,如文件系统版本、簇大小、分区大小等。$Boot文件的大小为512字节,它的结构如下:

![NTFS_Boot_File_Structure](https://i.imgur.com/5YJjZJy.png)

其中,Jump指令是用来跳转到启动代码的,OEM ID是用来标识文件系统的,Bytes Per Sector表示每个扇区的字节数,Sectors Per Cluster表示每个簇包含的扇区数,Reserved Sectors表示保留扇区的数量,Media Descriptor表示磁盘介质类型,Sectors Per Track表示每个磁道的扇区数,Number of Heads表示磁头的数量,Hidden Sectors表示隐藏扇区的数量,Total Sectors表示分区的总扇区数,MFT Start Cluster表示$MFT元文件的起始簇号,MFT Mirror Start Cluster表示$MFT镜像文件的起始簇号,Clusters Per MFT Record表示每个$MFT记录占用的簇数,Clusters Per Index Block表示每个索引块占用的簇数,Volume Serial Number表示卷序列号,Checksum是用来校验$Boot文件的。

三、$MFT元文件

 

$MFT元文件是NTFS文件系统中的一个特殊文件,它存储了文件系统中所有文件记录的信息。$MFT元文件的大小通常为1024个簇,每个簇的大小为$Boot文件中定义的簇大小。$MFT元文件的结构如下:

![NTFS_MFT_File_Structure](https://i.imgur.com/2zL7tq7.png)

其中,文件头包含了文件的一些基本信息,如文件名、文件属性等。文件记录则包含了文件的属性信息、文件名、文件数据等。每个文件记录的大小是固定的,通常为1KB或4KB。每个文件记录都有一个唯一的标识符,称为文件记录号(File Record Number,简称FRN)。$MFT元文件中的第一个文件记录是$MFT本身,它的文件记录号为0。

四、文件记录

NTFS文件系统中的文件记录是用来存储文件的数据和元数据的。每个文件记录都包含了文件的属性信息、文件名、文件数据等。文件记录的大小是固定的,通常为1KB或4KB。文件记录的结构如下:

![NTFS_File_Record_Structure](https://i.imgur.com/5ZKqL6j.png)

其中,文件头包含了文件的一些基本信息,如文件名、文件属性等。文件记录则包含了文件的属性信息、文件名、文件数据等。每个文件记录都有一个唯一的标识符,称为文件记录号(File Record Number,简称FRN)

五、MFT偏移地址计算

 

在NTFS文件系统中,每个文件记录都有一个唯一的标识符,称为文件记录号(File Record Number,简称FRN)。要访问某个文件记录,需要先找到该文件记录在$MFT元文件中的偏移地址。计算偏移地址的公式如下:

$MFTOffset = MFTStartCluster * ClusterSize + FRN * RecordSize

其中,MFTStartCluster是$MFT元文件的起始簇号,ClusterSize是簇的大小,FRN是文件记录号,RecordSize是文件记录的大小。

六、属性的属性头分析

NTFS文件系统中的文件记录包含了多个属性,每个属性都有一个属性头和一个属性体。属性头包含了属性的一些基本信息,如属性类型、属性长度、属性标志等。属性头的结构如下:

![NTFS_Attribute_Header_Structure](https://i.imgur.com/2Uq6J1Q.png)

其中,Type表示属性的类型,Length表示属性的长度,Non-Resident表示属性是否为非驻留属性,NameLength表示属性名的长度,NameOffset表示属性名的偏移量,Flags表示属性的标志,AttributeID表示属性的标识符。

七、属性的属性体分析

NTFS文件系统中的文件记录包含了多个属性,每个属性都有一个属性头和一个属性体。属性体包含了属性的具体内容,如文件数据、文件名、文件属性等。属性体的结构因属性类型而异,下面以常见的属性类型为例进行介绍。

1. $STANDARD_INFORMATION属性

$STANDARD_INFORMATION属性包含了文件的一些基本信息,如创建时间、修改时间、访问时间、文件属性等。$STANDARD_INFORMATION属性的结构如下:

![NTFS_STANDARD_INFORMATION_Attribute_Structure](https://i.imgur.com/6wQK9gE.png)

其中,CreationTime表示文件的创建时间,LastAccessTime表示文件的最后访问时间,LastWriteTime表示文件的最后修改时间,FileAttributes表示文件的属性,如只读、隐藏、系统等。

2. $FILE_NAME属性

$FILE_NAME属性包含了文件的名称、大小、创建时间、修改时间、访问时间等信息。$FILE_NAME属性的结构如下:

![NTFS_FILE_NAME_Attribute_Structure](https://i.imgur.com/7hjyJ3Y.png)

其中,ParentDirectory表示文件所在的父目录的FRN,CreationTime表示文件的创建时间,LastAccessTime表示文件的最后访问时间,LastWriteTime表示文件的最后修改时间,FileSize表示文件的大小,Flags表示文件的标志,如只读、隐藏、系统等,FileNameLength表示文件名的长度,FileName表示文件名。

3. $DATA属性

$DATA属性包含了文件的数据。$DATA属性的结构如下:

![NTFS_DATA_Attribute_Structure](https://i.imgur.com/5mXyL9G.png)

其中,Non-Resident表示数据是否为非驻留属性,DataRuns表示数据的运行列表,Data表示数据的内容。

4. $INDEX_ROOT属性

$INDEX_ROOT属性包含了目录的索引信息。$INDEX_ROOT属性的结构如下:

![NTFS_INDEX_ROOT_Attribute_Structure](https://i.imgur.com/6WjJ9Km.png)

其中,Type表示索引的类型,CollationRule表示排序规则,BytesPerIndexRecord表示每个索引记录的大小,ClustersPerIndexRecord表示每个索引记录占用的簇数,IndexEntriesOffset表示索引记录的偏移量,IndexEntriesLength表示索引记录的长度,IndexEntries表示索引记录的内容。

八、遍历分区文件列表的思路

要遍历NTFS文件系统中的所有文件,需要先找到$MFT元文件的起始簇号和大小,然后读取$MFT元文件的内容,解析每个文件记录,获取文件的属性信息、文件名、文件数据等。具体的遍历思路如下:

1. 读取$Boot文件,获取簇大小和$MFT元文件的起始簇号。

2. 计算$MFT元文件的大小,读取$MFT元文件的内容。

3. 解析$MFT元文件中的每个文件记录,获取文件的属性信息、文件名、文件数据等。

4. 如果文件是目录,则遍历目录下的所有文件。

5. 如果文件是非驻留属性,则读取DataRuns列表,获取数据的位置和大小,读取数据。

6. 如果文件是索引属性,则读取IndexEntries列表,获取索引记录的位置和大小,解析索引记录,获取文件的属性信息、文件名、文件数据等。

7. 重复步骤3-6,直到遍历完整个分区。

总结

本文详细介绍了NTFS文件系统的结构、$Boot文件、$MFT元文件、文件记录、属性的属性头和属性体分析