adbバックアップで作成されたファイルの中を見て修正する方法はありますか?


40

Galaxy Nexusのバックアップを作成しましたadb backup。結果のファイルにはbackup.dbという名前が付けられ、何らかの方法で暗号化されます。

バックアップを復元したかったのですが、復元に関しては停止しcom.android.providers.contactsます。以前はadb logcat何が起こっているのかを見つけcom.android.acore、復元プロセス中にクラッシュすることがわかりました。

バックアップのデータにアクセスし、連絡先データベースを削除して、すべてを電話機に復元したいと思います。バックアップからデータを復元する他の方法はありますか?

回答:


14

バックアップの作成時に指定しない限り、ファイルは暗号化されません。ただし、圧縮されます(deflateを使用)。Androidソース(com / android / server / BackupManagerService.java)コードを調べることで正確な形式を見つけることができ、技術的にはそこから特定のデータを抽出できるはずです。ただし、IIRCでは、いくつかのファイル整合性チェックが行われているため、大量のデータを削除しただけでは機能しない可能性があります。残念ながら、restoreコマンドには特定のアプリ/パッケージのみを復元するオプションやパッケージを除外するオプションがないようです。


ありがとう!これは、少なくともファイルの内部を見るための出発点です。バックアップ用のパスワードを提供していなければ、もっと簡単だっただろう。
インゴリヒター

パスワードを指定した場合、実際に暗号化されます。「BackupManagerService」には、実際の暗号化アルゴリズムの詳細があり、キー派生パラメーター(塩、反復カウントなど)がファイルヘッダーに書き込まれます。パスワードがわかっているので、キーを導出してデータを復号化できます。だから、...特に容易それでもなんとかだが、ではない

はい、現在BackupManagerService、バックアップファイルの内容を読み取るためにすべてを抽出しています。かなりの量の作業ですが、データを戻す必要があります
...-ingorichter

@ingorichter進捗はありますか?
ジョン

@ingorichter私はこの作業を開始し、「コミュニティwiki」の回答に以下の大量のメモを投稿しました。気軽に追加してください。
ジョン

50

私はこれに取り組み始めました。ここでは、2つの理由で「コミュニティwiki」の回答として結果を投稿しています。1つ目は、他の誰かが参加したい場合、話し合う場所があることです。第二に、私がこのプロジェクトから引き離された場合、他の誰かが作業を開始するためのヒントがあります。

 

ホストのバックアップロジックは、https://github.com/android/platform_system_core/blob/master/adb/commandline.cppの名前が付けられた関数に完全に含まれていますbackup。この関数は非常に単純です。コマンドラインオプションを検証し、コマンドをほとんどそのまま電話のadbデーモンに送信し、電話の出力をファイルに書き込みます。エラーチェックすらありません。たとえば、電話でのバックアップを拒否adbした場合、空のファイルを書き出すだけです。

電話では、バックアップロジックはhttps://github.com/android/platform_system_core/blob/master/adb/services.cppで開始さservice_to_fd()ます。この関数は"backup"、ホストからのコマンドがであることを識別し、未解析のコマンドをに渡します/system/bin/bu。これは、新しいAndroidアプリプロセスのメインクラスとして起動する簡単なシェルスクリプトcom.android.commands.bu.Backupです。これはServiceManager.getService("backup")、バックアップサービスを取得するためIBackupManagerにを呼び出しIBackupManager.fullBackup()、を呼び出しbackup.abて、ホスト上のファイルに接続された(非常に間接的に)未使用のファイル記述子を渡します。

制御fullBackup()com.android.server.backup.BackupManagerServiceに移り、ユーザーにバックアップの確認/拒否を求めるGUIがポップアップ表示されます。ユーザーがそうすると、acknowledgeFullBackupOrRestore()(同じファイル)が呼び出されます。ユーザーがリクエストを承認しacknowledgeFullBackupOrRestore()、バックアップが暗号化されているかどうかを判断し、メッセージをBackupHandler(同じファイルに)渡し、BackupHandlerインスタンス化して開始しますPerformAdbBackupTask同じファイル、執筆時点の行4004)。

最後にPerformAdbBackupTask.run()行4151行4330の出力の生成を開始します。

最初に、run()4行または9行のASCII行で構成されるヘッダーを書き込みます。

  1. "ANDROID BACKUP"
  2. バックアップ形式のバージョン:現在 "4"
  3. いずれかの"0"バックアップが圧縮されていない場合、または"1"それがある場合
  4. 暗号化方式:現在"none"または"AES-256"
  5. (暗号化されている場合)、16進数でエンコードされた「ユーザーパスワードソルト」、すべて大文字
  6. (暗号化されている場合)、16進数でエンコードされた「マスターキーチェックサムソルト」、すべて大文字
  7. (暗号化されている場合)、10進数としての「使用されたPBKDF2ラウンドの数」:現在 "10000"
  8. (暗号化されている場合)、16進数でエンコードされた「ユーザーキーのIV」、すべて大文字
  9. (暗号化されている場合)、16進数でエンコードされた「ユーザーIVで暗号化されたマスターIV +キーBLOB」、すべて大文字

実際のバックアップデータ(圧縮および暗号化に依存する)のいずれかとして、以下tardeflate(tar)encrypt(tar)、またはencrypt(deflate(tar))

 

TODO:tar出力を生成するコードパスを作成します。エントリが適切な順序である限り、単純にtarを使用できます(以下を参照)。

タールアーカイブ形式

アプリデータは、_manifestファイル、a /のAPK(要求された場合)、f /のアプリファイル、db /のデータベース、sp /の共有設定で始まるapp /ディレクトリの下に保存されます。外部ストレージのバックアップを要求した場合(-sharedオプションを使用)、外部ストレージファイルを含むアーカイブ内のshared /ディレクトリもあります。

$ tar tvf mybackup.tar
-rw------- 1000/1000      1019 2012-06-04 16:44 apps/org.myapp/_manifest
-rw-r--r-- 1000/1000   1412208 2012-06-02 23:53 apps/org.myapp/a/org.myapp-1.apk
-rw-rw---- 10091/10091     231 2012-06-02 23:41 apps/org.myapp/f/share_history.xml
-rw-rw---- 10091/10091       0 2012-06-02 23:41 apps/org.myapp/db/myapp.db-journal
-rw-rw---- 10091/10091    5120 2012-06-02 23:41 apps/org.myapp/db/myapp.db
-rw-rw---- 10091/10091    1110 2012-06-03 01:29 apps/org.myapp/sp/org.myapp_preferences.xml

暗号化の詳細

  1. AES 256キーは、ランダムに生成された512ビットのソルトで10000ラウンドのPBKDF2を使用して、バックアップ暗号化パスワードから取得されます。
  2. AES 256マスターキーがランダムに生成されます
  3. マスターキー「チェックサム」は、ランダムに生成された新しい512ビットソルトを使用して、PBKDF2の10000ラウンドでマスターキーを実行することによって生成されます。
  4. ランダムバックアップ暗号化IVが生成されます。
  5. IV、マスターキー、およびチェックサムは、1で導出されたキーで連結および暗号化されます。結果のblobは、16進文字列としてヘッダーに保存されます。
  6. 実際のバックアップデータはマスターキーで暗号化され、ファイルの最後に追加されます。

サンプルパック/アンパックコードの実装(プロデュース/使用)tarアーカイブ:https : //github.com/nelenkov/android-backup-extractor

詳細はこちら:http : //nelenkov.blogspot.com/2012/06/unpacking-android-backups.html

壊れたアーカイブをパック/アンパックおよび修正するためのPerlスクリプト:

http://forum.xda-developers.com/showthread.php?p=27840175#post27840175


コードをどこかに置くと、私は参加できるかもしれません。OP(@ngorichter)にはおそらく実際に動作するコードもあります:)実際のファイルを解凍して抽出するユーティリティが役立つ場合があります。そのため、一部だけを復元できます(もちろんルートがある場合)。
ニコライエレンコフ

1
暗号化部分については、詳細を調べる必要がありますが、キーはPBKDF2を使用してソルトおよびデバイスロック解除PIN、パスワード、またはパターン(文字列に変換)によって取得されます。マスターキーはランダムに生成され、パスワードから派生したキーで暗号化されます。最初に暗号化されていないアーカイブで動作するようにします。問題が発生した場合は、復号化部分を実装できます。
ニコライエレンコフ

申し訳ありませんが、キーは実際にはバックアップの開始時に指定したパスワードに基づいて導出されます。
ニコライエレンコフ

@NikolayElenkovまだコードはありませんが、abファイルを操作するユーティリティを書く予定です。暗号化については、難しいことではないと思います。ただ、コードのその部分だけを見ていただけです。同様に、tarストリームを生成するコードパス(上記ではまだ記述されていません)をトレースしましたが、実際の形式がGNU tarであることをまだ確認していません。
ジョン

うわー、私はあなたの分析に感銘を受けました。BackupManagerServiceからいくつかのコードを単純なgroovyスクリプトに抽出しましたが、プログラムを実行したときの結果は常に同じです。間違ったパスワードが入力されました。単純なパスワードを使用して新しいバックアップを作成しましたが、パスワードの検証が再び失敗しました。現在、上記のプログラムに従って、間違いを見つけようとしています。
インゴリヒター

7

Nikolay Elenkovからのすばらしい詳細な回答。ただし、誰かがそれを行うソフトウェアをすでに開発し、ここにパッケージ化することを追加する必要があります:http : //sourceforge.net/projects/adbextractor/

パッケージには、JavaツールとPerlツールの両方が含まれています。私自身はいつでもJavaよりもPerlを好むので、Perlコードを抽出し、それらが実行可能であることを確認し、必要なPerlライブラリをインストールbackupdecrypt.plし、adbバックアップファイルに対して実行し、それをtarまたはgzip圧縮されたtarファイルに変換します問題。

Bash 3で1つのライナーを作成して、gzip圧縮されたtarファイルに直接adbバックアップを実行できるようにしました。

adb backup -f >(backupdecrypt.pl -D -z - backup.tgz) -all

それが役に立てば幸い。


6
ええ、彼らは私が書いたツール(Javaの1つ)をパッケージ化しました:)また、Perlへの移植を手伝いました。あなたはREADMEファイルを読んでいない場合、過去記事が最初に来たことがすぐに明らかにならないかもしれないが、その後、ツール....
ニコライElenkov

バックアップを作成しましたが、.abファイルは作成していませんが、代わりに.backupファイルを作成しています。抽出方法を知りたい。また、すべての写真とビデオをバックアップとして取得したかどうかわかりませんか?
ハジラジン

-4

既存のバックアップファイルを調べるには、http://www.adb-backup.comページを試してください。「dd」、「tar」、...

データはこのサーバーに保存されません。このオンラインサービスは、dd / tarを操作したり、追加のソフトウェアをインストールしたりせずにバックアップを簡単に表示できるようにするために開発しました。私は著者ですwww.adb-backup.com


7
私はランダムなウェブサイトにadbバックアップをアップロードする(そしてパスワードを提供する)ことに非常に注意します... adbバックアップに含まれるデータはプライベートであり、サイトがバックアップで何をするかを知る方法はありません。無害かもしれませんが、これを行うことはお勧めしません。
bmdixon

Metasmokeによると、これはスパムURLです。それとは別に、ここで@bmdixonに完全に同意します。特に安全な方法が存在するため、ローカルでタスクを実行します。
イジー

@Izzyとにかくスパムとしてフラグを立て、SmokeDetectorに報告しました。
iBug

データはこのサーバーに保存されません。このオンラインサービスは、dd / tarを操作したり、追加のソフトウェアをインストールしたりせずにバックアップを簡単に表示できるようにするために開発しました。私は著者ですwww.adb-backup.com
Liszak
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.