日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mft文件记录属性头包括_关于NTFS-MFT

發布時間:2023/12/4 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mft文件记录属性头包括_关于NTFS-MFT 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、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_BPB{     // 在cmd 輸入 fsutil fsinfo ntfsinfo d: 查詢 NTFS 信息

2 UCHAR jmpCmd[3];

3 UCHAR s_ntfs[8]; // "NTFS " 標志

4 // 0x0B

5 UCHAR bytesPerSec[2]; // 0x0200  扇區大小,512B

6 UCHAR SecsPerClu; // 0x08   每簇扇區數,4KB

7 UCHAR rsvSecs[2]; //       保留扇區

8 UCHAR noUse01[5]; //

9 // 0x15

10 UCHAR driveDscrp; // 0xF8 磁盤介質 -- 硬盤

11 UCHAR noUse02[2]; //

12 // 0x18

13 UCHAR SecsPerTrack[2]; //  0x003F  每道扇區數 63

14 UCHAR Headers[2]; //  0x00FF 磁頭數

15 UCHAR secsHide[4]; //  0x3F  隱藏扇區

16 UCHAR noUse03[8]; //

17 // 0x28

18 UCHAR allSecsNum[8]; // 卷總扇區數, 高位在前, 低位在后

19 // 0x30

20 UCHAR MFT_startClu[8]; // MFT 起始簇

21 UCHAR MFTMirr_startClu[8]; // MTF 備份 MFTMirr 位置

22 //0x40

23 UCHAR cluPerMFT[4];     // 每記錄簇數 0xF6

24 UCHAR cluPerIdx[4];     // 每索引簇數

25 //0x48

26 UCHAR SerialNum[8];    // 卷序列號

27 UCHAR checkSum[8];     // 校驗和

28 }Ntfs_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_HEADER{

2 UCHAR mark[4]; // "FILE" 標志

3 UCHAR UsnOffset[2]; // 更新序列號偏移     30 00

4 UCHAR usnSize[2]; // 更新序列數組大小+1   03 00

5 UCHAR LSN[8]; // 日志文件序列號(每次記錄修改后改變) 58 8E 0F 34 00 00 00 00

6 // 0x10

7 UCHAR SN[2]; // 序列號 隨主文件表記錄重用次數而增加

8 UCHAR linkNum[2]; // 硬連接數 (多少目錄指向該文件) 01 00

9 UCHAR firstAttr[2]; // 第一個屬性的偏移  38 00

10 UCHAR flags[2]; // 0已刪除 1正常文件 2已刪除目錄 3目錄正使用

11 // 0x18

12 UCHAR MftUseLen[4]; // 記錄有效長度  A8 01 00 00

13 UCHAR maxLen[4]; // 記錄占用長度   00 04 00 00

14 // 0x20

15 UCHAR baseRecordNum[8]; // 索引基本記錄, 如果是基本記錄則為0

16 UCHAR nextAttrId[2]; // 下一屬性Id  07 00

17 UCHAR border[2]; //

18 UCHAR xpRecordNum[4]; // 用于xp, 記錄號

19 // 0x30

20 UCHAR USN[8];       // 更新序列號(2B) 和 更新序列數組

21 }Mft_Header, *pMft_Header;

(二)MFT項的4個屬性

每條屬性都包含屬性頭和屬性結構。每條屬性的前4字節顯示該屬性的類型,不同類型的屬性有不同的屬性結構。

image.png

屬性頭

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

2 typedef struct NTFSAttribute //所有偏移量均為相對于屬性類型 Type 的偏移量

3 {

4 UCHAR Type[4]; // 屬性類型 0x10, 0x20, 0x30, 0x40,...,0xF0,0x100

5 UCHAR Length[4]; // 屬性的長度

6 UCHAR NonResidentFiag; // 是否是非常駐屬性,l 為非常駐屬性,0 為常駐屬性 00

7 UCHAR NameLength; // 屬性名稱長度,如果無屬性名稱,該值為 00

8 UCHAR ContentOffset[2]; // 屬性內容的偏移量 18 00

9 UCHAR CompressedFiag[2]; // 該文件記錄表示的文件數據是否被壓縮過 00 00

10 UCHAR Identify[2]; // 識別標志 00 00

11 //--- 0ffset: 0x10 ---

12 //-------- 常駐屬性和非常駐屬性的公共部分 ----

13 union CCommon

14 {

15 //---- 如果該屬性為 常駐 屬性時使用該結構 ----

16 struct CResident

17 {

18 UCHAR StreamLength[4]; // 屬性值的長度, 即屬性具體內容的長度。"48 00 00 00"

19 UCHAR StreamOffset[2]; // 屬性值起始偏移量 "18 00"

20 UCHAR IndexFiag[2]; // 屬性是否被索引項所索引,索引項是一個索引(如目錄)的基本組成 00 00

21 };

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

23 struct CNonResident

24 {

25 UCHAR StartVCN[8]; // 起始的 VCN 值(虛擬簇號:在一個文件中的內部簇編號,0起)

26 UCHAR LastVCN[8]; // 最后的 VCN 值

27 UCHAR RunListOffset[2]; // 運行列表的偏移量

28 UCHAR CompressEngineIndex[2]; // 壓縮引擎的索引值,指壓縮時使用的具體引擎。

29 UCHAR Reserved[4];

30 UCHAR StreamAiiocSize[8]; // 為屬性值分配的空間 ,單位為B,壓縮文件分配值小于實際值

31 UCHAR StreamRealSize[8]; // 屬性值實際使用的空間,單位為B

32 UCHAR StreamCompressedSize[8]; // 屬性值經過壓縮后的大小, 如未壓縮, 其值為實際值

33 };

34 };

35 };

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

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

如果是非常駐屬性,屬性頭大小為64;如果是常駐屬性,屬性頭大小為24字節。

常駐和非常駐的區別:

常駐屬性是直接保存再MFT中,非常駐屬性保存再MFT之外的其他地方。如果文件或文件夾小于1500字節,那么它們的所有屬性,包括內容都會常駐在MFT中。

屬性結構

不同類型的屬性有不同的屬性結構,這里主要介紹10H屬性、30H屬性和80H屬性。

(1)10H屬性 $STANDART_INFORMATION

image.png

1 struct Value0x10

2 {

3 UCHAR fileCreateTime[8]; // 文件創建時間

4 UCHAR fileChangeTime[8]; // 文件修改時間

5 UCHAR MFTChangeTime[8]; // MFT修改時間

6 UCHAR fileLatVisited[8]; // 文件最后訪問時間

7 UCHAR tranAtrribute[4]; // 文件傳統屬性

8 UCHAR otherInfo[28]; // 版本,所有者,配額,安全等等信息(詳細略)

9 UCHAR updataNum[8]; // 文件更新序列號

10 };

關于文件傳統屬性,對照下表:

image.png

(2)30H屬性 $FILE_NAME

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

其實在10H屬性中已經描述了文件的部分信息(時間、標志等),30H屬性主要關注父目錄的參考號、文件名命名空間和文件名。

image.png

1 struct Value0x30

2 {

3 UCHAR parentFileNum[8]; // 父目錄的文件參考號,前 6B 的文件記錄號,后 2B 的文件引用計數;當文件記錄號為0x05時,是根目錄。

4 UCHAR createTime[8]; // 文件創建時間

5 UCHAR changeTime[8]; // 文件修改時間

6 UCHAR MFTchangeTime[8]; // MFT 修改時間

7 UCHAR lastVisitTime[8] // 最后一次訪問時間

8 UCHAR AllocSize[8]; // 文件分配大小

9 UCHAR realSize[8]; // 實際大小

10 UCHAR fileFlag[4]; // 文件標志,系統 隱藏 壓縮等等

11 UCHAR EAflags[4] // EA擴展屬性和重解析點

12 UCHAR nameLength; // 文件名長

13 UCHAR nameSpace; // 文件命名空間:0 --- POSIX, 1 -- Win32, 2 --- DOS, 3 --- Win32 & DOS

14 //----- Name (Unicode編碼) 長度為 2 * nameLength ----

15 }

NTFS通過為一個文件創建多個30H屬性實現POSIX (Portable Operating System Interface, 可移植操作系統接口) 式硬連接,每個30H屬性都有自己的詳細資料和父目錄;一個硬連接刪除時,就從MFT中刪除這個文件名,最后一個硬連接被刪除時,這個文件就算是真正被刪除了。

(3)80H屬性$DATA

LCN(logical cluster number):整個文件卷的相對位置,單位(簇)。

VCN(virtual cluster number):文件內部的相對位置,單位(簇)。

1 struct Value0x80

2 {

3 UCHAR len; // 低4位表示運行簇大小的len,高4位表示起始簇的len

4 UCHAR *filesize; // 運行簇大小

5 UCHAR *start; // 起始簇 LCN/VCN

6 }

每個運行列表中第一個字節的低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。

總結

以上是生活随笔為你收集整理的mft文件记录属性头包括_关于NTFS-MFT的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。