iPhoneのバックアップデータを漁る方法

2013-09-18

iPhoneのバックアップデータを漁る

iPhoneのデータをAndroid端末に移行するなど、様々なケースでiPhoneからデータを抽出したくなることがあります。 普通はiTunesを使ってデータを同期させてデータを抽出するのですが、同期させるとデータが消えることがあり、あまり同期したくありません。 そんな場合は同期せずにiPhoneのバックアップをiTunesでとり、PCに保存されたバックアップデータを漁ってデータを取り出すのも一つの方法です。 今回はiPhoneのバックアップデータを漁る方法について紹介します。

バックアップデータはどこにある?

まずはバックアップデータがどこにあるのか確認しましょう。 $HOME/Library/Application Support/MobileSync/Backup/の下にハッシュ化されたディレクトリがあるので確認しましょう。 ディレクトリがたくさんあってわからない場合は、ディレクトリの作成日時の最新のものを探しましょう。

$ ls "$HOME/Library/Application Support/MobileSync/Backup/"
1b345454cbec76848e94c41ce0a2d6b7328973e9

私の環境では$HOME/Library/Application Support/MobileSync/Backup/1b345454cbec76848e94c41ce0a2d6b7328973e9にバックアップデータがあります。

それではバックアップデータのあるディレクトリに移動してどんなファイルがあるか確認してみましょう。

$ cd "$HOME/Library/Application Support/MobileSync/Backup/1b345454cbec76848e94c41ce0a2d6b7328973e9"
$ ls
0000001db666a0b4c679276b401a13bc7ada287c
0012522986309dacda6c05e68fccb104fcbf4e41
....

なにやら大量に出てきますね。

ハッシュ化のルール

バックアップデータのディレクトリにあるファイル名はそれぞれハッシュ化されています。 ハッシュ化のルールは実は単純でsha1(domain名+'-'+パス)となっています。 例えば、アドレス帳のデータはドメイン名HomeDomainLibrary/AddressBook/AddressBook.sqlitedbに格納されていますが、この場合

$ ruby -r digest/sha1 -e 'puts Digest::SHA1.hexdigest("HomeDomain-Library/AddressBook/AddressBook.sqlitedb")'
31bb7ba8914766d4ba40d6dfb6113c8b614be442

31bb7ba8914766d4ba40d6dfb6113c8b614be442になっています。

実際、

$ file 31bb7ba8914766d4ba40d6dfb6113c8b614be442
31bb7ba8914766d4ba40d6dfb6113c8b614be442: SQLite 3.x database

とSQLite3のデータベースファイルになっていることがわかります。

アドレス帳のデータはこのファイルのABPersonというテーブルに格納されているのでここから抽出できます。 次のような簡単なスクリプトで抽出できます。

{% gist 6608998 %}

backup_dirの値を適当に環境に合わせて書き換えるとご自分の環境でも使えるでしょう。 あとはニーズに合わせて適当にコードを編集すればvCardに変換することもできます。

写真や動画に関数情報は、ドメイン名CameraRollDomain、パスMedia/PhotoData/Photos.sqliteのデータベースファイルに格納されているので、同様にして12b144c0bd44f2b3dffd9186d3f9c05b917cee25から取り出すことができます。

以下、写真や動画を抽出する簡単なスクリプトの例です。 {% gist 6609106 %}

参考文献

まとめ

今回はiPhoneのバックアップデータを漁る方法について解説しました。 この方法を知っていれば、バックアップデータさえあれば、データを取り出すことができます。

ご質問等、何かありましたらこちらへ。