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字节,它的结构如下:
其中,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元文件的结构如下:
其中,文件头包含了文件的一些基本信息,如文件名、文件属性等。文件记录则包含了文件的属性信息、文件名、文件数据等。每个文件记录的大小是固定的,通常为1KB或4KB。每个文件记录都有一个唯一的标识符,称为文件记录号(File Record Number,简称FRN)。$MFT元文件中的第一个文件记录是$MFT本身,它的文件记录号为0。
四、文件记录
NTFS文件系统中的文件记录是用来存储文件的数据和元数据的。每个文件记录都包含了文件的属性信息、文件名、文件数据等。文件记录的大小是固定的,通常为1KB或4KB。文件记录的结构如下:
其中,文件头包含了文件的一些基本信息,如文件名、文件属性等。文件记录则包含了文件的属性信息、文件名、文件数据等。每个文件记录都有一个唯一的标识符,称为文件记录号(File Record Number,简称FRN)
五、MFT偏移地址计算
在NTFS文件系统中,每个文件记录都有一个唯一的标识符,称为文件记录号(File Record Number,简称FRN)。要访问某个文件记录,需要先找到该文件记录在$MFT元文件中的偏移地址。计算偏移地址的公式如下:
$MFTOffset = MFTStartCluster * ClusterSize + FRN * RecordSize
其中,MFTStartCluster是$MFT元文件的起始簇号,ClusterSize是簇的大小,FRN是文件记录号,RecordSize是文件记录的大小。
六、属性的属性头分析
NTFS文件系统中的文件记录包含了多个属性,每个属性都有一个属性头和一个属性体。属性头包含了属性的一些基本信息,如属性类型、属性长度、属性标志等。属性头的结构如下:
其中,Type表示属性的类型,Length表示属性的长度,Non-Resident表示属性是否为非驻留属性,NameLength表示属性名的长度,NameOffset表示属性名的偏移量,Flags表示属性的标志,AttributeID表示属性的标识符。
七、属性的属性体分析
NTFS文件系统中的文件记录包含了多个属性,每个属性都有一个属性头和一个属性体。属性体包含了属性的具体内容,如文件数据、文件名、文件属性等。属性体的结构因属性类型而异,下面以常见的属性类型为例进行介绍。
1. $STANDARD_INFORMATION属性
$STANDARD_INFORMATION属性包含了文件的一些基本信息,如创建时间、修改时间、访问时间、文件属性等。$STANDARD_INFORMATION属性的结构如下:
其中,CreationTime表示文件的创建时间,LastAccessTime表示文件的最后访问时间,LastWriteTime表示文件的最后修改时间,FileAttributes表示文件的属性,如只读、隐藏、系统等。
2. $FILE_NAME属性
$FILE_NAME属性包含了文件的名称、大小、创建时间、修改时间、访问时间等信息。$FILE_NAME属性的结构如下:
其中,ParentDirectory表示文件所在的父目录的FRN,CreationTime表示文件的创建时间,LastAccessTime表示文件的最后访问时间,LastWriteTime表示文件的最后修改时间,FileSize表示文件的大小,Flags表示文件的标志,如只读、隐藏、系统等,FileNameLength表示文件名的长度,FileName表示文件名。
3. $DATA属性
$DATA属性包含了文件的数据。$DATA属性的结构如下:
其中,Non-Resident表示数据是否为非驻留属性,DataRuns表示数据的运行列表,Data表示数据的内容。
4. $INDEX_ROOT属性
$INDEX_ROOT属性包含了目录的索引信息。$INDEX_ROOT属性的结构如下:
其中,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元文件、文件记录、属性的属性头和属性体分析
版权归原作者 久孤776 所有, 如有侵权,请联系我们删除。