上篇在詳解FAT32文件系統(tǒng)中介紹了FAT32文件系統(tǒng)存儲(chǔ)數(shù)據(jù)的原理,這篇就來介紹下NTFS文件系統(tǒng)。NTFS、用過Windows系統(tǒng)的人都知道,它是一個(gè)很強(qiáng)大的文件系統(tǒng),支持的功能很多,存儲(chǔ)的原理也很復(fù)雜。目前絕大多數(shù)Windows用戶都是使用NTFS文件系統(tǒng),它主要以安全性和穩(wěn)定性而聞名,下面是它的一些主要特點(diǎn)。 安全性高:NTFS支持基于文件或目錄的ACL,并且支持加密文件系統(tǒng)(EFS)。 可恢復(fù)性:NTFS支持基于原子事務(wù)概念的文件恢復(fù),比較符合服務(wù)器文件系統(tǒng)的要求。 文件壓縮:NTFS支持基于文件或目錄的文件壓縮,可以很方便的節(jié)省磁盤空間。 磁盤配額:NTFS支持磁盤配額,可針對(duì)系統(tǒng)中每個(gè)用戶分配磁盤資源。 一、分析NTFS文件系統(tǒng)的結(jié)構(gòu) 當(dāng)用戶將硬盤的一個(gè)分區(qū)格式化為NTFS分區(qū)時(shí),就建立了一個(gè)NTFS文件系統(tǒng)。NTFS文件系統(tǒng)同F(xiàn)AT32文件系統(tǒng)一樣,也是用“簇”為存儲(chǔ)單位,一個(gè)文件總是占用一個(gè)或多個(gè)簇。 NTFS文件系統(tǒng)使用邏輯簇號(hào)(LCN)和虛擬簇號(hào)(VCN)對(duì)分區(qū)進(jìn)行管理。 邏輯簇號(hào):既對(duì)分區(qū)內(nèi)的第一個(gè)簇到最后一個(gè)簇進(jìn)行編號(hào),NTFS使用邏輯簇號(hào)對(duì)簇進(jìn)行定位。 虛擬簇號(hào):既將文件所占用的簇從開頭到尾進(jìn)行編號(hào)的,虛擬簇號(hào)不要求在物理上是連續(xù)的。 NTFS文件系統(tǒng)一共由16個(gè)“元文件”構(gòu)成,它們是在分區(qū)格式化時(shí)寫入到硬盤的隱藏文件(以”$”開頭),也是NTFS文件系統(tǒng)的系統(tǒng)信息。 NTFS的16個(gè)元文件介紹: 首先找到該分區(qū)的起始扇區(qū),具體可以參考MBR分區(qū)結(jié)構(gòu)、DPT分區(qū)表、EBR擴(kuò)展引導(dǎo)這篇文章。 二、分析$Boot文件 $Boot元文件由分區(qū)的第一個(gè)扇區(qū)(既DBR)和后面的15個(gè)扇區(qū)(既NTLDR區(qū)域)組成,其中DBR由“跳轉(zhuǎn)指令”、“OEM代號(hào)”、“BPB”、“引導(dǎo)程序”和“結(jié)束標(biāo)志”組成,這里和FAT32文件系統(tǒng)的DBR一樣。下圖是一個(gè)NTFS文件系統(tǒng)完整的DBR。 下面我們分析一下DBR中的各參數(shù) EB 58 90:(跳轉(zhuǎn)指令)本身占2字節(jié)它將程序執(zhí)行流程跳轉(zhuǎn)到引導(dǎo)程序處。 “EB 58 90″清楚地指明了OS引導(dǎo)代碼的偏移位置。jump 52H加上跳轉(zhuǎn)指令所需的位移量,即開始于0×55。 4E 54 46 53 20 20 20 20:(OEM代號(hào))這部分占8字節(jié),其內(nèi)容由創(chuàng)建該文件系統(tǒng)的OEM廠商具體安排。為“NTFS”。 BPB:NTFS文件系統(tǒng)的BPB從DBR的第12個(gè)字節(jié)開始,占用73字節(jié),記錄了有關(guān)該文件系統(tǒng)的重要信息,下表中的內(nèi)容包含了“跳轉(zhuǎn)指令”、“OEM代號(hào)”以及“BPB”的參數(shù)。 對(duì)照上面的BPB分析如下: 02 00:每個(gè)扇區(qū)512個(gè)字節(jié) 08:每個(gè)簇8個(gè)扇區(qū) 00 00:保留扇區(qū)為0 00 00 00:為0 00:不使用 F8:為硬盤 00 00:為0 00 3F:每磁道63個(gè)扇區(qū) 00 FF:每柱面255個(gè)磁頭 00 00 00 3F:隱藏扇區(qū)數(shù)(MBR到DBR) 00 00 00 00:不使用 80 00 80 00:不使用 00 00 00 00 0C 80 33 FF:扇區(qū)總數(shù)209728511 00 00 00 00 00 00 00 03:$MFT的開始簇號(hào) 00 00 00 00 00 85 57 80:$MFTmirr的開始簇號(hào) 00 00 00 F6:每個(gè)MFT記錄的簇?cái)?shù) 00 00 00 01:每索引的簇?cái)?shù) B8 11 2A 0C B8 11 2A 0C:分區(qū)的邏輯序列號(hào) 引導(dǎo)程序:DBR的引導(dǎo)程序占用426字節(jié),其負(fù)責(zé)完成將系統(tǒng)文件NTLDR裝入,對(duì)于沒有安裝系統(tǒng)的分區(qū)是無效的。 結(jié)束標(biāo)志:DBR的結(jié)束標(biāo)志與MBR,EBR的結(jié)束標(biāo)志相同,為“55 AA”。 三、分析$MFT元文件 在NTFS文件系統(tǒng)中,磁盤上的所有數(shù)據(jù)都是以文件的形式存儲(chǔ),其中包括元文件。每個(gè)文件都有一個(gè)或多個(gè)文件記錄,每個(gè)文件記錄占用兩個(gè)扇區(qū),而$MFT元文件就是專門記錄每個(gè)文件的文件記錄。由于NTFS文件系統(tǒng)是通過$MFT來確定文件在磁盤上的位置以及文件的屬性,所以$MFT是非常重要的,$MFT的起始位置在DBR中有描述。$MFT的文件記錄在物理上是連續(xù)的,并且從0開始編號(hào)。$MFT的前16個(gè)文件記錄總是元文件的,并且順序是固定不變的。 四、分析文件記錄 1、文件記錄的結(jié)構(gòu) 文件記錄由兩部分構(gòu)成,一部分是文件記錄頭,另一部分是屬性列表,最后結(jié)尾是四個(gè)“FF”。如下是一個(gè)完整的文件記錄: 在同一系統(tǒng)中,文件記錄頭的長度和具體偏移位置的數(shù)據(jù)含義是不變的,而屬性列表是可變的,其不同的屬性有著不同的含義。后文將對(duì)屬性進(jìn)行具體分析,先來看看文件記錄頭的信息。 在NTFS文件系統(tǒng)中所有與文件相關(guān)的數(shù)據(jù)結(jié)構(gòu)均被認(rèn)為是屬性,包括文件的內(nèi)容。文件記錄是一個(gè)與文件相對(duì)應(yīng)的文件屬性數(shù)據(jù)庫,它記錄了文件的所有屬性。每個(gè)文件記錄中都有多個(gè)屬性,他們相對(duì)獨(dú)立,有各自的類型和名稱。每個(gè)屬性都由兩部分組成,既屬性頭和屬性體。屬性頭的前四個(gè)字節(jié)為屬性的類型。如下是以10H屬性為例的屬性結(jié)構(gòu)。 另外屬性還有常駐與非常駐之分。當(dāng)一個(gè)文件很小時(shí),其所有屬性體都可以存放在文件記錄中,該屬性就稱為常駐屬性。如果某個(gè)文件很大,1KB的文件記錄無法記錄所有屬性時(shí),則文件系統(tǒng)會(huì)在$MFT元文件之外的區(qū)域(也稱數(shù)據(jù)流)存放該文件的其他文件記錄屬性,這些存放在非$MFT元文件內(nèi)的記錄就稱為非常駐屬性。 分析屬性的屬性頭 每個(gè)屬性都有一個(gè)屬性頭,這個(gè)屬性頭包含了一些該屬性的重要信息,如屬性類型,屬性大小,名字(并非都有)及是否為常駐屬性等。 常駐屬性的屬性頭分析表: 如下是非常駐屬性的屬性頭分析表: 前面說過了,屬性的種類有很多,因此各屬性體的含義也不同。下表是NTFS文件系統(tǒng)中的所有屬性體的簡介。 接下來來看幾個(gè)重要的屬性: 分析10H屬性: 10H類型屬性它包含文件的一些基本信息,如文件的傳統(tǒng)屬性,文件的創(chuàng)建時(shí)間和最后修改時(shí)間和日期,文件的硬鏈接數(shù)等等。如下:是一個(gè)10H類型的屬性。 其中偏移0×20處的文件屬性解釋如下: 分析20H屬性 20H類型屬性既屬性列表,當(dāng)一個(gè)文件需要好幾個(gè)文件記錄時(shí),才會(huì)用到20H屬性。20H屬性記錄了一個(gè)文件的下一個(gè)文件記錄的位置。如下:是20H屬性的解釋。 分析30H屬性 30H類型屬,該屬性用于存儲(chǔ)文件名 ,它總是常駐屬性。最少68字節(jié),最大578字節(jié),可容納最大Unicode字符的文件名長度。 分析80H屬性 80H屬性是文件數(shù)據(jù)屬性,該屬性容納著文件的內(nèi)容,文件的大小一般指的就是未命名數(shù)據(jù)流的大小。該屬性沒有最大最小限制,最小情況是該屬性為常駐屬性。常駐屬性就不做多的解釋了,上面我標(biāo)記的是一個(gè)非常駐的80H屬性。 其中,Run List是最難理解,也是最重要的。當(dāng)屬性不能存放完數(shù)據(jù),系統(tǒng)就會(huì)在NTFS數(shù)據(jù)區(qū)域開辟一個(gè)空間存放,這個(gè)區(qū)域是以簇為單位的。Run List就是記錄這個(gè)數(shù)據(jù)區(qū)域的起始簇號(hào)和大小,一個(gè)Run List例子上所示。這個(gè)示例中,Run List的值為“12 41 47 03”,因?yàn)楹竺媸?0H,所以知道已經(jīng)是結(jié)尾。如何解析這個(gè)Run List呢? 第一個(gè)字節(jié)是壓縮字節(jié),高位和低位相加,1+2=3,表示這個(gè)Data Run信息占用三個(gè)字節(jié),其中高位表示起始簇號(hào)占用多少個(gè)字節(jié),低位表示大小占用的字節(jié)數(shù)。在這里,起始簇號(hào)占用1個(gè)字節(jié),值為03,大小占用2個(gè)字節(jié),值為47 41。解析后,得到這個(gè)數(shù)據(jù)流起始簇號(hào)為3,大小為18241簇。 雖然數(shù)據(jù)不一樣,但是表達(dá)的意思是一樣的。 分析90H屬性 90H屬性是索引根屬性,該屬性是實(shí)現(xiàn)NTFS的B+樹索引的根節(jié)點(diǎn),它總是常駐屬性。該屬性的結(jié)構(gòu)如下圖: 索引根的結(jié)構(gòu)如表: 索引頭的結(jié)構(gòu)如表: 索引項(xiàng)結(jié)構(gòu)如表: 分析A0H屬性 A0屬性是索引分配屬性,也是一個(gè)索引的基本結(jié)構(gòu),存儲(chǔ)著組成索引的B+樹目錄索引子節(jié)點(diǎn)的定位信息。它總是常駐屬性。如下:是一個(gè)A0H屬性的實(shí)例。 根據(jù)上圖A0H屬性的“Run List”可以找到索引區(qū)域,偏移到索引區(qū)域所在的簇,如下圖: 起始簇:18265 簇大?。? 起始扇區(qū)號(hào) = 該分區(qū)的其實(shí)扇區(qū) + 簇號(hào) * 每個(gè)簇的扇區(qū)數(shù) 也就是 64 + 18265 * 8 = 146124 對(duì)了,上面的偏移0×28還要加上0×18 = 0×40. 標(biāo)準(zhǔn)索引頭的解釋如下: 索引項(xiàng)的解釋如下: 到此一些常用屬性基本介紹的差不多了。 下面來說下遍歷一個(gè)分區(qū)下面文件列表的思路: 1、定位DBR,通過DBR可以得知“$MFT”的起始簇號(hào)及簇的大小。 2、定位“$MFT”,找到“$MFT”后,在其中尋找根目錄的文件記錄,一般在5號(hào)文件記錄。 3、在90H屬性中得到B+樹索引的根節(jié)點(diǎn)文件信息,重點(diǎn)在A0屬性上。通過屬性中的“Run List”定位到其數(shù)據(jù)流。 4、從“Run List”定位到起始簇后,再分析索引項(xiàng)可以得到文件名等信息。 5、從索引項(xiàng)中可以獲取“$MFT”的參考號(hào),然后進(jìn)入到“$MFT”找到對(duì)應(yīng)的文件記錄。 6、然后再根據(jù)80H屬性中的數(shù)據(jù)流就可以找到文件真正的數(shù)據(jù)了。 本文鏈接:http://www./detail-ntfs-filesys.html 轉(zhuǎn)載提示:除非注明,AloneMonkey的文章均為原創(chuàng),轉(zhuǎn)載請(qǐng)以鏈接形式注明作者和出處。謝謝合作! |
|