小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

深入解析NTFS文件系統(tǒng)

 cardoo 2015-10-18

NTFS 結(jié)構(gòu)說(shuō)明


關(guān)鍵字:Windows NT NTFS 文件系統(tǒng) MFT


在Windows NT?中,Microsoft使用了一種新型的文件系統(tǒng)NTFS,它針對(duì)FAT/FAT32文件系統(tǒng)安全性差、容易產(chǎn)生碎片、難以恢復(fù)等缺點(diǎn)作了重大改進(jìn),使得系統(tǒng)總能保持較好的性能。不過(guò)使用NTFS的分區(qū)只能被Windows NT?系統(tǒng)識(shí)別和操作,而且它的結(jié)構(gòu)是Microsoft的內(nèi)部機(jī)密,沒(méi)有任何官方文檔。因此給各位需要在非Windows NT?環(huán)境讀寫(xiě)NTFS分區(qū)的編程人員帶來(lái)了巨大不便。不過(guò)好在還有很多人在研究分析它,現(xiàn)在結(jié)合網(wǎng)上搞到的一些資料和我自己的分析對(duì)NTFS作一個(gè)說(shuō)明(可惜還是有很多東西沒(méi)能搞明白)。


一、 概述


在NTFS中一改FAT/FAT32中將文件分配表等系統(tǒng)數(shù)據(jù)放在分區(qū)最前面,然后接著才是數(shù)據(jù)區(qū)的做法,把所有的信息都組織起來(lái)以文件的形式存放,包括扇區(qū)分配表,引導(dǎo)記錄等數(shù)據(jù)都是作為文件存在于磁盤(pán)中。其中只有$Boot(分區(qū)引導(dǎo)記錄)文件的位置是固定存放在分區(qū)首部,其他的文件都可以隨意存在于分區(qū)中的任何一個(gè)位置。這樣使得對(duì)所有數(shù)據(jù)的讀寫(xiě)都有一個(gè)較為統(tǒng)一的方法,而且使得改變分區(qū)的尺寸和碎片整理變得非常容易。


在NTFS分區(qū)中,存儲(chǔ)分區(qū)信息的文件被稱(chēng)為系統(tǒng)文件。在每個(gè)NTFS分區(qū)中都有十個(gè)這樣的系統(tǒng)文件,它們分別是:


$MFT


$MFTMirr


$LogFile


$Volume


$AttrDef


. (分區(qū)根目錄)


$Bitmap


$Boot


$BadClus


$Secure


$UpCase


$Extend


下面分別對(duì)每個(gè)系統(tǒng)文件的作用及所保存的信息作一個(gè)說(shuō)明:


$MFT(Master File Table)文件。這個(gè)文件是NTFS分區(qū)中最重要的文件,它記錄了分區(qū)中所有文件(包括$MFT自身)的基本信息。通過(guò)$MFT就可以訪(fǎng)問(wèn)分區(qū)中的所有文件和系統(tǒng)數(shù)據(jù)。$MFT由多個(gè)MFT記錄單元組成,每一個(gè)文件的描述占用一到多個(gè)(一個(gè)不夠的情況下)$MFT記錄單元。其中前十二個(gè)記錄單元中記錄著上面的十二個(gè)系統(tǒng)文件的信息。每個(gè)記錄單元記錄著文件的建立時(shí)間、在分區(qū)中的位置、長(zhǎng)度、屬性、文件名等信息。信息在MFT單元中用各種屬性來(lái)表示,不同的屬性代表著不同的信息,而文件或目錄中的內(nèi)容則表現(xiàn)為屬性中的外部或內(nèi)部(取決于數(shù)據(jù)的長(zhǎng)度)附加數(shù)據(jù)。其記錄格式見(jiàn)下面的MFT格式說(shuō)明。


$MFTMirr(Mirror of Master File Table) 文件。這個(gè)文件是$MFT文件的一個(gè)備份,它保存著$MFT文件前4個(gè)記錄單元的信息。格式同$MFT。


$LogFile文件。記錄中對(duì)分區(qū)的操作的日志信息。(日志記錄具體格式不明)


$Volume文件。保存著分區(qū)建立時(shí)間,分區(qū)版本等信息。


$AttrDef文件。記錄的MFT單元中的屬性的基本信息,包括屬性的名字,最大最小尺寸等


. (分區(qū)根目錄)文件。作用同F(xiàn)AT/FAT32中的根目錄,但記錄格式有所變化。關(guān)于記錄格式的描述請(qǐng)參考目錄項(xiàng)存儲(chǔ)區(qū)格式。


$Bitmap文件。記錄著分區(qū)中存儲(chǔ)單元(簇)使用狀況。類(lèi)似于FAT/FAT32中的FAT表,但不以索引的形式記錄,而是每一個(gè)Bit表示一個(gè)簇。其值為1表示該簇已被使用,為0則表示空閑。


$Boot文件。NTFS分區(qū)的引導(dǎo)記錄。在NTFS分區(qū)引導(dǎo)系統(tǒng)時(shí)負(fù)責(zé)將NTLDR裝入內(nèi)存并將控制權(quán)交給它。其中記錄著分區(qū)的總扇區(qū)數(shù),分區(qū)中每個(gè)存儲(chǔ)單元(簇)包含的扇區(qū)數(shù),$MFT所在的簇的簇號(hào),$MFTMirr所在的簇的簇號(hào)和分區(qū)引導(dǎo)例程等重要信息。其格式見(jiàn)后面的$Boot文件格式說(shuō)明。注意:在NTFS分區(qū)中$Boot文件的位置固定在分區(qū)開(kāi)始處。


$BadClus文件。似乎是記錄著分區(qū)中有效(可以正常使用)的簇的個(gè)數(shù)和分區(qū)有效容量(以字節(jié)為單位)。因?yàn)槲沂掷餂](méi)有有壞道的硬盤(pán),所以不敢肯定。


$Secure文件。就其名而言似乎是系統(tǒng)安全描述,不過(guò)沒(méi)有研究過(guò)。


$UpCase文件。Unicode編碼下的大寫(xiě)字母表(?)。


$Extend文件。用于和HPFS兼容的信息(?)。


二、 讀寫(xiě)操作流程


在非NT的系統(tǒng)中對(duì)NTFS分區(qū)中的文件進(jìn)行自由的讀寫(xiě)操作才是我們研究NTFS分區(qū)格式的最終目標(biāo)。下面我就對(duì)整個(gè)讀操作的流程來(lái)一個(gè)說(shuō)明:


首先從硬盤(pán)的分區(qū)表中計(jì)算出分區(qū)開(kāi)始的位置,再讀取分區(qū)數(shù)據(jù)區(qū)中的第一個(gè)扇區(qū)($Boot文件的第一個(gè)扇區(qū))從中取得隱藏扇區(qū)數(shù)目,$MFT開(kāi)始的簇號(hào),每簇扇區(qū)數(shù),每個(gè)MFT記錄的尺寸。通過(guò)這些數(shù)據(jù)計(jì)算出$MFT所在的位置,讀取第一個(gè)MFT記錄,然后按照記錄中描述的$MFT文件的存放位置讀出文件名為“.”的MFT記錄(根目錄文件)。然后在該記錄中搜索要求的目錄項(xiàng)。找到以后,獲得它的描述在$MFT中的索引,再在其中尋找下級(jí)目錄的索引……直到找到為止。


三、 改變分區(qū)尺寸操作流程


NTFS分區(qū)的尺寸只與四個(gè)記錄有關(guān):


1、$Boot文件的第一個(gè)扇區(qū)中的分區(qū)扇區(qū)數(shù)。


2、分區(qū)最后一個(gè)扇區(qū)中的$Boot文件第一扇區(qū)的備份。


3、系統(tǒng)文件$Bitmap的尺寸。


4、系統(tǒng)文件$BadClus中的有效簇描述。


因此修改NTFS分區(qū)的尺寸就比修改FAT/FAT32分區(qū)的尺寸要容易得多。只需要改變前兩處的分區(qū)扇區(qū)數(shù),再調(diào)整$Bitmap文件的尺寸即可。因?yàn)榍皟商幍男薷氖秩菀?,這里就只講解一下如何修改后兩處。


首先在$MFT文件中找到分區(qū)根目錄的位置,讀取根目錄記錄,從中找到$Bitmap文件所在的項(xiàng),修改其占用的存儲(chǔ)器空間和實(shí)際尺寸并保存。然后按照該項(xiàng)的描述讀出$MFT中描述$Bitmap文件的記錄,修改其文件屬性中的VCN結(jié)束段的索引號(hào)、占用空間數(shù)、數(shù)據(jù)尺寸、有效數(shù)據(jù)尺寸并適當(dāng)?shù)卦?減$Bitmap文件的數(shù)據(jù)流描述,如需要的話(huà)還要調(diào)整它的$Ddata屬性的尺寸。再修改$Bitmap文件的內(nèi)容以標(biāo)志出文件中新添/縮減的簇。


其次是修改$BadClus文件中第二個(gè)$Data屬性中的VCN結(jié)束段索引、占用空間數(shù)、數(shù)據(jù)尺寸、有效數(shù)據(jù)尺寸及數(shù)據(jù)流描述。但要注意!在$BadClus文件中記錄的是整個(gè)分區(qū)中沒(méi)有問(wèn)題的簇?cái)?shù)及其描述,與$Bitmap文件中修改的值不同。


然后……天下太平了。


記錄格式說(shuō)明


一、 MFT記錄頭


偏移地址占用字節(jié)數(shù)描述


0H4MFT記錄標(biāo)志,ASCII字符串:“FILE”


4H2修正值的偏移地址(關(guān)于修正值請(qǐng)參考修正值技術(shù))


6H2修正值個(gè)數(shù)+1 S


10H2序列號(hào)(?)


12H2鏈接計(jì)數(shù)(?)


14H2屬性數(shù)據(jù)的偏移地址


16H2(1?)數(shù)據(jù)標(biāo)志,Bit0為1表示有外部數(shù)據(jù),Bit1為1表示當(dāng)前記錄是一個(gè)目錄項(xiàng)


18H4本MFT記錄用到的存儲(chǔ)空間(包括記錄頭和數(shù)據(jù))


1CH4本MFT記錄占用的存儲(chǔ)空間


20H8(?)如果本MFT記錄是從MFT記錄,則存放主MFT記錄在$MFT中的位置,否則為0


28H2不一個(gè)自由屬性的ID(?)


2AHS*2修正值表


二、 屬性記錄頭


偏移地址占用字節(jié)數(shù)描述


0H4屬性類(lèi)型,關(guān)于屬性類(lèi)型請(qǐng)參考屬性類(lèi)型描述


4H2本記錄尺寸


8H1外部數(shù)據(jù)標(biāo)志,為0則表示數(shù)據(jù)是內(nèi)部數(shù)據(jù),就根在記錄頭后面,為1則表示屬性數(shù)據(jù)是外部數(shù)據(jù),需要另外讀取


9H1記錄名(如果有的話(huà))或內(nèi)部數(shù)據(jù)尺寸


0AH2記錄名(如果有的話(huà))或內(nèi)部數(shù)據(jù)相對(duì)于記錄開(kāi)始位置的偏移地址


0CH2壓縮標(biāo)志,為1表示文件被壓縮


0EH2屬性ID(?)


對(duì)于內(nèi)部數(shù)據(jù)或記錄名


10H4數(shù)據(jù)尺寸


14H2數(shù)據(jù)相對(duì)于記錄開(kāi)始位置的偏移地址


16H2屬性索引標(biāo)志(?)


對(duì)于外部數(shù)據(jù)


10H8本段數(shù)據(jù)起始簇號(hào)(注:這里的簇不同于分區(qū)存儲(chǔ)單元的簇)


18H8本段數(shù)據(jù)結(jié)束簇號(hào)


20H2數(shù)據(jù)存儲(chǔ)位置描述區(qū)相對(duì)于記錄開(kāi)始位置的偏移


22H2壓縮引擎序號(hào)(?)


28H8本段數(shù)據(jù)占用的存儲(chǔ)空間


30H8本段數(shù)據(jù)的尺寸


38H8已初始化的數(shù)據(jù)的尺寸


40H8數(shù)據(jù)壓縮后的尺寸


記錄格式:首先是記錄名(如果有記錄名),緊接著就是內(nèi)部數(shù)據(jù)或外部數(shù)據(jù)索引。關(guān)于外部數(shù)據(jù)索引請(qǐng)參考:外部數(shù)據(jù)索引格式


三、 屬性類(lèi)型


屬性名屬性值描述


$Standard_Information10H基本信息



$Attribute_List20H擴(kuò)展數(shù)據(jù)屬性描述(用于在一個(gè)MFT記錄中裝不下文件的描述時(shí)指出附加的MFT)


$File_Name30H存放文件名,建立時(shí)間,修改時(shí)間,最后一次操作時(shí)間,文件尺寸等信息


$Object_ID40H不詳


$Security_Descriptor50H不詳


$Volume_Name60H分區(qū)卷標(biāo)信息


$Volume_Information70H分區(qū)版本信息


$Data80H附加數(shù)據(jù)


$Index_Root90H目錄項(xiàng)


$Index_Allocation0A0H目錄項(xiàng)數(shù)據(jù)


$Bitmap0B0H存儲(chǔ)單元位圖(注:這里的存儲(chǔ)單元位圖的作用域僅限于本MFT記錄,而$Bitmap文件的作用域是整個(gè)分區(qū))


$Reparse_Point0C0H不詳


$EA_Information0D0H不詳


$EA0E0H不詳


$Logged_Untility_Stream0F0H不詳


四、 屬性數(shù)據(jù)格式


1、$Standard_Information


偏移地址占用字節(jié)數(shù)描述


0H8文件創(chuàng)建時(shí)間


8H8文件最后一次修改的時(shí)間


10H8文件記錄最后一次修改的時(shí)間


18H8最后一次操作文件的時(shí)間


20H4DOS文件屬性


24H0CH+不詳,似乎總為0


其中DOS文件屬性字各Bit的意義描述如下:


Bit描述


0只讀


1隱藏


2系統(tǒng)


5歸檔


18符號(hào)鏈接(?)


19壓縮(?)



2、$Attribute_List


3、$File_Name


偏移地址占用字節(jié)數(shù)描述


0H4包含該文件的文件記錄在$MFT中的索引


6H2不詳


8H8(?)時(shí)間


10H8(?)時(shí)間


18H8(?)時(shí)間


20H8(?)時(shí)間


28H8文件占用的存儲(chǔ)器空間


30H8文件的實(shí)際尺寸


38H8文件屬性,其具體描述請(qǐng)參考$Standard_Information


40H1文件名字符串長(zhǎng)度(Unicode)


41H1文件名類(lèi)型


42H[40H]*2Unicode碼文件名


其中文件名類(lèi)型的說(shuō)明如下:


值描述


0POSIX


1Unicode


2DOS(8.3)


3Unicode、DOS通用



4、$Object_ID


5、$Security_Descriptor


6、$Volume_Name


$Volume_Name屬性的數(shù)據(jù)就是Unicode編碼的分區(qū)卷標(biāo)。 7、$Volume_Information


7、$Volume_Information


$Volume_Information屬性中記錄了分區(qū)的版本號(hào)等信息。


偏移地址占用字節(jié)數(shù)描述


8H1主版本號(hào)


9H1子版本號(hào)


0AH1磁盤(pán)查錯(cuò)標(biāo)志,為1表示需要在啟動(dòng)時(shí)運(yùn)行磁盤(pán)查錯(cuò)程序


8、$Data


$Data屬性的數(shù)據(jù)由用戶(hù)自己定義。關(guān)于系統(tǒng)常用的VCN和LCN的格式請(qǐng)參考數(shù)據(jù)流描述。


9、$Index_Root


$Index_Root屬性中記錄著目錄中的文件或子目錄的目錄項(xiàng)信息,


偏稱(chēng)地址占用字節(jié)數(shù)描述


0H4


4H4


8H4


0CH4目錄項(xiàng)存儲(chǔ)區(qū)尺寸


10H4


14H4


18H4


1CH2是否使用目錄項(xiàng)存儲(chǔ)區(qū)標(biāo)志


1EH2


10、$Index_Allocation


其數(shù)據(jù)是描述目錄項(xiàng)數(shù)據(jù)位置的數(shù)據(jù)流描述。


11、$Bitmap


其數(shù)據(jù)是以一Bit代表一個(gè)分配單元的存儲(chǔ)狀態(tài)位圖。為1則表示該簇已經(jīng)被使用,為0則表示該簇空閑。


12、$Reparse_Point


作用不明


13、$EA_Information


作用不明


14、$EA


作用不明


15、$Logged_Untility_Stream


作用不明


五、 目錄項(xiàng)存儲(chǔ)區(qū)格式


偏移地址占用字節(jié)數(shù)描述


0H4目錄項(xiàng)存儲(chǔ)區(qū)標(biāo)識(shí):“INDX”


4H2修正值表相對(duì)于存儲(chǔ)區(qū)開(kāi)始處的偏移


6H2修正項(xiàng)個(gè)數(shù)+1


10H8


18H2記錄頭尺寸


1CH4存儲(chǔ)區(qū)中有效數(shù)據(jù)的尺寸


20H4存儲(chǔ)區(qū)最大可用尺寸(除去記錄頭18H字節(jié))


24H4


28HA+修正值表


18H+ 目錄項(xiàng)記錄


其中目錄項(xiàng)記錄的格式如下:


偏移地址占用字節(jié)數(shù)描述


0H4包含該文件的文件記錄在$MFT中的索引


6H2不詳


8H2本記錄尺寸


0AH2該文件的文件名屬性記錄尺寸(?)


10H8存放此記錄的目錄在_MFT中的索引(父目錄索引)


18H8


20H8


28H8


30H8修改時(shí)間


38H8文件占用的存儲(chǔ)空間


40H8文件的實(shí)際尺寸


48H8


50H1文件名字符串長(zhǎng)度(Unicode)


51H1文件名類(lèi)型。關(guān)于文件名類(lèi)型的描述請(qǐng)參考前面的$File_Name屬性的說(shuō)明


52H[50H]*2Unicode編碼的文件名



修正值技術(shù):


使用修正值技術(shù)的目的是用來(lái)確定記錄是否被完全正確地寫(xiě)入存儲(chǔ)設(shè)備。所有的重要數(shù)據(jù)都使用的這項(xiàng)技術(shù)。這些重要數(shù)據(jù)包括MFT記錄,目錄項(xiàng)記錄和日志記錄。


修正值技術(shù)是通過(guò)往每個(gè)記錄的最末兩個(gè)字節(jié)寫(xiě)入一個(gè)特定的校驗(yàn)值來(lái)實(shí)現(xiàn)寫(xiě)操作檢驗(yàn)的,但一個(gè)記錄通常會(huì)多于一個(gè)扇區(qū),而且在進(jìn)行寫(xiě)操作時(shí)我們并不知道扇區(qū)寫(xiě)入時(shí)的順序,因此只好在每個(gè)扇區(qū)的最后兩個(gè)字節(jié)都寫(xiě)入校驗(yàn)值。


它的操作流程如下:


1、 寫(xiě)操作


首先在內(nèi)存中將修正值加1,然后用它替換緩沖區(qū)中每個(gè)扇區(qū)最后兩個(gè)字節(jié)處的數(shù)據(jù),把被替換的數(shù)據(jù)存放到修正值表中;再把所有數(shù)據(jù)寫(xiě)入存儲(chǔ)設(shè)備。


2、 讀操作


首先把整個(gè)記錄讀入內(nèi)存中,檢查記錄標(biāo)志(如FILE或INDX等)是否正確;然后檢查每個(gè)扇區(qū)的最后兩字節(jié)是否與修正值相同,如不同則表明在上次寫(xiě)操作時(shí)發(fā)生了錯(cuò)誤;如果修正值檢查通過(guò),就將修正值表中的原始數(shù)據(jù)還原到相應(yīng)的位置,然后就可以進(jìn)行其他操作了。


數(shù)據(jù)流描述


在NTFS分區(qū)中最基本的存儲(chǔ)單元是數(shù)據(jù)流,每個(gè)數(shù)據(jù)流由它的起始簇號(hào)和尺寸來(lái)描述。一個(gè)數(shù)據(jù)流的起始簇號(hào)是相對(duì)于上一簇的開(kāi)始位置的偏移而不是絕對(duì)簇號(hào),而且描述流起始簇號(hào)和尺寸的域都是可變長(zhǎng)度的。流描述的第一個(gè)字節(jié)指明了它們兩者的尺寸,其中高4Bit指明描述起始簇的域的尺寸,低4Bit則指明了流尺寸域的尺寸。當(dāng)一個(gè)流描述的第一個(gè)字節(jié)為0里就表示該流已經(jīng)結(jié)束。


現(xiàn)舉例如下。


設(shè)有一段數(shù)據(jù)流描述:21 20 ED 05 22 48 07 48 22 21 28 C8 DB


第一個(gè)數(shù)據(jù)流:開(kāi)始于簇5EDH的20H個(gè)簇(5EDH-60CH)


第二個(gè)數(shù)據(jù)流:開(kāi)始于簇2835H的748H個(gè)簇(2835H=5EDH+2248H)


第三個(gè)數(shù)據(jù)流:開(kāi)始于簇3FDH的28H個(gè)簇(3FDH=2835H+0DBC8H)



注意:這里的數(shù)據(jù)流偏移值是一個(gè)有符號(hào)數(shù)!


$Boot文件結(jié)構(gòu)


作為分區(qū)引導(dǎo)時(shí)被執(zhí)行的第一段代碼,$Boot有著為整個(gè)系統(tǒng)開(kāi)路的重要作用,它是NTFS分區(qū)中唯一一個(gè)位置固定不變的文件;在它里面又存儲(chǔ)著$MFT的位置,分區(qū)尺寸等重要數(shù)據(jù)。文件系統(tǒng)驅(qū)動(dòng)程序必須讀取其中的數(shù)據(jù)才能定位$MFT,才能對(duì)整個(gè)分區(qū)進(jìn)行操作。因此在這里也需要將它的結(jié)構(gòu)作一個(gè)說(shuō)明。


偏移地址占用字節(jié)數(shù)描述


0H 3跳轉(zhuǎn)到啟動(dòng)例程的指令


3H 34NTFS分區(qū)標(biāo)志:“NTFS”


BH 72每扇區(qū)字節(jié)數(shù)


DH 91每簇扇區(qū)數(shù)


EH 102保留扇區(qū)數(shù)


10H 121FAT個(gè)數(shù)(為了與FAT/FAT32的BPB兼容,值為0)


11H 132根目錄項(xiàng)數(shù),值為0


13H 152分區(qū)扇區(qū)數(shù),值為0


15H 171存儲(chǔ)介質(zhì)(硬盤(pán)為F8)


16H 182每個(gè)FAT占用扇區(qū)數(shù),值為0


18H 202每道扇區(qū)數(shù)


1AH 222磁頭數(shù)


1CH 244隱藏扇區(qū)數(shù)


20H 284分區(qū)扇區(qū)數(shù),值為0


24H 321物理設(shè)備號(hào)(每一個(gè)硬盤(pán)為80H)


25H 331未用


26H 342保留,值為80H


28H 368分區(qū)扇區(qū)數(shù)-1


30H 448$MFT第一簇簇號(hào)


38H 528$MFTMirr第一簇簇號(hào)


40H 531每個(gè)文件記錄占用的簇?cái)?shù),具體描述請(qǐng)見(jiàn)表后注釋


44H 544每個(gè)目錄項(xiàng)存儲(chǔ)區(qū)占用的簇?cái)?shù),具體描述同上


48H 588分區(qū)序列號(hào)


分區(qū)引導(dǎo)例程


注:每個(gè)文件記錄占用的簇?cái)?shù)如果為否值則表明記錄尺寸小于簇尺寸,此時(shí)計(jì)算文件記錄尺寸的方法應(yīng)該是:記錄占用的字節(jié)數(shù)=1<<(~每文件記錄占用簇?cái)?shù))。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多