分析NTFS文件系統內部結構

   上一篇文章《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個元文件介紹

wKiom1LORnDRR2gkAAONDW1H15k691.jpg

以下:是NTFS文件系統大體的結構圖

wKiom1LOSaHj-VliAADHhN92UCo824.jpg


分析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。

wKioL1LOTPmiKKYcAAW3ngzJQaw966.jpg

下面咱們分析一下DBR中的各參數

跳轉指令:自己佔2字節它將程序執行流程跳轉到引導程序處。

OEM代號:這部分佔8字節,其內容由建立該文件系統的OEM廠商具體安排。

BPB:NTFS文件系統的BPB從DBR的第12個字節開始,佔用73字節,記錄了有關該文件系統的重要信息,下表中的內容包含了「跳轉指令」、「OEM代號」以及「BPB」的參數。

wKioL1LOTvrRGqUBAAItRorG7p4948.jpg

wKiom1LOTwqQ1eS9AAEO0jTqHW4182.jpg

引導程序:DBR的引導程序佔用426字節,其負責完成將系統文件NTLDR裝入,對於沒有安裝系統的分區是無效的。

結束標誌:DBR的結束標誌與MBR,EBR的結束標誌相同,爲「55 AA」。

分析$MFT元文件

   在NTFS文件系統中,磁盤上的全部數據都是以文件的形式存儲,其中包括元文件。每一個文件都有一個或多個文件記錄,每一個文件記錄佔用兩個扇區(既1字節),而$MFT元文件就是專門記錄每一個文件的文件記錄。因爲NTFS文件系統是經過$MFT來肯定文件在磁盤上的位置以及文件的屬性,因此$MFT是很是重要的,$MFT的起始位置在DBR中有描述。$MFT的文件記錄在物理上是連續的,而且從0開始編號。$MFT的前16個文件記錄老是元文件的,而且順序是固定不變的,其順序和表1相同(第一張圖片)。

分析文件記錄

一、文件記錄的結構

文件記錄由兩部分構成,一部分是文件記錄頭,另外一部分是屬性列表,最後結尾是四個「FF」。以下是一個完整的文件記錄:

wKioL1LOXNeDLlNmAAUXiGhmlTE208.jpg

分析文件記錄頭的結構

在同一系統中,文件記錄頭的長度和具體偏移位置的數據含義是不變的,而屬性列表是可變的,其不一樣的屬性有着不一樣的含義。後文將對屬性進行具體分析,先來看看文件記錄頭的信息。以下表:是文件記錄頭的相關信息解釋。

wKioL1LOXnfhZ5DbAAQwgtEKj5Y171.jpg

分析文件記錄屬性結構

   在NTFS文件系統中全部與文件相關的數據結構均被認爲是屬性,包括文件的內容。文件記錄是一個與文件相對應的文件屬性數據庫,它記錄了文件的全部屬性。每一個文件記錄中都有多個屬性,他們相對獨立,有各自的類型和名稱。每一個屬性都由兩部分組成,既屬性頭和屬性體。屬性頭的前四個字節爲屬性的類型。以下是以10H屬性爲例的屬性結構。

wKioL1LOYkfj7x_jAALaOVvizHk234.jpg

另外屬性還有常駐與很是駐之分。當一個文件很小時,其全部屬性體均可以存放在文件記錄中,該屬性就稱爲常駐屬性。若是某個文件很大,1KB的文件記錄沒法記錄全部屬性時,則文件系統會在$MFT元文件以外的區域(也稱數據流)存放該文件的其餘文件記錄屬性,這些存放在非$MFT元文件內的記錄就稱爲很是駐屬性。

分析屬性的屬性頭

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

以下是常駐屬性的屬性頭分析表:

wKiom1LOaiSDv7mOAAMuHi1uysQ810.jpg

以下是很是駐屬性的屬性頭分析:

wKioL1LOakrTpGXRAAQN3P8LdHs770.jpg


前面說過了,屬性的種類有不少,所以各屬性體的含義也不一樣。下表是NTFS文件系統中的全部屬性體的簡介。

wKioL1LObq6zdmiEAANQjYT6rrM170.jpg

wKioL1LObZOiqDtVAALl7rHKs5U305.jpg

因爲屬性體的解釋內容太多了,做者就不一一作解釋了,只介紹幾個工做時經常使用的屬性,其餘屬性的介紹請查閱相關資料。


分析10H屬性

   10H類型屬性它包含文件的一些基本信息,如文件的傳統屬性,文件的建立時間和最後修改時間和日期,文件的硬連接數等等。以下:是一個10H類型的屬性。

wKiom1LTQ8qCkFlqAAKJFS962dA232.jpg

以下:是10H類型屬性的解釋。

wKiom1LTQ_jz_x1eAAOeK2AhTY8449.jpg

上表中所描述的傳統屬性補充以下:

wKiom1LTRJyDtCYfAAE80BM6yhY262.jpgwKioL1LTRKvAhL35AAFwbF5xBJ8515.jpg


分析20H屬性

   20H類型屬性既屬性列表,當一個文件須要好幾個文件記錄時,纔會用到20H屬性。20H屬性記錄了一個文件的下一個文件記錄的位置。以下:是20H屬性的解釋。

wKiom1LTRoahX81uAAKQe4fYOWg137.jpg


分析30H屬性

   30H類型屬,該屬性用於存儲文件名 ,它老是常駐屬性。最少68字節,最大578字節,可容納最大Unicode字符的文件名長度。以下:是一個30H屬性的實例。

wKioL1LTR86TGxN6AAHc6Q2nG0Q135.jpg

以下:是30H屬性的解釋

wKioL1LTSKLzXzoNAAMgiwCwb3Q415.jpg


分析80H屬性

   80H屬性是文件數據屬性,該屬性容納着文件的內容,文件的大小通常指的就是未命名數據流的大小。該屬性沒有最大最小限制,最小狀況是該屬性爲常駐屬性。常駐屬性就不作多的解釋了,以下是一個很是駐的80H屬性。

wKioL1LTlu-DnNWYAAH3Bub6lko574.jpg

以下:是數據「Run List」部分的解釋。

wKioL1LTmE6wBqd5AAF1RE4gwEs637.jpg

wKiom1LTmHXyQbuyAAIMg_tHMd0270.jpg

其中該屬性的「Run List」值爲「32 0C 1B 00 00 0C」,其具體含義以下:

wKioL1LTmMLThLlFAAFKyUjzvQc402.jpg

分析90H屬性

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

wKiom1LTmj7QAacDAAKrVAKKAFQ597.jpg

索引根的解釋以下表:

wKioL1LTmtjgr_ZbAAFfjJLLjGE858.jpg

索引頭的解釋以下表:

wKioL1LTmvSwkZZgAAFyF_smZh8480.jpg

索引項的解釋以下表:

wKioL1LTmxKCvy_LAAOARrmR9CI263.jpg


分析A0H屬性

   A0屬性是索引分配屬性,也是一個索引的基本結構,存儲着組成索引的B+樹目錄索引子節點的定位信息。它老是常駐屬性。以下:是一個A0H屬性的實例。

wKiom1LTm_XA6SpLAAGkl4iX3kA636.jpg

根據上圖A0H屬性的「Run List」能夠找到索引區域,偏移到索引區域所在的簇,以下圖:

wKiom1LTq1PgWTPFAAWC3hXZ_J8441.jpg

標準索引頭的解釋以下;

wKioL1LTrCnRGNdlAAFXiQx7PuE124.jpg

wKiom1LTrEiTHqTKAAE2_ml2qHQ538.jpg

索引項的解釋以下:

wKiom1LTrGTQZ5O-AAKtqSUdMI8014.jpg

至此屬性分析已經介紹完畢了,下面咱們來分析一下數據存儲在NTFS文件系統中的具體位置。


一、定位DBR,經過DBR能夠得知「$MFT」的起始簇號及簇的大小。

二、定位「$MFT」,找到「$MFT」後,在其中尋找根目錄的文件記錄,通常在5號文件記錄。以下:

wKioL1LTn1WRvWY8AAVCbYtsEcA294.jpg

四、分析根目錄中的文件記錄屬性,從上圖中能夠看出文件記錄的屬性一共有7個,咱們能夠根據前面分析過的屬性進行對照可知道各屬性的意思。因爲是根目錄,目錄比較大,因此90H屬性是沒有內容的,重點在A0屬性上。經過屬性中的「Run List」定位到其數據流,以下圖:是「Run List」的分析。

wKioL1LTpYej8jRpAAU_kprYh_k739.jpg

經過上圖A0H屬性中的分析,咱們能夠計算出有6個數據流,以下表:

wKioL1LTp4qDoUAYAAFIu5mtrHI697.jpg

五、分析NTFS的索引

   從上表中分許出6個數據流所對應的LCN號,如今只須要偏移到相應的簇就能夠找到索引區域了。

以下圖:

wKiom1LTqabQ2tQtAASYQe45QD4485.jpg

六、偏移到索引區域後發現,索引區域的索引項都有子節點,咱們根據本身須要找的目標文件,找到相應的索引項並查找索引緩衝區的LCN和VCN對應關係,可得知子節點的起始簇號。以下圖:

wKioL1LTr4KAoMmNAAOYbSamwCs141.jpg

七、從索引項中能夠獲取「$MFT」的參考號,而後進入到「$MFT」找到對應的文件記錄,以下圖:

wKioL1LTsFOBcVTCAANkU1R4dwY456.jpg

而後再根據80H屬性中的數據流就能夠找到文件真正的數據了。


因爲NTFS實在是太複雜了,因此文章內容寫的有限,而且有大量的截圖,因此看起來很亂。就請你們多多包含,寫這麼多也不容易。


做者:鄧奇

相關文章
相關標籤/搜索