標籤:
/*
Skogkatt 開始翻譯於2015-01-24,僅作為學習研究之用,謝絕轉載。
譯註:我翻譯這本書的這三章雖然蓄謀已久,但並不是一個計劃好的工作。因為之前和vczh、mili、darkfall曾討論過everything這個軟體,也曾想過要寫一個開源的everything,於是就出來一個坑。everything這個軟體其實是從底層直接parse了NTFS MFT,然後parse類每一個FILE entry,從裡面拆出來了每一個檔案的資訊,這個操作速度遠快於Win32 FindFirstFile和FindNextFile。道理雖然簡單,但是實現起來代碼不會很少。
又,我從2013年起因工作原因開始研究和分析NTFS檔案系統,並且看過數遍《File System Forensic Analysis》這本書的NTFS三章。這三章的資訊已經略顯過時並且存在一些技術細節謬誤,翻譯出來僅僅是給英語不好的朋友們做為拓展知識所用。如果想認真研究NTFS實現細節,建議看看泄露的Windows原始碼、開源的NTFS3g庫並使用磁碟編輯工具實際看看磁碟的布局。
另外,NTFS3g目前公開的代碼坑很多,在高負荷壓力測試中會出現嚴重的資料丟失損壞甚至檔案系統掛掉,,不建議作為一個嚴謹的NTFS實現來使用。
再,翻譯進行中,不定期更新。
*/
新技術檔案系統(NTFS)是由Microsoft設計的並作為Micrtosoft Windows NT、Windows 2000、 Windows XP和Windows Server的預設檔案系統。在寫作本書的時候,Microsoft已經停止了Windows 98 和 ME 產品線的銷售,Windows XP家庭版成為新的消費系統。FAT仍將會存在於移動和小型存放裝置之中,但NTFS將會成為Windows研究中最為常見的檔案系統。NTFS是比FAT更為複雜的檔案系統,這是由於它具有眾多的功能特性和伸縮性。由於NTFS的複雜性,我們需要三章來討論它。本章將會討論NTFS的核心概念,覆蓋到我們模型中的五個分類。第12章,“NTFS分析”討論了NTFS分析和使用五分類模型來展示我們從哪裡擷取證據。第13章,“NTFS資料結構”介紹了NTFS相關的資料結構。
簡介
NTFS被設計為具有可靠性、安全性和支援大型存放裝置。伸縮性是由通用的資料結構所封裝的具有特定內容的資料來實現的。這之所以是一個可伸縮的設計,是由於內部的資料結構可以根據檔案系統新增的需求而變化,二外部的封裝可以保持不變。一個通用封裝的例子是,NTFS檔案系統的每一個位元組都被分配到檔案之中。我們稍後在本章中將會討論NTFS檔案的概念。
NTFS是一個複雜的檔案系統,不幸的是,並沒有一個從Microsoft公開的規範來描述其在磁碟上的布局。檔案系統高層組件的描述已經公開了,但是底層細節資訊仍然非常匱乏。幸運的是,其他組織已經公開了他們所認為的磁碟布局結構資訊,這些資訊包含在本書之中,並且我們將會用它們來手工深入到磁碟之中。儘管這聽起來很有難度,然而,我們仍然無法確保這裡所描述的資料結構和磁碟上面的完全一致。
NTFS是大量Windows系統的標準,並且在免費的Unix發行版中也越發常見(譯註:Linux)。沒有官方規範和單一支配應用來建立檔案系統兩個因素合并在一起,使得難以區分應用指定的功能和檔案系統通用的功能。例如,存在著Microsoft所不使用的初始設定檔案系統的方法,然而這種方法的結果是否被認為是一個“合法的NTFS”檔案系統還難以定論。Microsoft在每一次新發布Windows系統的時候都會變更檔系統內部,我將會在這裡指出這些改變。
一切都是檔案
為了瞭解NTFS的設計,一個最重要的概念是一切重要的資料都被分配為檔案。這包括其他檔案系統通常隱藏起來的基本的檔案系統管理資料。事實上,包含管理資料的檔案可以存在放卷的任何位置,和普通檔案一樣。也就是說,NTFS檔案系統並不像其他檔案系統那樣有一個特定的布局。整個檔案系統被認為是一個資料區,每一個扇區都可以分配給一個檔案。唯一不變的布局是每一個卷開始的幾個扇區,包含有開機磁區和引導代碼。
MFT概念
主檔案表格(MFT)是NTFS的心臟,這是因為它包含所有檔案和目錄的資訊。每一個檔案和目錄在表中至少有一個入口(Entry),entry本身很簡單。每一個entry都是1KB大,但是只有前42位元組有定義的用途。剩餘的空間用來儲存屬性(Attributes),屬性是很小的具有特性用途的資料結構。例如,有一個屬性用來儲存檔案的名稱,另一個屬性用來儲存檔案的內容。圖11.1一個MFT entry的基本布局,包括頭資訊和三個屬性。
圖11.1 一個MFT entry,有一個小頭部,剩餘的部分用來儲存不同的屬性。這個entry有三個屬性。
Microsoft稱每一個表中的entry為一個檔案記錄,但是我想把每一個entry簡稱為MFT entry,這樣更便於記憶。每一個entry都基於其在表中的位置有一個地址,從0開始。所有的entry的大小都是1024位元組,不過實際的大小定義在開機磁區中。
如NTFS中的所有一切一樣,MFT也是一個檔案。導致這個令人困惑的是MFT有一個它自己的entry。表中第一個entry名字叫做$MFT,它描述了MFT在磁碟上的位置。實際上,這是唯一描述MFT在磁碟上的位置的地方;也就是說,你需要處理這個entry才能得知MFT的布局和大小。MFT的起始位置在開機磁區給出,開機磁區始終是檔案系統的第一個扇區。我們可以在圖11.2看到這個,如何使用開機磁區找到第一個MFT entry,它顯示出MFT被分為片段,有32到34和56到58的簇組成。類似於FAT,NTFS使用簇,簇由連續的扇區組成。
圖11.2 開機磁區和$MFT的關係,用來確定MFT的布局。
在Microsoft實現的NTFS中,MFT開始保持盡量小的尺寸,當需要更多的entry時擴充MFT。理論上說,作業系統可以在建立檔案系統的時候建立固定數量的entry,但是Microsoft實現的動態特性允許很方便的通過分卷擴充檔案系統容量。Microsoft在MFT entry建立後不刪除它們。
MFT entry內容
每一個MFT entry的大小定義在開機磁區之中,但是Microsoft使用的所有版本都使用1024位元組大小。資料結構開始的42個位元組包含12個域,剩餘的982位元組沒有特定的結構,可以用屬性填充。你可以把一個MFT entry想想為一個用來存放你物品的大盒子。盒子外面是你的基本資料,比如你的名字和地址。基本資料等價於MFT entry的固定域。盒子裡面一開始是空的,但是它可以用來儲存任何比它小的容器。這非常像MFT entry沒有內部結構並且它含有一些包含特定資訊的屬性。
每一個MFT entry的第一個域是簽名,一個標準的entry是ASCII字串“FILE”,如果一個entry裡面發現了錯誤,它可能含有字串“BAAD”,還有一個標誌域用來標識這個entry是否使用、這個entry是否是一個目錄。一個MFT entry的分配狀態也可以通過$MFT檔案的$BITMAP屬性來檢查,詳見第13章。
如果一個檔案無法把它的所有屬性放進一個entry,它可以使用多個entry。當這種情況發生的時候買第一個entry被稱為基本檔案記錄,或者基本MFT entry,後續的每一個entry都在它的固定域儲存有基本entry的地址。
第13章顯示了一個MFT entry的資料結構,並分解了我們的樣本檔案系統鏡像。
MFT entry 地址
每一個MFT entry都使用一個48位的順序地址,第一個entry地址是0。MFT最大地址隨著MFT的增長而增大,它的值由$MFT的大小除以每一個entry的大小來計算。Microsoft稱這個順序地址為檔案編號(File number)。
每一個MFT entry還有一個16位的順序號,當entry分配的時候這個順序號增長。例如,想象一下MFT entry313的順序號是1.entry313的檔案刪除了,然後這個entry被分配給一個新的檔案。當這個entry被重新分配,它得到了一個新的順序號2。MFT entry和順序號組合起來,順序號放在高16位,組成了一個64位的檔案參考地址,見圖11.3。
圖11.3 MFT地址和順序號組成一個檔案參考地址的例子。
NTFS使用檔案參考地址來引用MFT entry,這是由於順序號使得檢查檔案系統是否處於一種損壞狀態變得容易。例如,如果系統在一個檔案的資料結構被分配的時候崩潰了,順序號可以用來判斷一個資料結構是否包含MFT entry,是因為上一個檔案使用了它還是它是新檔案的一部分。我們也可以用它來恢複被刪除的內容。例如,如果我們有一個未分配的資料結構,裡面有檔案參考號,我們可以判斷這個資料結構被使用以來MFT entry是否被重新分配過。順序號在資訊挖掘中有很大的作用,但是在本章為簡單起見,我將主要討論檔案號,或者MFT entry地址。
檔案系統元檔案
由於卷的每一個位元組都被分配給了檔案,必定有檔案儲存了檔案系統的管理資料。Microsoft稱它們為元檔案,但這樣會導致困惑,因為我們還要討論檔案中繼資料。我將會稱這些特殊檔案為檔案系統元檔案。
Microsoft保留了前16個MFT entry作為檔案系統元檔案(Microsoft文檔聲稱只保留了前16個entry,但是實際上第一個使用者檔案或者目錄從entry24開始。entry17到23作為緩衝entry防止預留的不夠用導致溢出),這些保留並且未用的entry被置為分配狀態並且只有基本的資訊。每個檔案系統元檔案都列在根目錄,儘管通常情況下普通使用者是看不到它們的。每一個檔案系統元檔案的名字都由“$”開始,並且第一個字母大寫。我們將在第12章討論每一個檔案系統元檔案,但是我們現在把它們列在表11.1作為一個方便參考。
表11.1標準的NTFS檔案系統元檔案
Entry |
File Name |
Description |
0 |
$MFT |
MFT自身的entry |
1 |
$MFTMirr |
含有MFT起始的幾個entry的備份 |
2 |
$LogFile |
含有中繼資料事務的日誌 |
3 |
$Volume |
含有卷資訊 |
4 |
$AttrDef |
含有屬性資訊 |
5 |
. |
檔案系統根目錄 |
6 |
$Bitmap |
檔案系統簇的分配狀態 |
7 |
$Boot |
開機磁區和檔案系統引導代碼 |
8 |
$BadClus |
含有壞扇區的簇 |
9 |
$Secure |
還有安全和存取控制相關資訊 |
10 |
$Upcase |
含有每一個Unicode字元的大寫形式 |
11 |
$Extend |
含有可選擴充檔案的目錄。 |
MFT入口屬性概念
// TODO
其他屬性概念
// TODO
索引
// TODO
分析工具
// TODO
總結
NTFS之中的每一個關鍵元素都被關聯給了一個檔案或者一個索引。本章之中,我們討論了NTFS的核心概念:MFT入口、屬性和索引。通過使用這些基本的概念,我們現在就可以檢查特定的屬性和分析第12章中的分類項目。
參考資料
略,請看原著
檔案系統取證分析(第11章:NTFS概念)