汪賢鋒,黃茂成
NTFS文件系統以其出色的安全性和穩定性,已經成為主流的文件系統。NTFS將分區中的所有數據都以文件的方式,記錄在主文件表(Main File Table,MFT)記錄中,每條MFT記錄都分配同樣大小的空間描述文件(夾)。每個文件(夾)都對應一個或多個MFT記錄,文件(夾)的所有相關信息(如文件名、數據、大小等)都作為屬性登記中MFT記錄中,當文件屬性信息(如數據)超過MFT記錄分配空間大小,則在文件記錄中以非常駐屬性保留該屬性內容的索引,否則以常駐屬性記錄該屬性內容。NTFS文件系統的存儲組織結構如圖1所示,其中MFT記錄在定位文件(夾)起到了重要的橋梁作用。
NTFS以簇為基本單位分配回收存儲空間[1],與FAT結構不同,NTFS卷(volume)從 0 扇區開始劃分簇,每簇為 1,2,4 或8個扇區,根據分區的大小不同,最大值不超過8扇區,格式化時可以以格式化參數的形式設定。而在FAT中,由于卷管理空間的限制,只能通過增加簇大小來管理大容量硬盤,較NTFS文件系統,容易造成存儲空間的浪費。NTFS簇大小,即每簇扇區數保存在BOOT扇區 (0扇區)。同時,NTFS通過Bitmap文件記錄所有簇的使用情況,1個bit對應一個簇,值為1表示已經分配,為0表示未分配。FAT文件系統中的FAT表不僅記錄了數據簇的使用情況,還標明了數據簇的鏈接關系。
NTFS使用邏輯簇號(logical cluster number,LCN)和虛擬簇號(virtual cluster number,VCN)來對簇進行定位。LCN是對卷中所有簇頭到尾進行簡單編號,VCN則是對屬于特定文件的簇從頭到尾進行編號,以便訪問文件中的數據,LCN是無符號整數,而VCN則是帶符號整數,VCN可以映射成LCN,由Data Runs數組完成這個映射。NTFS數據區管理不是采用鏈接存儲,而是采用索引存儲[2],文件通過自己的Data Runs數據建立索引表,一個Run就是一個連續存儲塊,Data Runs數組由若干Run組成,以0x00結束。
每個Run包括3部分,即頭部,占用簇數,起始簇號。簇號用VCN,第一個VCN是相對于0簇。頭部占用1個字節,存放占用簇數和起始簇號的字節數根據頭部確定。如對于以下十六進制數據表示的Data Runs數組為:
0x12 D4 38 04 00
其中,根據頭部0x12取其高4位可知1字節(值為隨后D4)表示占用簇數,取低4位可知2字節(值為3804),即表示0x0438簇開始的0xD4個簇。而隨后的0x00表示Data Runs數組已到數組尾部。
假設一個文件的存儲分布的Data Runs數組為:
0x12 D4 38 04 31 28 D0 49 01 21 CB FF 00
則分解成4個Run:
12 D4 38 04,31 28 D0 49 01,21 23 CB FF,00
即文件存儲在3個連續塊:
(1)Run 1:0x0438簇開始的0xD4個簇。
(2)Run 2:0x0149D0+0x0438=0x014E08簇開始的0x28個簇。
(3)Run 3:這里 VCN為 0xFFCB=-0x35,則與前面 Run的起始簇號累計為0x014E08-0x35=0x014DD3開始的0x23個簇,這里將VCN 0xFFCB換算成LCN,它相對于前一起始地址0x014E08。
(4)Run 4:0x00,Data Runs數組到達尾部。
由上可知,文件的存儲地址并不是完全依次連續增加的,而是依據數據簇的分配算法得出的。
NTFS卷上的任何事物都是文件,文件在卷上的位置都是通過主文件表(master file table,MFT)記錄來確定的,其組織結構圖如圖1所示。MFT是一個對應的數據庫,由一系列的文件記錄組成,以下稱其為MFT記錄。卷中每一個文件都有一個MFT記錄 (對于大型文件還可能有多個MFT記錄與之對應),同時,MFT自身也有一個文件,也有其文件記錄。MFT的每個MFT記錄都有一個ID號,這個ID號從0開始,以遞增的方式順序編號。MFT自身是NTFS系統的第一個文件$MFT,其開始簇號在BOOT扇區中保存,與其他23個系統文件,他們組成系統的元文件(Metafiles),其中根目錄占用ID號為5的文件記錄。用戶的文件MFT記錄ID號從24開始分配,用戶每添加一個文件ID號加1。
當某個文件被刪除時,其所對應的MFT記錄由系統回收,該ID號記錄為空閑,同時,再次添加文件時,系統則優先給該文件記錄分配ID號小的空位。

1 NTFS文件系統存儲結構圖Fig.1 File storage structure in NTFS file system
文件記錄包含文件的所有信息,不同信息以不同屬性來表示,如文件名、文件時間標記等都是屬性,文件的內容也是一個屬性,每個屬性都有特定的特征碼。屬性數據較小時則存放在MFT記錄中,稱它們為常駐屬性(resident attribute),否則MFT記錄中只會保存該屬性索引到外部的地址,以及索引區的大小,稱此類屬性為非常駐屬性(non-resident attribute),通過Data Runs來保存其存儲索引表。當文件被放入回收站,且清空回收站時,該文件的MFT記錄在文件系統中被標明為空閑但不會被立即清除,其MFT記錄仍完整的保留,可以根據其MFT記錄的文件名屬性(0x30屬性)得到其完整文件名,返查其父目錄MFT記錄號,然后向上逐級返查,直至根目錄,從而得到該文件包含文件路徑的完整文件名。同時,該文件的MFT記錄中保持文件的數據屬性,通過其可以定位到文件的數據本身。而文件的路徑信息作為電子證據的一個重要組成部分,能提高電子證據的可采用性及證明力。
而在FAT文件系統只在目錄區保存了文件的首簇號,需要通過FAT表的簇鏈接關系才能確定文件的全部位置。當FAT文件系統中的文件被用戶放入回收站,并清空回收站時,該文件的相應占用簇在FAT表中被置為空閑,如果該文件的占用簇不連續,則無法完整定位到該文件。同時在目錄區的目錄登記項的首字節被置為0xE5,而目錄項的前八個字節記錄的是其文件名,后三個字節為后綴名,對于文件夾,則其后綴名為空。對于長文件名,FAT文件系統通過短文件名加長文件名的方式,增加新的目錄項記錄長文件名,解決長文件名問題。如果文件長度為1,則其文件名丟失,而文件的目錄登記項只記錄文件的首簇,即文件大小,如果文件不是連續簇存放,則無法完整的恢復文件。如果兩個刪除文件名只有首字節不同,則其刪除后的目錄登記項中的文件名信息則完全相同,從而降低了電子證據的可采用性及證明力。
電子取證中,為了保持文件的原始性,不能調用操作系統的文件操作命令,同時對于清空回收站的文件擦除,在操作系統的目錄視窗中已無法找到該文件。因此,應該根據文件的存儲結構直接訪問相應的物理扇區,其文件遍歷及定位流程可以歸納為以下幾個步驟。
(1)由BOOT扇區 (通常為0扇區)的BPB結構中得到$MFT的邏輯簇號(logical Cluster Number,LCN)定位到$MFT,進行下一步。
(2)定位到ID號為5的MFT記錄,即根目錄MFT記錄,進行下一步。
(3)如果該MFT記錄對應文件,則根據其常駐屬性或非常駐屬性讀取文件內容,轉至步驟(5);如果該MFT記錄對應文件夾,則進行下一步。
(4)根據INDEX頭部,讀取頭部信息,進行下一步。
(5)定位至下一個目錄登記項,如果無目錄登記項,則結束。
(6)讀取目錄登記項內容,根據其中的MFT號定位到該文件(夾)的MFT記錄,轉至步驟(3)。
其中,文件(夾)可能讀取多個MFT記錄,則聯合讀取MFT記錄中的常駐或非常駐屬性得到文件(夾)內容。
在NTFS卷中刪除一個文件,系統回收其MFT記錄,置該記錄ID號為空閑ID號。同時,如果文件占用了數據區,則其數據區所占用簇被系統回收,在Bitmap中對應位置置0,標明對應簇為可以被系統重新分配,回收的MFT記錄和數據區可供系統再分配。而FAT文件系統中的文件刪除后,如果文件的存儲空間非連續,恢復時很難確定文件的鏈接關系,而NTFS文件系統中的文件刪除后,如果數據區未被覆蓋,只要文件的MFT記錄還存在,可以根據其常駐或非常駐屬性,很容易由它確定文件數據的存儲位置,提高了數據恢復的準確性。
NTFS文件系統給每個文件 (夾)分配固定大小 (一般為1024字節,此值在BOOT扇區得到)存儲其對應的MFT記錄。文件MFT記錄了文件的所有信息或信息外部索引,每種信息都作為屬性賦予不同的屬性特征號。文件MFT記錄由MFT記錄頭部及屬性集組成。MFT記錄頭部包含了MFT標志(一定為FILE),第一個屬性的偏移地址(相對于MFT頭),記錄的實際長度,記錄分配的大小等信息。
根據MFT頭部中的第一個屬性的偏移地址,可以讀取相應的屬性,每個屬性中都包含不定長屬性的長度信息,從而定位和讀取下一個屬性。文件的MFT記錄中的屬性包括基本信息屬性,屬性列表屬性,文件名屬性,數據屬性,索引根屬性,索引分配屬性,Bitmap屬性等,可定義在如下的枚舉類型。

在NTFS系統中,文件的MFT記錄的文件名屬性為0xA0屬性。該屬性第9個字節(前開始的8個字節為屬性類型和屬性總長度)為非常駐標志(0x00表示常駐屬性,0x01表示非常駐屬性),如果為常駐屬性標志,則文件數據保存在MFT記錄的數據屬性(0x80屬性),如果為非常駐屬性,則文件數據通過MFT記錄數據屬性的Data Runs數組索引到到文件的數據。
由MFT記錄頭部開始讀取其第一個屬性的偏移,逐個搜索是否文件名屬性,即判斷屬性前四個字節是否為0x30,如果不是文件名屬性,則根據隨后的屬性長度信息,跳至下一個屬性。當搜尋到文件名屬性時,其中包含了文件返查所需的重要數據。文件名屬性的包含了文件大小,文件屬性(如隱藏,壓縮等),文件創建時間,文件修改時間,父目錄的MFT記錄參考號等信息。而其中的父目錄的MFT記錄參考號,是文件返查一個重要數據。
對于計算機犯罪中的電子證據,大多罪犯有相當一部分采用的是清空回收站的方式刪除。在NTFS中,當文件被放入回收站并清空回收站時,如果未作其他的操作,此時系統所作的操作是將此文件的MFT號置為空閑,同時將文件所占數據簇標志為空閑簇,該MFT記錄及空閑數據簇可被系統重分配。而該文件的MFT記錄及數據簇集中的內容并未被擦除,這也是文件恢復和文件返查的可行性依據。
當搜尋到擦除文件的MFT記錄,定位其文件名屬性,讀取其父目錄的MFT記錄參考號,定位到父目錄的MFT記錄,向上逐級返查至根目錄即可得到擦除文件的完整路徑,具體步驟如下。
(1)定義返查路徑棧,進行下一步。
(2)讀取MFT記錄的文件頭,搜索文件名屬性,進行下一步。
(3)讀取文件名屬性中的文件名,將其壓入返查路徑棧,進行下一步。
(4)讀取文件名屬性中的父目錄MFT記錄參考號,讀取父目錄MFT記錄,轉至步驟(2)。
(5)將返查路徑棧中路徑記錄順序出棧,并以分隔符“”連接,返查結束。
經過以上步驟,即可得到包含擦除文件的文件名和全路徑的完整文件名。
NTFS以其優越的安全性和穩定性,已經成為主流的操作系統。電子取證中的電子證據除了包含擦除文件數據本身,同時,也包含文件路徑等文件的擦除痕跡。這些電子證據的擦除痕跡,對于電子證據的可采用性及證明力有了進一步的提升。因此,對于電子證據擦除痕跡需要進一步的全面研究,以提高其利用價值。
[1]黃步根.數據恢復與計算機取證[J].計算機安全,2006,(6):79-81
[2]黃步根.NTFS系統存儲介質上文件操作痕跡分析[J].2007,33(23):281-282
[3]黃步根,劉建軍,張曉南.NTFS文件系統中的視頻數據恢復方法[J].計算機工程,2010,(2)