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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用tabluea分析数据的案例_利用德
- 下一篇: 删除含有关键词的文件_AweEraser