1. 程式人生 > >NTFS檔案系統詳解(三)之NTFS元檔案解析

NTFS檔案系統詳解(三)之NTFS元檔案解析

在NTFS中,所有儲存在捲上的資料都包含在檔案中,包括用來定位和獲取檔案的資料結構,載入程式和記錄這個卷的記錄(NTFS元資料)的點陣圖,這體現了NTFS的原則:磁碟上的任何事物都為檔案。在檔案中儲存一切使得檔案系統很容易定位和維護資料,而在NTFS中,卷中所有存放的資料均在一個叫做MFT的檔案記錄陣列中,稱為主檔案表(Master File Table),MFT是由高階格式化產生的。而MFT則由檔案記錄(File Record)陣列構成。File Record的大小一般是固定的,不管簇的大小是多少,均為1KB,這個概念相當於Linux中的inode(i節點)。File Record在MFT檔案記錄陣列中物理上是連續的,且從0開始編號。MFT僅供系統本身組織、架構檔案系統使用,這在NTFS中稱為元資料(metadata)。其中最基本的前16個記錄是作業系統使用的非常重要的元資料檔案。這些NTFS主檔案表的重要的元資料檔案都是以$(美元符號)開始的名字,所以是隱藏檔案,在Windows 2000中不能使用dir命令(甚至加上/ah引數)像普通檔案一樣列出這些元資料檔案。實際上File System Driver(ntfs.sys)維護了一個系統變數NTFS Protect System Files用於隱藏這些元資料。但是微軟公司也提供了一個OEM TOOL,叫做NFI.EXE,用此工具可以轉儲NTFS主檔案表的重要的元資料檔案(元資料:是儲存在捲上支援檔案系統格式管理的資料。它不能被應用程式來訪問,它只能為系統提供服務)

我們第一步就是先找到MFT的位置,通過分割槽表,我們得到本分割槽的引導扇區所在的扇區號,就拿C盤分割槽來實踐,通過上一節,我們得到C盤的引導扇區的扇區號是63,首先進到扇區號為63的扇區
這裡寫圖片描述
然後根據下表對照
這裡寫圖片描述

00 02 每個扇區512(200H)位元組
08 每個簇佔8扇區
00 00
00 00 00
00 00
F8 硬碟
00 00
3F 00 每磁頭63扇區
FF 00 每柱面255磁頭
3F 00 00 00 隱含扇區63
00 00 00 00
80 00 80 00
C0 FF BF 03 00 00 00 00 扇區總數62914496
00 00 0C 00 00 00 00 00 MFT開始簇號786432
10 00 00 00 00 00 00 00 MFTmirr開始簇號 16
F6 00 00 00 每個MFT佔的簇數 246
01 00 00 00 每個索引佔的簇數 1
B9 63 23 FC AA 23 FC B6 卷標

檔案記錄由兩部分構成,一部分是檔案記錄頭,另一部分是屬性列表,最後結尾是四個“FF”。然後我們根據上面BPB中的偏移簇號偏移盤偏移地址找到系統MFT所在地址(789632 * 8 +63 = 6291519),檢視檔案記錄格式如下是一個完整的檔案記錄:
這裡寫圖片描述

在同一系統中,檔案記錄頭的長度和具體偏移位置的資料含義是不變的,而屬性列表是可變的,其不同的屬性有著不同的含義。後文將對屬性進行具體分析,先來看看檔案記錄頭的資訊。
這裡寫圖片描述

在NTFS檔案系統中所有與檔案相關的資料結構均被認為是屬性,包括檔案的內容。檔案記錄是一個與檔案相對應的檔案屬性資料庫,它記錄了檔案的所有屬性。每個檔案記錄中都有多個屬性,他們相對獨立,有各自的型別和名稱。每個屬性都由兩部分組成,既屬性頭和屬性體。屬性頭的前四個位元組為屬性的型別。從檔案記錄頭可以看到第一個屬性流的偏移地址,(C0007E00+0038=C0007E38)如下是以10H屬性為例的屬性結構
這裡寫圖片描述

另外屬性還有常駐與非常駐之分。當一個檔案很小時,其所有屬性體都可以存放在檔案記錄中,該屬性就稱為常駐屬性。如果某個檔案很大,1KB的檔案記錄無法記錄所有屬性時,則檔案系統會在元檔案之外的區域也稱資料流存放該檔案的其他檔案記錄屬性,這些存放在非MFT元檔案內的記錄就稱為非常駐屬性。

分析屬性的屬性頭

每個屬性都有一個屬性頭,這個屬性頭包含了一些該屬性的重要資訊,如屬性型別,屬性大小,名字(並非都有)及是否為常駐屬性等。

常駐屬性的屬性頭分析表:
這裡寫圖片描述

如下是非常駐屬性的屬性頭分析表:
這裡寫圖片描述

前面說過了,屬性的種類有很多,因此各屬性體的含義也不同。下表是NTFS檔案系統中的所有屬性體的簡介
這裡寫圖片描述
這裡寫圖片描述

接下來來看幾個重要的屬性:

分析10H屬性:

10H型別屬性它包含檔案的一些基本資訊,如檔案的傳統屬性,檔案的建立時間和最後修改時間和日期,檔案的硬連結數等等。如下:是一個10H型別的屬性。
這裡寫圖片描述

其中偏移0×20處的檔案屬性解釋如下:
這裡寫圖片描述

分析20H屬性

20H型別屬性既屬性列表,當一個檔案需要好幾個檔案記錄時,才會用到20H屬性。20H屬性記錄了一個檔案的下一個檔案記錄的位置。如下:是20H屬性的解釋。
這裡寫圖片描述

分析30H屬性

30H型別屬,該屬性用於儲存檔名 ,它總是常駐屬性。最少68位元組,最大578位元組,可容納最大Unicode字元的檔名長度。
這裡寫圖片描述

分析80H屬性

80H屬性是檔案資料屬性,該屬性容納著檔案的內容,檔案的大小一般指的就是未命名資料流的大小。該屬性沒有最大最小限制,最小情況是該屬性為常駐屬性。常駐屬性就不做多的解釋了,上面我標記的是一個非常駐的80H屬性。

這裡寫圖片描述

其中,Run List是最難理解,也是最重要的。當屬性不能存放完資料,系統就會在NTFS資料區域開闢一個空間存放,這個區域是以簇為單位的。Run List就是記錄這個資料區域的起始簇號和大小,一個Run List例子上所示。這個示例中,Run List的值為“32 CC 26 00 00 0C”,因為後面是00H,所以知道已經是結尾。如何解析這個Run List呢? 第一個位元組是壓縮位元組,高位和低位相加,3 + 2 = 5,表示這個Data Run資訊佔用五個位元組,其中高位表示起始簇號佔用多少個位元組,低位表示大小佔用的位元組數。在這裡,起始簇號佔用3個位元組,值為0C 00 00,大小佔用2個位元組,值為26 CC。解析後,得到這個資料流起始簇號為C0000,大小為9932簇。
這裡寫圖片描述

分析90H屬性

90H屬性是索引根屬性,該屬性是實現NTFS的B+樹索引的根節點,它總是常駐屬性。該屬性的結構如下圖:

這裡寫圖片描述

索引根的結構如表:
這裡寫圖片描述

索引頭的結構如表:

索引項結構如表:
這裡寫圖片描述

分析A0H屬性
A0屬性是索引分配屬性,也是一個索引的基本結構,儲存著組成索引的B+樹目錄索引子節點的定位資訊。它總是常駐屬性。如下:是一個A0H屬性的例項。
這裡寫圖片描述

根據上圖A0H屬性的“Run List”可以找到索引區域,偏移到索引區域所在的簇,如下圖:
起始簇:18265

簇大小:3

起始扇區號 = 該分割槽的其實扇區 + 簇號 * 每個簇的扇區數 也就是

64 + 18265 * 8 = 146124
這裡寫圖片描述

對了,上面的偏移0×28還要加上0×18 = 0×40.

標準索引頭的解釋如下:
這裡寫圖片描述

索引項的解釋如下:
這裡寫圖片描述

在下面的表中羅列出NTFS5中所有的元檔案:
這裡寫圖片描述

每個MFT記錄都對應著不同的檔案,如果一個檔案有很多屬性或是分散成很多碎片,就很可能需要多個檔案記錄。這時,存放其檔案記錄位置的第一個記錄就叫做“基檔案記錄”(base file record)。

MFT中的第1個記錄就是MFT自身。由於MFT檔案本身的重要性,為了確保檔案系統結構的可靠性,系統專門為它準備了一個映象檔案($MftMirr),也就是MFT中的第2個記錄。

第3個記錄是日誌檔案($LogFile)。該檔案是NTFS為實現可恢復性和安全性而設計的。當系統執行時,NTFS就會在日誌檔案中記錄所有影響NTFS卷結構的操作,包括檔案的建立和改變目錄結構的命令,例如複製,從而在系統失敗時能夠恢復NTFS卷。

第4個記錄是卷檔案($Volume),它包含了卷名、被格式化的卷的NTFS版本和一個標明該磁碟是否損壞的標誌位(NTFS系統以此決定是否需要呼叫Chkdsk程式來進行修復)。

第5個記錄是屬性定義表($AttrDef,attribute definition table),其中存放了卷所支援的所有檔案屬性,並指出它們是否可以被索引和恢復等。

第6個記錄是根目錄(\),其中儲存了存放於該卷根目錄下所有檔案和目錄的索引。在訪問了一個檔案後,NTFS就保留該檔案的MFT引用,第二次就能夠直接進行對該檔案的訪問。

第7個記錄是點陣圖檔案($Bitmap)。NTFS卷的分配狀態都存放在點陣圖檔案中,其中每一位(bit)代表卷中的一簇,標識該簇是空閒的還是已被分配了的,由於該檔案可以很容易的被擴大,所以NTFS的卷可以很方便的動態的擴大,而FAT格式的檔案系統由於涉及到FAT表的變化,所以不能隨意的對分割槽大小進行調整。

第8個記錄是引導檔案($Boot),它是另一個重要的系統檔案,存放著Windows 2000/XP的載入程式程式碼。該檔案必須位於特定的磁碟位置才能夠正確地引導系統。該檔案是在Format程式執行時建立的,這正體現了NTFS把磁碟上的所有事物都看成是檔案的原則。這也意味著雖然該檔案享受NTFS系統的各種安全保護,但還是可以通過普通的檔案I/O操作來修改。

第9個記錄是壞簇檔案($BadClus),它記錄了磁碟上該卷中所有的損壞的簇號,防止系統對其進行分配使用。

第10個記錄是安全檔案($Secure),它儲存了整個卷的安全描述符資料庫。NTFS檔案和目錄都有各自的安全描述符,為了節省空間,NTFS將具有相同描述符的檔案和目錄存放在一個公共檔案中。

第11個記錄為大寫檔案($UpCase,upper case file),該檔案包含一個大小寫字元轉換表。

第12個記錄是擴充套件元資料目錄($Extended metadata directory)。

第13個記錄是重解析點檔案($Extend\$Reparse)。

第14個記錄是變更日誌檔案($Extend\$UsnJrnl)。

第15個記錄是配額管理檔案($Extend\$Quota)。

第16個記錄是物件ID檔案($Extend\$ObjId)。

第17~23記錄是是系統保留記錄,用於將來擴充套件。

MFT的前16個元資料檔案是如此重要,為了防止資料的丟失,NTFS系統在該卷檔案儲存部分的正中央對它們進行了備份,參見下圖。

相關推薦

NTFS檔案系統()NTFS檔案解析

在NTFS中,所有儲存在捲上的資料都包含在檔案中,包括用來定位和獲取檔案的資料結構,載入程式和記錄這個卷的記錄(NTFS元資料)的點陣圖,這體現了NTFS的原則:磁碟上的任何事物都為檔案。在檔案中儲存一切使得檔案系統很容易定位和維護資料,而在NTFS中,卷中所有存放的資料均在一個叫做MFT的檔案記錄陣列中,

NTFS檔案系統(一)硬碟基本資訊

本文參考自部落格 一般硬碟正面貼有產品標籤,主要包括廠家資訊和產品資訊,如商標、型號、序列號、生產日期、容量、引數和主從設定方法等。這些資訊是正確使用硬碟的基本依據,下面將逐步介紹它們的含義。 硬碟主要由盤體、控制電路板和介面部件等組成,如圖1-1所示。

Linuxnfs檔案系統

NFS 概念 網路檔案系統 (NFS) 是 Unix 系統和網路附加儲存檔案管理器常用的網路檔案系統 , 允許多個客戶端通過網路共享檔案訪問。它可用於提供對共享二進位制目錄的訪問 , 也可用於允許使用者在同一工作組中從不同客戶端訪問其檔案。 一、nfs

btrfs檔案系統及使用

btrfs檔案系統的核心特性:        多物理卷支援:btrfs可由多個底層物理卷組成;支援RAID,以聯機“新增”、移除,修改;        寫時複製更新機制(CoW):複製、更新及替換指標,而非就地更新; &

Gradle使用() Android Gradle外掛配置

通上前兩篇博文由淺入深的學習Gradle的基礎和Gradle的Java外掛相關知識後,現在終於到了高潮部分了,讓我們來進一步正式學習Android Gradle外掛。前面提到,Android Gradle外掛是一個基於內建的Java外掛來實現的第三方外掛,它是由google的

linux檔案系統

什麼是檔案系統 檔案系統是作業系統用於明確磁碟或分割槽上的檔案的方法和資料結構,即在儲存裝置(磁碟)上組織檔案的方法。作業系統中負責管理和儲存檔案資訊的軟體結構稱為檔案管理系統,簡稱檔案系統。 從系統角度來看,檔案系統是對檔案儲存裝置的空間進行組織和分配,負責檔案儲存並對存入的檔案進行保護和檢索的系統

linux目錄結構和根檔案系統

FHS: /bin:所有使用者可用的基本命令程式檔案; /sbin: 供系統管理使用的工具程式; /boot: 引導載入器必須用到的各靜態檔案:kernel,inintramfs(initrd),

Mavenpom.xml檔案

<project> <modelVersion>4.0.0</modelVersion> <!--maven2.0必須是這樣寫,現在是maven2唯一支援的版本--> <!-- 基礎設定 -->

FAT32檔案系統

   硬碟是用來儲存資料的,為了使用和管理方便,這些資料以檔案的形式儲存在硬碟上。任何作業系統都有自己的檔案管理系統,不同的檔案系統又有各自不同的邏輯組織方式。例如:常見的檔案系統有FAT,NTFS,EXT,UFS,HFS+等等。作者後面的文章會一一講到,下面就來學習一下基

FatFS檔案系統-附移植建議

在這裡http://elm-chan.org/fsw/ff/00index_e.html下載原始碼,只有800多K,小的可憐,還可以下載示例程式,有AVR、Win32、lpc等多平臺已實現的方案。開啟看src資料夾,一個option資料夾、00readme.txt、disk

Android檔案系統

前言 檔案系統一直是Android開發過程中經常接觸的東西。而關於內部儲存、外部儲存、外接儲存、私有儲存、公共儲存,以及訪問哪些檔案需要申請執行時許可權等問題,一直是許多開發者頭疼的問題。本文就將詳細地講解這些重要而模糊的知識點。 內部儲存 內部儲存主

[轉]Ceph:OpenStack標配&Linux PB級分散式檔案系統

Ceph:一個 Linux PB 級分散式檔案系統作為一名儲存行業的架構師,我對檔案系統情有獨鍾。這些系統用來儲存系統的使用者介面,雖然它們傾向於提供一系列類似的功能,但它們還能夠提供差異顯著的功能。Ceph 也不例外,它還提供一些您能在檔案系統中找到的最有趣的功能。Ceph

(十三)linux檔案系統(基於ext2檔案系統

  我們知道,一個磁碟可以劃分成多個分割槽,每個分割槽必須先用格式化工具(例如某種mkfs命令)格式化成某種格式的檔案系統,然後才能儲存檔案,格式化的過程會在磁碟上寫一些管理儲存佈局的資訊。下圖是一個磁碟分割槽格式化成ext2檔案系統後的儲存佈局:

EX2檔案系統

對於EXT2檔案系統,重點關注索引節點和資料塊。 檔案是以簇為單位存放在硬碟中的,簇是由多個扇區組成的。 任何ext2分割槽的第一個塊從不受ext2檔案系統的管理,這一塊分割槽的啟動扇區所保留。ext2其餘的分割槽為快組,詳細組成如下: 分割槽=引導塊+塊組(N個) 塊組=

FastDFS 分散式檔案系統

## 什麼是檔案系統 ![](https://mrhelloworld.com/resources/articles/fastdfs/20180810094347_11565.jpg " ")   檔案系統是作業系統用於在磁碟或分割槽上組織檔案的方法和資料結構。磁碟空間是什麼樣的我們並不清楚,但檔案系統可

【史上最全】Hadoop 核心 - HDFS 分散式檔案系統(上萬字建議收藏)

## 1. HDFS概述 Hadoop 分散式系統框架中,首要的基礎功能就是檔案系統,在 Hadoop 中使用 FileSystem 這個抽象類來表示我們的檔案系統,這個抽象類下面有很多子實現類,究竟使用哪一種,需要看我們具體的實現類,在我們實際工作中,用到的最多的就是HDFS(分散式檔案系統)以及Loca

spark2.x由淺入深深到底系列六RDD java api

老湯 spark 大數據 javaapi rdd 學習任何spark知識點之前請先正確理解spark,可以參考:正確理解spark本文詳細介紹了spark key-value類型的rdd java api一、key-value類型的RDD的創建方式1、sparkContext.parall

分散式系統--框架(Hadoop--JAVA操作HDFS檔案

       分散式系統詳解--框架(Hadoop--JAVA操作HDFS檔案)         前面的文章介紹了怎麼將整個集群系統搭建起來,並進行了有效的測試。為了解決登入一臺伺服器登入其他伺服器需要多次輸入密碼的

Android系統獲取圖片和視訊的縮圖

從Android 2.2開始系統新增了一個縮圖ThumbnailUtils類,位於framework的android.media.ThumbnailUtils位置,可以幫助我們從mediaprovider中獲取系統中的視訊或圖片檔案的縮圖,該類提供了三種靜態方法可以直接呼

Android逆向旅---SO(ELF)檔案格式

第一、前言從今天開始我們正式開始Android的逆向之旅,關於逆向的相關知識,想必大家都不陌生了,逆向領域是一個充滿挑戰和神祕的領域。作為一名Android開發者,每個人都想去探索這個領域,因為一旦你破解了別人的內容,成就感肯定爆棚,不過相反的是,我們不僅要研究破解之道,也要