2011年6月21日火曜日

Motorola Xoom 地獄のRSD Mode 2 LNX 0x0004

Xoomを買った。
Android3.1にしたくて、手動でアップデート試して失敗して、
US版のファームなら行けるということで、fastboot oem unlockしてrootとって
US Retail書きこんでfastboot oem lockしたら、
image failed
RSD Mode2という表記とLNX 0x0004という謎のメッセージと共に、
(LNX 0x0002というのも同じらしい)
Xoomは5万円のまな板になってしまった。
どういう状況かというと、本来であれば、

・VolUp + PowerButtonで再起動
・VolDown押しっぱなしでFastboot modeに移行

で、PCからfastboot oem unlockでまた戻れるはずだったが、
PCにケーブルをつないでも、なにも反応しない。

調べていると、
http://forum.xda-developers.com/showthread.php?t=1108518
にあたった。
結果から言えば、この方法で回復できた。ありがとう掲示板のドイツ人。本当にありがとう。

[解決方法]
MicroUSB-Bコネクタ側(usbの小さいほう)の1番PIN(電源5V)と4番PINをリード線でくっつけてやる(ハンダ付け)。これがMotorolaのファクトリーケーブル(factory cable)となる。(http://ja.wikipedia.org/wiki/Universal_Serial_Bus 中程の図を参考に)
4番PINというのは普通は使われていないそうで、たしかにケーブル分解したら、
ひとつだけ放置されているPINがありました。

ちなみにファクトリーケーブルは、ここで買えるらしいです。50$もするけど。
ただ、ページ中のインストラクションは役に立つので、見ておくといいかも。
http://shop.teamblackhat.info/Factory-style-programming-cable-for-Motorola-FactCable.htm


これをBコネクタ側を先にXoomに接続後、PCにホスト側コネクタをつなぐ。
さらに、電源ケーブルをXoomに挿す。
そして電源をVolDownを押しながら入れる。
するとまたこの間のimage failedとともに、fastboot modeが始まっている。

前回と表記がなにも変わらないので、落胆しながらPCにつないで、
PC側からfastboot deviceを実行すると、動きました!

あとは、fastboot oem unlockするなど、fastboot flashするなど好きにできます。

#USBケーブルの改造で、実は一本無駄にしました。壊してもいいような安いケーブルが必要だということで、秋葉原の秋月電子で150円のを買ってきて、3本ほど買いました。安い。ゴムの皮膜を剥くように外すと、ホットボンドで固められているのでそれも側面に切り込みを入れると綺麗に剥けて、線の接続部が出てきます。

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で試しました。

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