Ⅰ. 概要
MBR、VBRの復元を、ディスクのサンプル画像を使って実際に試す予定です。復元後、FATとNTFSのデータ領域を見つける手順を実際に試行し、その構造を確認します。
Ⅱ. ディスク実習 - MBR、VBR の復元
サンプルディスクのイメージを持って、HxDを使用してVBR形式でのバックアップを行い、MBRとVBRを復元することを試みる予定です。


上記の2つの写真から、MBRとVBRが破損している様子が確認できます。通常、0番のセクターにMBRの情報が格納されていますが、512バイトで構成されるMBRの最後のパーティションに関連する情報がすべて失われていることがわかります。今回の復元実習では、まず1つ目のVBRのバックアップセクターを探し、次に、VBRからそのパーティションがNTFSかFATかを判別します。その後、VBRからそのパーティション全体のセクターサイズを取得し、計算によって元のVBRの位置を特定します。最後に、バックアップされたVBRセクターを元のVBRの位置にコピーし、関連情報を基にMBRのパーティション情報を復元します。この手順で進めていきます。
VBR(可変ビットレート)のバックアップ領域を特定する
VBRファイルのバックアップセクターを見つける方法はいくつかあります。その中でも、シグネチャー(Signature)を利用する方法を紹介します。HxDで16進数の「55 AA」を検索してみてください。

このような結果が表示されます。検索された項目を一つずつ確認していくと

この最後の2バイトが「55 AA」で、「Uª」が表示されているのは、これがシグネチャであることを覚えておくことが重要です。単に文字として見るのではなく、「55 AA」がシグネチャであることを理解することが大切です。上記の赤い部分を見ると、これがNTFSであることを確認できます。NTFS VBRの構造については、関連するブログ記事も多数存在するので、参考にすることでより深く理解できると思います。
NTFS VBRの復元
NTFSの場合、通常、バックアップセクターはNTFSパーティションの最後のセクターとなります。そのため、このバックアップセクターからパーティションのセクターサイズを取得できれば、元のバックアップセクターの位置を特定することができます。

この構造を見ると、VBRの0x20領域に、8バイトから15バイトまでの合計8バイトで、Total Sectors(総セクタ数)の情報が格納されていることがわかります。

したがって、上記の画像における「リトルエンディアン」でA67FFが該当するパーティションの合計セクター数は、「681,983」となります。現在のバックアップセクターの位置が「682,111」であるため、この値から合計セクター数を引くと、「128」となり、これがオリジナルVBRの開始セクターです。


まず、VBR形式のバックアップデータをコピーし、セクター128の位置に配置して保存します。
NTFS パーティションのMBR(マスターブートレコード)を復元する
今、これらの値を基にMBR(マスターブートレコード)の復元作業を行います。
[SK Telecom SeSAC、ソウル1期] ZIP構造体、ディスク
過去の投稿を参考にすると、MBRの446バイトから510バイトの間には、各パーティションの情報が16バイト単位で格納されていることがわかります。NTFSパーティション(128セクターから開始)をMBRの最初の16バイトに、必要な情報を入力します。実際には、16バイトから1バイト、4バイト、8~11バイト、12~16バイト以外の情報は不要なので、これらの情報のみを再入力します。具体的には、1バイトのブートフラグを80に、4バイトのファイルシステムタイプをNTFSを示す07に設定します。8~11バイトのパーティション開始アドレスには、128セクターを16進数に変換した80を入力し、最後の12~16バイトには、パーティションのサイズであるA67FFを入力します。
※ 入学する際に注意すべき点は、現在「リトルエンディアン」と読んでいるものの、実際には「ビッグエンディアン」という表記方法であることです。

この方法でデータを読み込み、保存した後、FTK Imagerを使って復元が正常に行われたかを確認します。

このような復元が成功している様子が見られます。もしFATも同様に処理すれば、同様の結果が得られるはずです。
FAT (ファイルシステムテーブル) の復旧作業中

まず、バックアップVBRを見つけ、そこから-6ステップ移動した「682,112」の位置にバックアップVBRをコピーして貼り付けます。

その後、MBRを再度復元する際には、ブートフラグを80、ディスクの種類を0Bまたは0C、そして起動アドレス「682,112」をA6880に変換し、セクターサイズを入力する必要があります。

出典:hec-ker.tistory.com / 以下のパスを参照
この構造から、セクタ全体のサイズが0x20から4バイトであることを確認すると、A6800であることがわかります。次に、この値をMBR(マスターブートレコード)に書き込むと、

このような形式で入力できます。その後、保存してFTK Imagerで確認すると、

このような状態を鮮明に確認することができます。
Ⅲ. ディスク実習 - データの領域を見つける
まず、FAT32のDataAreaを見つける方法は、以前の投稿で簡単に触れましたが、FAT32の構造はVBR(予約領域)- FAT1です。 & FAT2 - MFT (マスターファイルテーブル) が表示されます。この場合、VBR (可変ビットレート) の開始セクターには、予約領域と FAT1 が含まれています。 & FAT2セクターのサイズを拡張した場合、データ領域の位置が特定できるということでしょうか?

計算してみると、予約領域のセクター数は0x0E~Fで、6,874個です。FATセクターのサイズは0x24~7なので、659個となります。しかし、FAT1とFAT2が存在するため、2倍にすると、1,318個になります。これらの値をすべて合計すると、6,874 + 1,318 + 682,112(FAT - VBRの開始セクター)= 690,304個となります。それでは、これらのセクターにアクセスしてみましょう。

このような形で復元されたFAT32のデータ領域を見つけることができました。FAT32の場合、データ領域の構造は…

出典:dotaky99.tistory.com / 詳細は下記リンクをご参照ください。
[ファイルシステム]FAT32 - 第3部 (データ領域、復元)
現状はこのような状態です。重要なのは、SFN(短いファイル名)とLFN(長いファイル名)を区別する必要があることです。12バイトの値を基準に区別できます。この2つの区別が必要な理由は、ファイル構造が異なるためです。

出典:blog.forensicresearch.kr / 添付リンク
基本的には32バイトごとに区切られていますが、SFN(Small File Name)の構造は以下のようになっているため、確認する必要があります。しかし、LFN(Long File Name)の場合は、考慮すべき点がさらに増えます。まず、32バイトのうち、11バイトの値が0x0Fの場合、その32バイトはLFNの構造であると判断できます。その後、0x0の位置にある1バイトを見ると、「シーケンス番号」であることがわかります。この値が重要です。

この写真から、開始のSeqNumが42であることがわかります。また、12バイトが0x0Fであることがわかります。したがって、現在表示されている部分から2行は、LFN構造になっています。下部の32バイトも同様で、SeqNumが1であることがわかります。結論として、このファイルは2つのLFN構造で構成されていることがわかります。SeqNumを確認することで、このことがわかります。複数のLFN構造を持つファイルの場合、最後の32バイトのSeqNumが0x40または計算結果として表示されることがあります。残りのLFN構造のSeqNumは0x01から1ずつ増加するため、0x40を超える値は、0x40または計算結果として、そのファイルが持つLFN構造の数を知らせるものと解釈できます。したがって、0x42に対して再度XOR演算を行うと、2という結果が得られ、LFN構造が2つのファイルであることがわかります。

同様に、この例の画像からも、3つのLFN構造を持つファイルであることがわかります。
NTFSの場合、少し異なります。NTFSのパーティションには、VBR(ボリューム・ブローカー)、MFT(マスターファイルテーブル)、データ領域が含まれているはずです。もう少し詳しく見てみると、1つのVBRとMFTがあり、実際にはMFTは複数のMFTエントリの集合です。MFTエントリは、それぞれファイルやディレクトリに対応します。MFTエントリのシグネチャは、FILEというヘッダー構造の一部です。

このような状況です。
そこで、MFTエントリを見つける方法について説明します。NTFS VBRの構造を参考にすると、必要な情報は、1つのセクターあたり何バイト、1つのクラスタあたり何セクター、MFTエントリの開始クラスタの位置です。

この例では、必要な3つの値は以下のようになっています。まず、1つのセクターあたり512バイトで、1つのクラスタあたり8つのセクターです。MFTのエントリー開始クラスタの位置は6F00で、これは16進数で28,416を表します。したがって、実際のMFTのエントリー開始セクターの位置はどれになりますか?1つのクラスタあたり8つのセクターが含まれているため、開始クラスタの位置に8を掛ける必要があります。その結果は227,328となり、現在128セクターから開始しているため、128を足すと227,456となります。それでは、このセクターに移動してみましょう。

このようなMFTエントリのシグネチャ(署名)を確認できます。次に、このMFTエントリのヘッダー部分を見てみましょう。これは48バイトで構成されています。

まず、これらの値を比較すると、最初の赤い部分(24~27バイト)は、実際に使用されているファイルサイズを示しており、その後の28~31バイトは、MFTエントリに割り当てられたサイズを示しています。合計で1,024バイト(多くの場合、このような構成になっています)です。MFTエントリは、1つのファイルまたはディレクトリに対応します。そして、2セクタ(1,024バイト)後の部分について

再び、MFT Entryがこのように開始されることを確認できます。MFT Entryは、信頼性を高めるために、Fixup構造をMFT Entryヘッダーの後に配置しています。MFT Entryの4~5バイト、5~6バイトはそれぞれ、Fixup配列の場所と配列の長さを表します。16進数で30と3なので、48バイトから始まり、2バイトの長さのFixup値が配置され、その後、以前に得られた3バイトと2バイトのFixup値が配置されることで、合計6バイトのFixup値によって置き換えられた値を格納する領域となります。このFixup値は、セクターの内容が異常に変化したり、データを解釈する前のエラーを事前に検出するために使用されます。次に、属性ヘッダーと内容が繰り返されます。この点について、参考になるブログを紹介します。
おまけ
おそらく、この投稿が今週の最終的な内容になると思われます。NTFSのMFTエントリ内の構造について、まだ完全に理解できていないため、少し残念ですが、これほど多くの情報を学んでいるので、今後も継続的に学習していく必要があると感じています。
ログイン