デジカメ用メモリーからの画像の救出(復旧)

ディレクトリ・エントリやFATテーブルが破壊されたディスクから、ファイルの先頭に「EXIF/JPEGヘッダ情報」があるファイルを救出する方法です。

主に、デジカメのメモリーカードの管理領域が破壊された場合のデータ・レスキューを対象とします。

ココに書かれている方法は、全てOSの標準機能、フリーソフトウエアのみで実行可能です。

注意

これらの操作の影響、結果についてはすべて自己責任で行ってください。
仮に、データがすべて消失したり、OSが破壊されたり、家屋が全焼したり、日本が財政破綻しても作者は何ら責任を負いません。

このドキュメントで説明している内容が理解不能な方、自己責任について理解できない方は、「有料のデータ復旧サービス会社」を利用してください。

この件に関して当方への質問、提案、苦情、その他問い合わせ等は一切受け付けません。
当方が公開しているプログラムが正常に動作するかどうかは、一切保証できません。まず、ご自分で十分なテストを行ってください。

想定している利用環境

USB ストレージデバイスとして接続されたメモリー・カード (リムーバブル・メディアとして認識)
FAT ファイルシステム
JPEG (EXIF) データ
データは連続して格納されている(途中で削除、記録を繰り返していない)

ディスク・イメージの抽出

Linux で抽出することをお勧めしますが、Windows でも一応可能です。

Linux で抽出

[root@linux root] # fdisk /dev/sda1
 
コマンド (m でヘルプ): p
 
Disk /dev/sda1: 16 MB, 16363008 bytes
4 heads, 16 sectors/track, 499 cylinders
Units = シリンダ数 of 64 * 512 = 32768 bytes
 
デバイス ブート 始点 終点 ブロック ID システム
 
コマンド (m でヘルプ): q
 
[root@linux root] # dd if=/dev/sda1 of=./diskimg.dat bs=512 count=31960
 
読み込んだブロック数は 31958+0
書き込んだブロック数は 31958+0
[root@linux root]

fdisk コマンドでセクタ数を計算して、dd コマンドで一気にデータを抽出しています
シリンダ数 = 16363008 ÷ 512 = 31959

少し大目のセクタ数を dd コマンドに指定しても、ディスク・エンドで自動的に終了します

(領域外の読み込みエラー分岐が全てのバージョンの dd でうまくいくとは保証しませんが...)

Windows 2000,XP で抽出

Windows 2000 SP4 サポート ツール
Windows XP Service Pack 2 サポート ツール

上記のサイトなどより、Windowsサポートツールをダウンロードし、その中の『DiskProbe』を用います。

このプログラムは、物理ディスクと論理ディスクの双方を扱うことが出来ます。リムーバブル・メディアを対象とする場合は、論理ディスクしか選択できませんが、実用上問題ありません。
なお、1回の読み込みで取り扱い可能なセクタ数は、4000程だと思われます。複数回に分けて気長に抽出しましょう。

JPEGファイルの切り出し

EXIF ヘッダ 「 FFH D8H FFH E1H 」 をファイル開始のキーワードとして自動的にファイルを切り分けるソフトウエアを公開しています。

拙作 フリーソフトウエア FileSequenceCutter ファイル連続カッター(FileSequenceCutter010.lzh)

取り扱い可能なファイル長は long 変数までです。ギガ・バイトは余裕で扱えますが、テストは640MBytesまでしかしていません。

書き出しフォルダには、何もファイルが入っていないフォルダを指定するのが望ましいです。「 data0000.dat 」のように数字をつけて書き出します。

キーワードは16進数8ビットのバイト列で記述します。16進数のみでも、0x を付けても、H を付けても認識するはずです。

なお、JPEGファイルのエンドは検出していませんので、次のファイルの先頭の1バイト手前、もしくはファイル・エンドまで書き出されます。気になる方はJPEGファイルの無駄領域を削除するソフトウエアで削除してください。

EXIFデータによるファイル名の振りなおし、タイムスタンプの設定

拙作 フリーソフトウエア ExifFileAutoName EXIF自動ファイル名変換(ExifFileAutoName020.lzh)

切り出したデータファイルのあるフォルダを指定して、「タイムスタンプの変更」と「ファイル名の変更」を実行します。
ファイル名変更では、EXIFヘッダがあれば自動的に拡張子を jpg に変更します。