1、分析NTFS文件系統的結構html
當用戶將硬盤的一個分區格式化爲NTFS分區時,就創建了一個NTFS文件系統。NTFS文件系統同FAT32文件系統同樣,也是用「簇」爲存儲單位,一個文件老是佔用一個或多個簇。數據庫
NTFS文件系統使用邏輯簇號(LCN)和虛擬簇號(VCN)對分區進行管理。數據結構
邏輯簇號:既對分區內的第一個簇到最後一個簇進行編號,NTFS使用邏輯簇號對簇進行定位。3d
虛擬簇號:既將文件所佔用的簇從開頭到尾進行編號的,虛擬簇號不要求在物理上是連續的。code
NTFS文件系統一共由16個「元文件」構成,它們是在分區格式化時寫入到硬盤的隱藏文件(以」$」開頭),也是NTFS文件系統的系統信息。htm
NTFS的16個元文件介紹:blog
首先找到該分區的起始扇區,具體能夠參考MBR分區結構、DPT分區表、EBR擴展引導這篇文章。索引
2、分析$Boot文件get
$Boot元文件由分區的第一個扇區(既DBR)和後面的15個扇區(既NTLDR區域)組成,其中DBR由「跳轉指令」、「OEM代號」、「BPB」、「引導程序」和「結束標誌」組成,這裏和FAT32文件系統的DBR同樣。下圖是一個NTFS文件系統完整的DBR。博客
下面咱們分析一下DBR中的各參數
EB 58 90:(跳轉指令)自己佔2字節它將程序執行流程跳轉到引導程序處。
「EB 58 90″清楚地指明瞭OS引導代碼的偏移位置。jump 52H加上跳轉指令所需的位移量,即開始於0×55。
4E 54 46 53 20 20 20 20:(OEM代號)這部分佔8字節,其內容由建立該文件系統的OEM廠商具體安排。爲「NTFS」。
BPB:NTFS文件系統的BPB從DBR的第12個字節開始,佔用73字節,記錄了有關該文件系統的重要信息,下表中的內容包含了「跳轉指令」、「OEM代號」以及「BPB」的參數。
對照上面的BPB分析以下:
02 00:每一個扇區512個字節
08:每一個簇8個扇區
00 00:保留扇區爲0
00 00 00:爲0
00:不使用
F8:爲硬盤
00 00:爲0
00 3F:每磁道63個扇區
00 FF:每柱面255個磁頭
00 00 00 3F:隱藏扇區數(MBR到DBR)
00 00 00 00:不使用
80 00 80 00:不使用
00 00 00 00 0C 80 33 FF:扇區總數209728511
00 00 00 00 00 00 00 03:$MFT的開始簇號
00 00 00 00 00 85 57 80:$MFTmirr的開始簇號
00 00 00 F6:每一個MFT記錄的簇數
00 00 00 01:每索引的簇數
B8 11 2A 0C B8 11 2A 0C:分區的邏輯序列號
引導程序:DBR的引導程序佔用426字節,其負責完成將系統文件NTLDR裝入,對於沒有安裝系統的分區是無效的。
結束標誌:DBR的結束標誌與MBR,EBR的結束標誌相同,爲「55 AA」。
3、分析$MFT元文件
在NTFS文件系統中,磁盤上的全部數據都是以文件的形式存儲,其中包括元文件。每一個文件都有一個或多個文件記錄,每一個文件記錄佔用兩個扇區,而$MFT 元文件就是專門記錄每一個文件的文件記錄。因爲NTFS文件系統是經過$MFT來肯定文件在磁盤上的位置以及文件的屬性,因此$MFT是很是重要 的,$MFT的起始位置在DBR中有描述。$MFT的文件記錄在物理上是連續的,而且從0開始編號。$MFT的前16個文件記錄老是元文件的,而且順序是 固定不變的。
4、分析文件記錄
一、文件記錄的結構
文件記錄由兩部分構成,一部分是文件記錄頭,另外一部分是屬性列表,最後結尾是四個「FF」。以下是一個完整的文件記錄:
在同一系統中,文件記錄頭的長度和具體偏移位置的數據含義是不變的,而屬性列表是可變的,其不一樣的屬性有着不一樣的含義。後文將對屬性進行具體分析,先來看看文件記錄頭的信息。
在NTFS文件系統中全部與文件相關的數據結構均被認爲是屬性,包括文件的內容。文件記錄是一個與文件相對應的文件屬性數據庫,它記錄了文 件的全部屬性。每一個文件記錄中都有多個屬性,他們相對獨立,有各自的類型和名稱。每一個屬性都由兩部分組成,既屬性頭和屬性體。屬性頭的前四個字節爲屬性的 類型。以下是以10H屬性爲例的屬性結構。
另外屬性還有常駐與很是駐之分。當一個文件很小時,其全部屬性體均可以存放在文件記錄中,該屬性就稱爲常駐屬性。若是某個文件很大,1KB的文件記 錄沒法記錄全部屬性時,則文件系統會在$MFT元文件以外的區域(也稱數據流)存放該文件的其餘文件記錄屬性,這些存放在非$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的值爲「12 41 47 03」,由於後面是00H,因此知道已是結尾。如何解析這個Run List呢? 第一個字節是壓縮字節,高位和低位相加,1+2=3,表示這個Data Run信息佔用三個字節,其中高位表示起始簇號佔用多少個字節,低位表示大小佔用的字節數。在這裏,起始簇號佔用1個字節,值爲03,大小佔用2個字節, 值爲47 41。解析後,獲得這個數據流起始簇號爲3,大小爲18241簇。
雖然數據不同,可是表達的意思是同樣的。
分析90H屬性
90H屬性是索引根屬性,該屬性是實現NTFS的B+樹索引的根節點,它老是常駐屬性。該屬性的結構以下圖:
索引根的結構如表:
索引頭的結構如表:
索引項結構如表:
分析A0H屬性
A0屬性是索引分配屬性,也是一個索引的基本結構,存儲着組成索引的B+樹目錄索引子節點的定位信息。它老是常駐屬性。以下:是一個A0H屬性的實例。
根據上圖A0H屬性的「Run List」能夠找到索引區域,偏移到索引區域所在的簇,以下圖:
起始簇:18265
簇大小:3
起始扇區號 = 該分區的其實扇區 + 簇號 * 每一個簇的扇區數 也就是
64 + 18265 * 8 = 146124
對了,上面的偏移0×28還要加上0×18 = 0×40.
標準索引頭的解釋以下:
索引項的解釋以下:
到此一些經常使用屬性基本介紹的差很少了。
下面來講下遍歷一個分區下面文件列表的思路:
一、定位DBR,經過DBR能夠得知「$MFT」的起始簇號及簇的大小。
二、定位「$MFT」,找到「$MFT」後,在其中尋找根目錄的文件記錄,通常在5號文件記錄。
三、在90H屬性中獲得B+樹索引的根節點文件信息,重點在A0屬性上。經過屬性中的「Run List」定位到其數據流。
四、從「Run List」定位到起始簇後,再分析索引項能夠獲得文件名等信息。
五、從索引項中能夠獲取「$MFT」的參考號,而後進入到「$MFT」找到對應的文件記錄。
六、而後再根據80H屬性中的數據流就能夠找到文件真正的數據了。
原文連接:http://www.blogfshare.com/detail-ntfs-filesys.html
原著:alone monkey的博客