SQLiteから削除されたデータを復元する:フリーブロックチェーンのナビゲート

はじめに

SQLiteデータベースは、チャットメッセージからトランザクションログまで、多くのアプリで見られるデジタル証拠の宝庫だ。しかし、レコードが削除されたらどうなるのだろうか?入る フリーブロック-データベース・ページ内の未使用領域で、削除されたデータの名残をとどめる隠れた部分。これらのフリーブロックは、フォレンジック調査官にとって、重要な記録の復元や隠された証拠の発見を可能にする金鉱です。

このブログでは、SQLiteのフリーブロックについて、その仕組み、ヘックスエディタなどのツールを使ってフリーブロックを見つける方法、削除されたレコードを復元する方法について説明します。あなたが捜査官であろうとデジタル・フォレンジック愛好家であろうと、このガイドは隠されたデータを抽出するために不可欠なテクニックをあなたに提供します。

SQLiteのフリーブロックとは何ですか?

フリーブロックは SQLite データベースページ内の未使用領域のセクションです。レコードが削除されても、安全な消去メカニズムが有効になっていない限り、対応する領域はすぐには上書きされません。代わりに フリーブロック将来の執筆に利用できる。

このプロセスにおいてだ:

  • 削除されたレコードへのポインタが削除される。
  • ページヘッダーは削除を反映して更新される。
  • 該当する場合、最初のフリーブロックを指すオフセットが調整される。

 

このようなフリーブロックには、元のデータが残っていることが多いため、削除された記録の復元を目指すフォレンジック調査官にとって、重要な焦点となる。

下のスクリーンショットでは、DB Browserを使ってSQLiteデータベースを調べている。messages "テーブルには生きているレコードが2つ表示されているが、フォレンジックの手がかりから、さらに削除されたレコードがあることがわかる。

SQLiteのページヘッダーにおけるフリーブロックの位置づけ

フリーブロックを見つけて分析するには、まずSQLiteデータベースのページの構造を理解する必要があります。各ページには、フリーブロックへのポインタを含む重要なメタデータを提供するヘッダが含まれています。

以下の表は、0Dページタイプのヘッダー構造の概要を示している:

オフセット サイズ 説明
0 1バイト ページタイプ
1 2バイト 最初のフリーブロックへのバイトオフセット
3 2バイト ページのセル数
5 2バイト セル内容の最初のバイトへのオフセット
7 1バイト セル内の断片化された空きバイト数

重要な収穫

ページヘッダのオフセット1の値は、最初のフリーブロックを指す。この値が 0x0000このページにはフリーブロックはありません。

ヘックスエディターによるフリーブロックの分析

最初のフリーブロックを見つけるために、16進エディターでデータベースを開く。ページヘッダーのオフセット1にある2バイトの値が、フリーブロックの位置へのオフセットとなる。

下の例では

  • 16進エディタはオフセットをハイライトする 0x03A9 (10進数937)を赤で囲み、最初のフリーブロックの位置を示している。

このオフセットに移動すると、フリーブロックの開始位置がわかる。以下、オフセット 937 にあるセルを見てみよう。

フリーブロックヘッダーのデコード

各フリーブロックには4バイトのヘッダーが含まれる:

  1. 最初の2バイト:次のフリーブロックへのオフセット0x0000 存在しない場合)。
  2. 2バイト目:ヘッダー自身を含むフリーブロックの合計サイズ。

オフセット時 0x03A9フリーブロックのヘッダーが示す:

  • 次のフリーブロックはオフセット 0x03EA (10進数1002)。
  • フリーブロックのサイズは 0x0024 (ヘッダーを含めて36バイト)。

フリーブロックを使用した削除されたレコードの復元

フリーブロックには削除されたレコードの残骸が含まれていることが多いため、フォレンジック調査官はデータの一部または全部を復元することができます。下のスクリーンショットでは、ポインタが削除されているにもかかわらず、削除されたレコードのペイロードがそのまま残っており、復元可能です。

  • オフセット 0x03A9 というメッセージが含まれている:「大したことはない。お元気ですか?
  • 他のメタデータが上書きされても、メッセージ・コンテンツを含む主要フィールドはそのまま残る。

その後のフリーブロックを分析し、さらに削除されたレコードを発見する。オフセット 0x03EAフリーブロックのヘッダーを見るとわかる:

  • フリーブロックのサイズは 0x0016 (22バイト)。
  • で示されるように、これはチェーンの最後のフリーブロックである。 0x0000 を次のフリーブロックポインターフィールドに置く。

下のスクリーンショットは、削除されたメッセージ "Hi Andy!"があったチェーンの2番目のフリーブロックのセルエリア全体をハイライトしている。

削除された追加レコードの特定

しかし、このページにはフリーブロック・チェーンで参照されていない削除されたレコードがもう1つある。ページヘッダを見返すと、オフセット3の2バイト値によれば、このページには2レコードしかなかった(0x00002).レコードは2つしかないので、ポインタ配列には2つのポインタしかない。この2つのポインタは、レコード#2 - "Hey, what's up?" とレコード#4 - "Hey, I was wondering if you have any Scooby snax." を指している。さらに上のほうにもうひとつ長いメッセージがあることにお気づきだろうか。

ページ・ヘッダーのオフセット5にある2バイトの値は、セル・コンテンツ・エリアへのオフセットであり、基本的に次のレコードが書き込まれる場所である。この値は 0x0363 これは10進オフセット867である。

上のスクリーンショットの矢印はページ・オフセット867を指している。つまり、このレコードのすぐ上に次のレコードが追加されることになる。この上の削除されたレコードには、「昨夜、たまたま新しい供給がありました。運がいいですね。どのくらい必要ですか?"

データベースはこのデータを未割り当てのスペースと見なす。このデータは 0x00 というのも、ポインタ配列の中にそのポインタを指すポインタがないからである。 

ページの2つのフリーブロックに収まらない大きさのレコードが、このページが属するテーブルに追加された場合、そのメッセージは上書きされる。 

それでは、2つのフリーブロックと、上書きされるのを待っている3つ目の削除済みレコードを確認してみよう:

データベースを生のフォーマットで分析した結果、データベース・ビューアが表示した2つの "ライブ "レコード以上のものが含まれていると結論づけることができる。 

レコード#1はおそらく「やあ、アンディ!」というメッセージであり、レコード#3はおそらく「あんまり。元気かい?レコード#5はまだそのレコード番号がセル内に残っており、「たまたま昨夜新しいのが入ったんだ。運がいいね。どのくらい必要ですか?"

 

結論

フリーブロックはフォレンジック調査において強力なツールであり、削除されたレコードや未割り当てのデータを覗き見ることができる。これらのテクニックを使いこなすことで、捜査官はデータベースが残したデジタル痕跡を明らかにすることができます。

SQLiteのフォレンジックスキルを次のレベルに引き上げる準備はできていますか?当社の上級トレーニングプログラムをご覧になるか、フォレンジックのエキスパートになるにはどうすればよいか、当社までお問い合わせください。

フェイスブック
ツイッター
電子メール
プリント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です