NTFS (New Technology File System) は最新のファイル システムであり、Windows オペレーティング システムで最も一般的に使用されているファイル システムの 1 つです。これは、大容量ストレージ、ファイル暗号化、圧縮、権限制御などの機能をサポートする、効率的で信頼性が高く安全なファイル システムです。この記事では、NTFS ファイル システムの構造、$Boot ファイル、$MFT メタファイル、ファイル レコード、属性ヘッダーと属性本体の分析、MFT オフセット アドレスの計算、およびパーティション ファイル リストの走査の考え方を詳しく紹介します。
まず、NTFSファイルシステムの構造
NTFS ファイル システムは、ブート セクタ、ファイル レコード、メタファイルの 3 つの主要な部分で構成されます。ブート セクターにはブート コードとパーティション テーブルが含まれ、ファイル レコードにはファイルのデータとメタデータが保存され、メタファイルにはファイル システムのメタデータが保存されます。
ブート セクター: NTFS ファイル システムのブート セクターには、ブート コードとパーティション テーブルが含まれています。スタートアップ コードはオペレーティング システムを起動するために使用されるプログラム コードであり、パーティション テーブルにはパーティションの開始位置、サイズ、タイプなどのパーティションの情報が記録されます。
ファイル レコード: NTFS ファイル システムのファイル レコードは、ファイルのデータとメタデータを保存するために使用されます。各ファイルレコードには、ファイルの属性情報、ファイル名、ファイルデータなどが含まれます。ファイル レコードのサイズは固定されており、通常は 1KB または 4KB です。
メタファイル: NTFS ファイル システムのメタファイルは、ファイル システムのメタデータを保存するために使用されます。メタデータには、ファイル システム情報、ファイル レコード情報、ディスク領域の割り当てなどが含まれます。メタファイルには通常、$MFT (ファイル レコード テーブル)、$Bitmap (ビットマップ)、$LogFile (ログ ファイル) などが含まれます。
2、$Boot ファイル
$Boot ファイルは、NTFS ファイル システムの特別なファイルであり、ファイル システムのバージョン、クラスタ サイズ、パーティション サイズなど、ファイル システムの基本情報が含まれています。$Boot ファイルのサイズは 512 バイトで、その構造は次のとおりです。
![NTFS_Boot_File_Structure](https://i.imgur.com/5YJjZJy.png)
このうち、Jump コマンドはスタートアップ コードにジャンプするために使用され、OEM ID はファイル システムを識別するために使用され、Bytes Per Sector はセクターあたりのバイト数を示し、Sectors Per Cluster は各クラスターに含まれるセクター数を示します。 Reserved Sectors は予約セクタの数を示し、Media Descriptor はディスク メディアのタイプを示し、Sectors Per Track はトラックあたりのセクタ数を示し、Number of Heads はヘッドの数を示し、Hidden Sectors は隠しセクタの数を示し、Total Sectors を示します。パーティションの数を示しますセクタの総数を示します。MFT 開始クラスターは $MFT メタファイルの開始クラスター番号を示します。MFT ミラー開始クラスターは $MFT ミラー ファイルの開始クラスター番号を示します。MFT レコードごとのクラスターはクラスターの数を示します各 $MFT レコードによって占有されるクラスター、インデックス ブロックあたりのクラスター数は各インデックス ブロックによって占有されるクラスターの数を示し、ボリューム シリアル番号はボリューム シリアル番号を示し、$Boot ファイルを検証するためにチェックサムが使用されます。
3. $MFT メタファイル
$MFT メタファイルは、NTFS ファイル システムの特別なファイルであり、ファイル システム内のすべてのファイル レコードに関する情報を保存します。$MFT メタファイルのサイズは通常 1024 クラスターで、各クラスターは $Boot ファイルで定義されたクラスターのサイズになります。$MFT メタファイルの構造は次のとおりです。
![NTFS_MFT_ファイルの構造](https://i.imgur.com/2zL7tq7.png)
このうち、ファイル ヘッダーには、ファイル名、ファイル属性など、ファイルの基本的な情報が含まれています。ファイルレコードには、ファイルの属性情報、ファイル名、ファイルデータなどが含まれます。各ファイル レコードのサイズは固定されており、通常は 1KB または 4KB です。各ファイル レコードには、ファイル レコード番号 (FRN) と呼ばれる一意の識別子があります。$MFT メタファイルの最初のファイル レコードは $MFT 自体であり、ファイル レコード番号は 0 です。
4. 文書化
NTFS ファイル システムのファイル レコードは、ファイル データとメタデータを保存するために使用されます。各ファイルレコードには、ファイルの属性情報、ファイル名、ファイルデータなどが含まれます。ファイル レコードのサイズは固定されており、通常は 1KB または 4KB です。ファイル レコードは次のように構造化されています。
![NTFS_ファイル_レコード_構造](https://i.imgur.com/5ZKqL6j.png)
このうち、ファイル ヘッダーには、ファイル名、ファイル属性など、ファイルの基本的な情報が含まれています。ファイルレコードには、ファイルの属性情報、ファイル名、ファイルデータなどが含まれます。各ファイル レコードには、ファイル レコード番号 (FRN) と呼ばれる一意の識別子があります。
5、MFTオフセットアドレス計算
NTFS ファイル システムでは、各ファイル レコードにはファイル レコード番号 (ファイル レコード番号、FRN と呼ばれます) と呼ばれる一意の識別子があります。ファイル レコードにアクセスするには、$MFT メタファイルでファイル レコードのオフセット アドレスを見つける必要があります。オフセット アドレスの計算式は次のとおりです。
$MFTOffset = MFTStartCluster * ClusterSize + FRN * RecordSize
このうち、MFTStartCluster は $MFT メタファイルの開始クラスター番号、ClusterSize はクラスターのサイズ、FRN はファイル レコード番号、RecordSize はファイル レコードのサイズです。
6. 属性の属性ヘッダーの解析
NTFS ファイル システムのファイル レコードには複数の属性が含まれており、各属性には属性ヘッダーと属性本体があります。属性ヘッダーには、属性タイプ、属性長、属性フラグなど、属性のいくつかの基本情報が含まれます。属性ヘッダーの構造は次のとおりです。
![NTFS_Attribute_Header_Structure](https://i.imgur.com/2Uq6J1Q.png)
このうち、Typeは属性の種類を示し、Lengthは属性の長さを示し、Non-Residentは属性が非常駐属性であるかどうかを示し、NameLengthは属性名の長さを示し、NameOffsetは属性名のオフセットを示す。 , Flags は属性のフラグを示し、AttributeID は属性の識別子を示します。
7. 属性の属性本体分析
NTFS ファイル システムのファイル レコードには複数の属性が含まれており、各属性には属性ヘッダーと属性本体があります。属性本体には、ファイル データ、ファイル名、ファイル属性などの属性の特定の内容が含まれます。アトリビュートボディの構造はアトリビュートタイプによって異なりますが、以下では一般的なアトリビュートタイプを例として紹介します。
1. $STANDARD_INFORMATION プロパティ
$STANDARD_INFORMATION 属性には、作成時間、変更時間、アクセス時間、ファイル属性など、ファイルに関するいくつかの基本情報が含まれています。$STANDARD_INFORMATION プロパティの構造は次のとおりです。
![NTFS_STANDARD_INFORMATION_Attribute_Structure](https://i.imgur.com/6wQK9gE.png)
このうち、CreationTime はファイルの作成時刻を表し、LastAccessTime はファイルの最終アクセス時刻を表し、LastWriteTime はファイルの最終変更時刻を表し、FileAttributes はファイルの属性 (読み取り専用、非表示、システムなど) を表します。 、など。
2. $FILE_NAME 属性
$FILE_NAME 属性には、ファイルの名前、サイズ、作成時刻、変更時刻、アクセス時刻などの情報が含まれます。$FILE_NAME プロパティの構造は次のとおりです。
![NTFS_FILE_NAME_Attribute_Structure](https://i.imgur.com/7hjyJ3Y.png)
このうち、ParentDirectoryはファイルが置かれている親ディレクトリのFRNを示し、CreationTimeはファイルの作成時刻を示し、LastAccessTimeはファイルの最終アクセス時刻を示し、LastWriteTimeはファイルの最終変更時刻を示し、FileSizeはサイズを示します。 Flags はファイルのフラグ (読み取り専用、非表示、システムなど) を示し、FileNameLength はファイル名の長さを示し、FileName はファイル名を示します。
3. $DATA 属性
$DATA プロパティには、ファイルのデータが含まれます。$DATA プロパティの構造は次のとおりです。
![NTFS_DATA_Attribute_Structure](https://i.imgur.com/5mXyL9G.png)
このうち、Non-Residentはそのデータが非常駐属性であるかどうかを示し、DataRunsはデータの実行リストを示し、Dataはデータの内容を示す。
4. $INDEX_ROOT プロパティ
$INDEX_ROOT プロパティには、ディレクトリのインデックス情報が含まれます。$INDEX_ROOT プロパティの構造は次のとおりです。
![NTFS_INDEX_ROOT_Attribute_Structure](https://i.imgur.com/6WjJ9Km.png)
このうち、Type はインデックスの種類、CollationRule は照合規則、BytesPerIndexRecord は各インデックス レコードのサイズ、ClustersPerIndexRecord は各インデックス レコードが占有するクラスタ数、IndexEntriesOffset はインデックス レコードのオフセット、IndexEntriesLength は長さを示します。インデックス レコードの IndexEntries インデックス レコードの内容を表します。
8、パーティションファイルのリストを走査するというアイデア
NTFS ファイル システム内のすべてのファイルをスキャンするには、まず $MFT メタファイルの開始クラスタ番号とサイズを見つけてから、$MFT メタファイルの内容を読み取り、各ファイル レコードを解析して、ファイルの属性情報を取得する必要があります。ファイル名、ファイルデータなど 具体的な横断のアイデアは次のとおりです。
1. $Boot ファイルを読み取り、$MFT メタファイルのクラスター サイズと開始クラスター番号を取得します。
2. $MFT メタファイルのサイズを計算し、$MFT メタファイルの内容を読み取ります。
3. $MFT メタファイル内の各ファイル レコードを解析して、ファイル属性情報、ファイル名、ファイル データなどを取得します。
4. ファイルがディレクトリの場合は、そのディレクトリの下にあるすべてのファイルをスキャンします。
5. ファイルが非常駐である場合は、DataRuns リストを読み取り、データの場所とサイズを取得して、データを読み取ります。
6. ファイルがインデックス属性の場合、IndexEntries リストを読み取り、インデックス レコードの位置とサイズを取得し、インデックス レコードを解析して、ファイルの属性情報、ファイル名、およびファイル データを取得します。
7. パーティション全体がスキャンされるまで、手順 3 ~ 6 を繰り返します。
要約する
この記事では、NTFS ファイル システムの構造、$Boot ファイル、$MFT メタファイル、ファイル レコード、属性ヘッダーと属性本体の属性分析について詳しく紹介します。