NTFS文件系統詳解(三)之NTFS元文件解析

在NTFS中,所有存儲在捲上的數據都包含在文件中,包括用來定位和獲取文件的數據結構,引導程序和記錄這個卷的記錄(NTFS元數據)的位圖,這體現了NTFS的原則:磁盤上的任何事物都爲文件。在文件中存儲一切使得文件系統很容易定位和維護數據,而在NTFS中,卷中所有存放的數據均在一個叫做MFT的文件記錄數組中,稱爲主文件表(Master File Table),MFT是由高級格式化產生的。而MFT則由文件記錄(File Record)數組構成。File Record的大小一般是固定的,不管簇的大小是多少,均爲1KB,這個概念相當於Linux中的inode(i節點)。File Record在MFT文件記錄數組中物理上是連續的,且從0開始編號。MFT僅供系統本身組織、架構文件系統使用,這在NTFS中稱爲元數據(metadata)。其中最基本的前16個記錄是操作系統使用的非常重要的元數據文件。這些NTFS主文件表的重要的元數據文件都是以$(美元符號)開始的名字,所以是隱藏文件,在Windows 2000中不能使用dir命令(甚至加上/ah參數)像普通文件一樣列出這些元數據文件。實際上File System Driver(ntfs.sys)維護了一個系統變量NTFS Protect System Files用於隱藏這些元數據。但是微軟公司也提供了一個OEM TOOL,叫做NFI.EXE,用此工具可以轉儲NTFS主文件表的重要的元數據文件(元數據:是存儲在捲上支持文件系統格式管理的數據。它不能被應用程序來訪問,它只能爲系統提供服務)

我們第一步就是先找到MFT的位置,通過分區表,我們得到本分區的引導扇區所在的扇區號,就拿C盤分區來實踐,通過上一節,我們得到C盤的引導扇區的扇區號是63,首先進到扇區號爲63的扇區
這裏寫圖片描述
然後根據下表對照
這裏寫圖片描述

00 02 每個扇區512(200H)字節
08 每個簇佔8扇區
00 00
00 00 00
00 00
F8 硬盤
00 00
3F 00 每磁頭63扇區
FF 00 每柱面255磁頭
3F 00 00 00 隱含扇區63
00 00 00 00
80 00 80 00
C0 FF BF 03 00 00 00 00 扇區總數62914496
00 00 0C 00 00 00 00 00 MFT開始簇號786432
10 00 00 00 00 00 00 00 MFTmirr開始簇號 16
F6 00 00 00 每個MFT佔的簇數 246
01 00 00 00 每個索引佔的簇數 1
B9 63 23 FC AA 23 FC B6 卷標

文件記錄由兩部分構成,一部分是文件記錄頭,另一部分是屬性列表,最後結尾是四個“FF”。然後我們根據上面BPB中的偏移簇號偏移盤偏移地址找到系統MFT所在地址(789632 * 8 +63 = 6291519),查看文件記錄格式如下是一個完整的文件記錄:
這裏寫圖片描述

在同一系統中,文件記錄頭的長度和具體偏移位置的數據含義是不變的,而屬性列表是可變的,其不同的屬性有着不同的含義。後文將對屬性進行具體分析,先來看看文件記錄頭的信息。
這裏寫圖片描述

在NTFS文件系統中所有與文件相關的數據結構均被認爲是屬性,包括文件的內容。文件記錄是一個與文件相對應的文件屬性數據庫,它記錄了文件的所有屬性。每個文件記錄中都有多個屬性,他們相對獨立,有各自的類型和名稱。每個屬性都由兩部分組成,既屬性頭和屬性體。屬性頭的前四個字節爲屬性的類型。從文件記錄頭可以看到第一個屬性流的偏移地址,(C0007E00+0038=C0007E38)如下是以10H屬性爲例的屬性結構
這裏寫圖片描述

另外屬性還有常駐與非常駐之分。當一個文件很小時,其所有屬性體都可以存放在文件記錄中,該屬性就稱爲常駐屬性。如果某個文件很大,1KB的文件記錄無法記錄所有屬性時,則文件系統會在元文件之外的區域也稱數據流存放該文件的其他文件記錄屬性,這些存放在非MFT元文件內的記錄就稱爲非常駐屬性。

分析屬性的屬性頭

每個屬性都有一個屬性頭,這個屬性頭包含了一些該屬性的重要信息,如屬性類型,屬性大小,名字(並非都有)及是否爲常駐屬性等。

常駐屬性的屬性頭分析表:
這裏寫圖片描述

如下是非常駐屬性的屬性頭分析表:
這裏寫圖片描述

前面說過了,屬性的種類有很多,因此各屬性體的含義也不同。下表是NTFS文件系統中的所有屬性體的簡介
這裏寫圖片描述
這裏寫圖片描述

接下來來看幾個重要的屬性:

分析10H屬性:

10H類型屬性它包含文件的一些基本信息,如文件的傳統屬性,文件的創建時間和最後修改時間和日期,文件的硬鏈接數等等。如下:是一個10H類型的屬性。
這裏寫圖片描述

其中偏移0×20處的文件屬性解釋如下:
這裏寫圖片描述

分析20H屬性

20H類型屬性既屬性列表,當一個文件需要好幾個文件記錄時,纔會用到20H屬性。20H屬性記錄了一個文件的下一個文件記錄的位置。如下:是20H屬性的解釋。
這裏寫圖片描述

分析30H屬性

30H類型屬,該屬性用於存儲文件名 ,它總是常駐屬性。最少68字節,最大578字節,可容納最大Unicode字符的文件名長度。
這裏寫圖片描述

分析80H屬性

80H屬性是文件數據屬性,該屬性容納着文件的內容,文件的大小一般指的就是未命名數據流的大小。該屬性沒有最大最小限制,最小情況是該屬性爲常駐屬性。常駐屬性就不做多的解釋了,上面我標記的是一個非常駐的80H屬性。

這裏寫圖片描述

其中,Run List是最難理解,也是最重要的。當屬性不能存放完數據,系統就會在NTFS數據區域開闢一個空間存放,這個區域是以簇爲單位的。Run List就是記錄這個數據區域的起始簇號和大小,一個Run List例子上所示。這個示例中,Run List的值爲“32 CC 26 00 00 0C”,因爲後面是00H,所以知道已經是結尾。如何解析這個Run List呢? 第一個字節是壓縮字節,高位和低位相加,3 + 2 = 5,表示這個Data Run信息佔用五個字節,其中高位表示起始簇號佔用多少個字節,低位表示大小佔用的字節數。在這裏,起始簇號佔用3個字節,值爲0C 00 00,大小佔用2個字節,值爲26 CC。解析後,得到這個數據流起始簇號爲C0000,大小爲9932簇。
這裏寫圖片描述

分析90H屬性

90H屬性是索引根屬性,該屬性是實現NTFS的B+樹索引的根節點,它總是常駐屬性。該屬性的結構如下圖:

這裏寫圖片描述

索引根的結構如表:
這裏寫圖片描述

索引頭的結構如表:

索引項結構如表:
這裏寫圖片描述

分析A0H屬性
A0屬性是索引分配屬性,也是一個索引的基本結構,存儲着組成索引的B+樹目錄索引子節點的定位信息。它總是常駐屬性。如下:是一個A0H屬性的實例。
這裏寫圖片描述

根據上圖A0H屬性的“Run List”可以找到索引區域,偏移到索引區域所在的簇,如下圖:
起始簇:18265

簇大小:3

起始扇區號 = 該分區的其實扇區 + 簇號 * 每個簇的扇區數 也就是

64 + 18265 * 8 = 146124
這裏寫圖片描述

對了,上面的偏移0×28還要加上0×18 = 0×40.

標準索引頭的解釋如下:
這裏寫圖片描述

索引項的解釋如下:
這裏寫圖片描述

在下面的表中羅列出NTFS5中所有的元文件:
這裏寫圖片描述

每個MFT記錄都對應着不同的文件,如果一個文件有很多屬性或是分散成很多碎片,就很可能需要多個文件記錄。這時,存放其文件記錄位置的第一個記錄就叫做“基文件記錄”(base file record)。

MFT中的第1個記錄就是MFT自身。由於MFT文件本身的重要性,爲了確保文件系統結構的可靠性,系統專門爲它準備了一個鏡像文件($MftMirr),也就是MFT中的第2個記錄。

第3個記錄是日誌文件($LogFile)。該文件是NTFS爲實現可恢復性和安全性而設計的。當系統運行時,NTFS就會在日誌文件中記錄所有影響NTFS卷結構的操作,包括文件的創建和改變目錄結構的命令,例如複製,從而在系統失敗時能夠恢復NTFS卷。

第4個記錄是卷文件($Volume),它包含了卷名、被格式化的卷的NTFS版本和一個標明該磁盤是否損壞的標誌位(NTFS系統以此決定是否需要調用Chkdsk程序來進行修復)。

第5個記錄是屬性定義表($AttrDef,attribute definition table),其中存放了卷所支持的所有文件屬性,並指出它們是否可以被索引和恢復等。

第6個記錄是根目錄(\),其中保存了存放於該卷根目錄下所有文件和目錄的索引。在訪問了一個文件後,NTFS就保留該文件的MFT引用,第二次就能夠直接進行對該文件的訪問。

第7個記錄是位圖文件($Bitmap)。NTFS卷的分配狀態都存放在位圖文件中,其中每一位(bit)代表卷中的一簇,標識該簇是空閒的還是已被分配了的,由於該文件可以很容易的被擴大,所以NTFS的卷可以很方便的動態的擴大,而FAT格式的文件系統由於涉及到FAT表的變化,所以不能隨意的對分區大小進行調整。

第8個記錄是引導文件($Boot),它是另一個重要的系統文件,存放着Windows 2000/XP的引導程序代碼。該文件必須位於特定的磁盤位置才能夠正確地引導系統。該文件是在Format程序運行時創建的,這正體現了NTFS把磁盤上的所有事物都看成是文件的原則。這也意味着雖然該文件享受NTFS系統的各種安全保護,但還是可以通過普通的文件I/O操作來修改。

第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記錄是是系統保留記錄,用於將來擴展。

MFT的前16個元數據文件是如此重要,爲了防止數據的丟失,NTFS系統在該卷文件存儲部分的正中央對它們進行了備份,參見下圖。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章