「NTFS: ハードディスクをより安全かつ効率的に!」 NTFS ファイル システムの詳細な説明、

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 はインデックスの種類、Collat​​ionRule は照合規則、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 メタファイル、ファイル レコード、属性ヘッダーと属性本体の属性分析について詳しく紹介します。

おすすめ

転載: blog.csdn.net/weixin_74021557/article/details/131200120