一、分析NTFS文件系統的結構
當用戶將硬盤的一個分區格式化為NTFS分區時,就建立了一個NTFS文件系統。NTFS文件系統同FAT32文件系統一樣,也是用“簇”為存儲單位,一個文件總是占用一個或多個簇。
NTFS文件系統使用邏輯簇號(LCN)和虛擬簇號(VCN)對分區進行管理。
邏輯簇號:既對分區內的第一個簇到最后一個簇進行編號,NTFS使用邏輯簇號對簇進行定位。
虛擬簇號:既將文件所占用的簇從開頭到尾進行編號的,虛擬簇號不要求在物理上是連續的。
NTFS文件系統一共由16個“元文件”構成,它們是在分區格式化時寫入到硬盤的隱藏文件(以”$”開頭),也是NTFS文件系統的系統信息。
NTFS的16個元文件介紹:
首先找到該分區的起始扇區,具體可以參考MBR分區結構、DPT分區表、EBR擴展引導這篇文章。
二、分析$Boot文件
$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”。
三、分析$MFT元文件
在NTFS文件系統中,磁盤上的所有數據都是以文件的形式存儲,其中包括元文件。每個文件都有一個或多個文件記錄,每個文件記錄占用兩個扇區,而$MFT 元文件就是專門記錄每個文件的文件記錄。由於NTFS文件系統是通過$MFT來確定文件在磁盤上的位置以及文件的屬性,所以$MFT是非常重要 的,$MFT的起始位置在DBR中有描述。$MFT的文件記錄在物理上是連續的,並且從0開始編號。$MFT的前16個文件記錄總是元文件的,並且順序是 固定不變的。
四、分析文件記錄
1、文件記錄的結構
文件記錄由兩部分構成,一部分是文件記錄頭,另一部分是屬性列表,最后結尾是四個“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.
標准索引頭的解釋如下:
索引項的解釋如下:
到此一些常用屬性基本介紹的差不多了。
下面來說下遍歷一個分區下面文件列表的思路:
1、定位DBR,通過DBR可以得知“$MFT”的起始簇號及簇的大小。
2、定位“$MFT”,找到“$MFT”后,在其中尋找根目錄的文件記錄,一般在5號文件記錄。
3、在90H屬性中得到B+樹索引的根節點文件信息,重點在A0屬性上。通過屬性中的“Run List”定位到其數據流。
4、從“Run List”定位到起始簇后,再分析索引項可以得到文件名等信息。
5、從索引項中可以獲取“$MFT”的參考號,然后進入到“$MFT”找到對應的文件記錄。
6、然后再根據80H屬性中的數據流就可以找到文件真正的數據了。
原文鏈接:http://www.blogfshare.com/detail-ntfs-filesys.html
原著:alone monkey的博客