2011年6月17日金曜日

まちがって初期化したSDカードの画像と動画を抜き出すには

友人が間違ってカメラを初期化してしまってデータを取り出したいそうなので、
カメラの操作で間違ってSDカードを初期化した場合に、
画像(.jpg)と動画(mp4)を実際に復活させられるのかを実験してみた。

まず、初期化だけしても0書き込みなどしない限り、データの配列は残っているはずなので、
それをダンプして、ファイルっぽいところを切り取ってやれば、画像や動画になるはず。

順番は
・ダンプ
・該当ファイル領域特定
・切り取り

となる。
実験に当たって、
画像と動画を何枚も撮影してあるSDカードを、
カメラの操作で初期化を一度行った。
書き込みはせずにそのままUSBカードリーダーに接続した。
[ダンプ]
SDカードをPCにつないでddコマンドでディスクイメージをファイルに抽出(以後ここにあくせす)windowsにはddは無いが、gnuから出ているらしい。今回はmacで。
<1>
sudo dd bs=10m if=/dev/disk1 of=/Users/User Name/SD_Dump3.dmp
なかんじで。16GBあったが、15分ほどで完了。
ifは抽出元、ofは抽出先。disk1は今回のusbカードリーダの位置(diskutil listで調べる)。

[該当ファイル領域特定]
macなら0xEDというダンプソフトがあるので、
それでファイルの16進数ダンプを見ながらすすめる。
http://homepage2.nifty.com/~chairo/html/jpeg/jpeg.html
ここ参照に、jpegファイルはFF D8から始まるらしいので、0xEDでFF D8を検索。
そこからjpegファイルなら数メガバイト適当にとった。(上記のページでサイズ数がわかるようにフォーマットを調べるのが正しいが、今回は動画が欲しかったので)

mp4の場合
http://atomicparsley.sourceforge.net/mpeg-4files.html
このサイトがとても役に立った。
mp4の初めには[4byteのサイズ情報][ftyp]というバイナリが入っているので、
ftypというテキストを検索してやれば、先頭が出る。
mp4はatomという単位の入れ子構造になっていて、
ルートなしの4こ並び(この4つは木構造)
で、どのatomも初めに[4byteのサイズ情報]がある。
つまり、
先頭アドレス(サイズ情報格納アドレス) + [4byteのサイズ情報] = 次のatomの先頭アドレス
となるので、順々にatomをたどっていくと、そのうち00000がでてたどれなくなるので、
そこをファイルの終端とする。
<2>
ファイルの先頭=[4byte][ftyp]の先頭アドレス
ファイルの終端=最後の00000

として、再びddを使いこの先端と終端で抜き出す。
[切り取り]
<3>
dd if=SD_Dump3.dmp of=testmp4.mp4 bs=512 skip=2080768 count=790343
ここではbsでセクタ数を512byteに設定。
skipで2080768ブロック(つまり 2080768 * 512 byte)から抜き出すように設定、
counteで790343ブロック分抜き出すように設定。
bsを1にすれば、skip,countともに、アドレスから計算しやすいが、ものすごい遅くなるので、bs=512で行う。
これは、適当に先端アドレスを512で割って、切り捨てした数をskipに。
(終端 ー 先端) を512で割って切り上げした数をcountにすることで数字が出せる。

<4>
bs=1以外では、先端と終端に余計なバイナリがつくと思われるので、
バイナリエディタを見ながら、先端アドレス以前のバイナリを切り取るなどする。

こんな方法でjpgとmp4が抜き出せた。
dumpしたイメージファイル読み込んで自動化することもできるかもしれない。
ただ、本当はCannon7Dのmovファイルが取り出したいんだけど、
もってないんですね。SonyのNEX3で試しました。

ファイルのフォーマットがわからなければ、自分がすでに持ってる類似したファイルを、
ダンプかけてファイルのヘッダーの特徴などを見ればいいかもしれないですね。サイズが分かりませんが。

1 件のコメント: