mft檔案記錄屬性頭包括 關於NTFS MFT

2021-10-13 14:34:01 字數 3352 閱讀 8882

一、ntfs檔案系統在磁碟上的分布

乙個ntfs檔案系統由引導扇區、mft(包含mft元資料)和資料區組成。

ntfs中儲存了兩份mft備份以防mft檔案損壞,兩個mft備份的具體起始位置都儲存在引導扇區中。

image.png

二、引導扇區($boot)

引導扇區是從ntfs檔案系統的第乙個扇區開始,以55 aa結尾。我們主要關注前88位元組的資訊,其中重要的就是「ntfs」標識、扇區大小、每簇扇區數、mft起始簇以及mft備份mftmirr位置這些資訊。我們可以根據mft起始簇資訊找到mft,或者根據mft備份mftmirr位置找到mft的另外乙個mft備份。如下圖所示:

image.png

1 typedef struct ntfs_bpbntfs_bpb,*pntfs_bpb;

三、主檔案表 (master file table, mft)

mft是什麼,什麼作用?

在ntfs中,整個卷的所有檔案資訊(包括mft本身、資料檔案、資料夾等等)都儲存在mft。每乙個檔案在 mft 中都有乙個或多個 mft 項記錄檔案屬性資訊。而且每項大小是固定的(一般為1kb),mft保留了前16項用於特殊檔案記錄,稱為元資料。

可以根據mft快速的找到檔案的詳細資訊和具體位置等。

image.png

1、mft項

乙個mft項包括mft頭和關於檔案的4條屬性,以ff ff ff ff結尾。

image.png

(一)mft頭部

在乙個mft項中前56位元組是mft頭部資訊,其中比較重要的是file標識、第乙個屬性的偏移和flags。

flags顯示了此檔案是否是正常檔案,或者是刪除檔案等。

image.png

1 typedef struct mft_headermft_header, *pmft_header;

(二)mft項的4個屬性

每條屬性都包含屬性頭和屬性結構。每條屬性的前4位元組顯示該屬性的型別,不同型別的屬性有不同的屬性結構。

image.png

屬性頭1 //------------------ 屬性頭通用結構 ----

2 typedef struct ntfsattribute //所有偏移量均為相對於屬性型別 type 的偏移量

3 ;22 //------- 如果該屬性為 非常駐 屬性時使用該結構 ----

23 struct cnonresident

24 ;

34 };

35 };

具體屬性頭的大小根據是否是常駐屬性來進行計算。

是否是常駐屬性根據屬性頭的第9個位元組判斷,1為非常駐,0為常駐。

如果是非常駐屬性,屬性頭大小為64;如果是常駐屬性,屬性頭大小為24位元組。

常駐和非常駐的區別:

常駐屬性是直接儲存再mft中,非常駐屬性儲存再mft之外的其他地方。如果檔案或資料夾小於1500位元組,那麼它們的所有屬性,包括內容都會常駐在mft中。

屬性結構

不同型別的屬性有不同的屬性結構,這裡主要介紹10h屬性、30h屬性和80h屬性。

(1)10h屬性 $standart_information

image.png

1 struct value0x10

2 ;關於檔案傳統屬性,對照下表:

image.png

(2)30h屬性 $file_name

這個屬性比較重要,包含了檔案的詳細資料和父目錄的參考號等。根據父目錄參考號可以知道檔案之間的父子關係,從而構建檔案的子父關係。

其實在10h屬性中已經描述了檔案的部分資訊(時間、標誌等),30h屬性主要關注父目錄的參考號、檔名命名空間和檔名。

image.png

1 struct value0x30

2 ntfs通過為乙個檔案建立多個30h屬性實現posix (portable operating system inte***ce, 可移植作業系統介面) 式硬連線,每個30h屬性都有自己的詳細資料和父目錄;乙個硬連線刪除時,就從mft中刪除這個檔名,最後乙個硬連線被刪除時,這個檔案就算是真正被刪除了。

(3)80h屬性$data

lcn(logical cluster number):整個檔案卷的相對位置,單位(簇)。

vcn(virtual cluster number):檔案內部的相對位置,單位(簇)。

1 struct value0x80

2 每個執行列表中第乙個位元組的低4位表示執行簇大小(filesize)的len,高4位表示起始簇(start)的len。如果乙個執行列表後面的第乙個位元組是00,說明執行列表結束,後面的數值暫時不用管;如果不是00,則是下乙個執行列表開始。

①非常駐-->乙個執行列表

image.png

0x00~0x3f 是屬性頭;執行列表在橘黃色框中,0x40開始,可以得到執行列表 33 40 bc 00 00 00 0c。

分析如下:

首先0x33,低4位是3,表示緊隨其後的3byte 0xbc40作為執行簇大小(簇個數),即檔案所佔總大小;高4位是3,表示簇大小之後的3個byte 0x0c0000 是起始簇,即檔案起始,這裡是說的是lcn。

②非常駐-->多個執行列表

image.png

分析如下:

第乙個執行列表,首先是0x31,低4位是1,表示緊接著的1byte(03)是執行簇大小;高4位是3,表示緊接著3byte(65 9a 00)是起始簇,這裡說的是lcn;

第二個執行列表,首先是0x11,低4位是1,表示緊接著的1byte(01)是執行簇大小;高4位是1,表示緊接著3byte(13)是起始簇,這裡說的是vcn。

注意,只有第乙個執行列表的起始簇說的是lcn,從第二個執行列表開始每個執行列表的起始簇都說的是vcn。想要得到lcn需要按下面的公式計算:

第n個執行列表的lcn = 第乙個執行列表的起始簇(lcn) + 第二個執行列表的起始簇(vcn) +...+第n個執行列表的起始簇(vcn)

③常駐image.png

四、常見問題

(一)如何從ntfs檔案系統中找到$mft檔案的起始和總大小

1、從引導扇區找到「mft起始簇」或者」mft備份mftmirr位置「;

2、根據「mft起始簇」或者」mft備份mftmirr位置「找到第乙個mft項(1kb),第乙個mft項就是$mft的屬性內容;

3、在第乙個mft項中找到80h屬性,根據80h屬性的屬性結構找到檔案起始和總大小;

4、上面3找到的就是mft檔案的起始和總大小了。

(二)mft檔案和mftmirr檔案的區別

mft檔案是對ntfs中全部mft(卷上的所有檔案,包括檔名、時間戳、流名和資料流所在的群集號列表、索引、安全識別符號以及諸如「唯讀」、「壓縮」、「加密」之類的檔案屬性)的儲存,可以根據mft檔案快速的查詢卷上的所有檔案;而mftmirr檔案是對mft檔案中比較重要項的複製,一般是4kb。

NTFS檔案系統 MFT的屬性頭

前面說過mft是有乙個個屬性組成,那麼每個屬性的具體結構又是如何呢?mft屬性的型別很多,但它們都有個共同的特點,那就是每個屬性都有屬性頭和屬性體。屬性頭又分為常駐屬性和非常駐屬性。常駐屬性和非常駐資料最大的區別是常駐屬性的只是在mft內部記錄,非常駐資料由於mft記錄不下 乙個mft項只有1024...

linux下關於檔案操作記錄

linux的fopen函式詳解 fopen 開啟檔案 相關函式 open,fclose 表頭檔案 include 定義函式 file fopen const char path,const char mode 函式說明 引數path字串包含欲開啟的檔案路徑及檔名,引數mode字串則代表著流形態。mo...

gitLab清理大檔案 包括歷史記錄中的大檔案

操作 專案中經常有不小心提交的大檔案,這個就是清理方法 後面發現了更好的方法 使用bfg快速清理git歷史大檔案 注意 清理完之後,其他人一定要刪掉之前拉取的專案,重新從git上拉專案,不要使用之前的專案了,之前的專案中的.git檔案會將已將刪除的檔案重新加進來,甚至變的更大 查詢 清理檔案的時候若...