内側を見て、ADBバックアップ作成されたファイルを調整する方法はありますか? -- backup フィールド と adb フィールド android 関連 問題

Is there a way to look inside and modify an adb backup created file?












43
vote

問題

日本語

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

バックアップを復元したいが、 998877666544335 の復元になると停止します。 <コード> 99887766544336 を使用して、復元プロセス中に<コード> 99887765544337 がクラッシュすることを見つけて見つけました。

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

英語

I created a backup of my Galaxy Nexus with adb backup. The resulting file is named backup.db and it's somehow encrypted.

I wanted to restore the backup, but it stops when it comes to restoring com.android.providers.contacts. I used adb logcat to find out what's going on and found out that com.android.acore crashes during the restore process.

I'd like to gain access to the data in the backup and remove the contacts database to restore everything back to my phone. Are there any other ways restoring the data from the backup?

     
 
 

回答リスト

57
 
vote

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

ホスト上のバックアップロジックは、 https://に完全に含まれています。 github.com/android/platform_system_core/blob/master/adb/commandline.cpp 。 998877665444333 。この関数は eerm> simple:コマンドラインオプションを検証し、コマンドをAS-IS-IS-IS-IS-ISEに電話機のADBデーモンに送信し、電話の出力をファイルに書き込みます。エラーチェックさえもありません。たとえば、電話でバックアップを拒否した場合、<コード> 998877666544334 は空のファイルを書き出します。

電話機では、バックアップロジックは https://github.com/android/platform_system_core/blob/master/adb/services.cpp 。この関数は、ホストからのコマンドが<コード> 9988777666554336 であることを識別し、 9988776654337 に渡します。 Android / platform_frameworks_base / blob / master / cmds / bu / bu "rel =" noreferrer "> Trivial Shell Script 新しいAndroidアプリプロセスのメインクラスとして<コード> 99887766544338 を起動します。これは、 99887766654339 を呼び出して、バックアップサービスを<コード> 998877666666666543310 として取得し、 9988776666543311 を呼び出し、それを静止していないファイル記述子(非常に間接的に)接続されている<コード> 9988776666433312 ファイルのホスト上のファイルに。

コントロールは com.android.server.backup.backupManagerService は、ユーザーにバックアップを確認/拒否するようにGUIをポップアップします。ユーザーがそうすると、<コード> 99887766655443314 (同じファイル)が呼び出されます。ユーザーが要求を承認した場合、バックアップが暗号化されている場合は、<コード> adb uninstall com.google.android.apps.maps 5 は、メッセージを<コード> 998877665444333317 に渡します。インスタンス化してキックオフをオフにして(href = "https://github.com/android/platform_frameworks_base/blob/8e7057cf3824d1421a12abad7a2ba8b07e877c6/services/backup/java/com/android/server/backup/backupManagerService .java#l4004 "REL =" NOREFERRER ">同じファイル、4004 書き込み時点で

最後に、行4151 と行4330 。

最初に、<コード> backup20 は4つまたは9つのASCII回線で構成されているヘッダーを書き込みます。

  1. <コード> restore1
  2. バックアップ形式のバージョン:現在 backup22
  3. 998877655443323 99887766543324
  4. の場合
  5. 暗号化方法:現在<コード> 998876655443325 または<コード> 998877665443326
  6. (暗号化されている場合)、Hexでエンコードされた「ユーザーパスワード塩」
  7. (暗号化されている場合)、Hexでエンコードされた「マスターキーチェックサムソルト」
  8. (暗号化されている場合)、10進数として「使用されているPBKDF2ラウンド数」:現在<コード> 998876655443327
  9. (暗号化されている場合)、HEXでエンコードされた「ユーザーキーのIV」、すべてのCAPS
  10. (暗号化されている場合)、Hexでエンコードされた「マスターIV +キーBLOB」、すべてのCAPS
  11. でエンコードされています。

    実際のバックアップデータは、(圧縮と暗号化に応じて)<コード> 9988877665443328 、<コード>、<コード>、<コード>、<コード>、<コード>、または<コード>、または<コード>、または<コード>、または<コード> 99887666554443333 。

    todo :TAR出力を生成するコードパスを書き込みます - エントリが正しい順序にある​​限り、Tarを使用することはできます(下記参照)。

    tarアーカイブ形式

    アプリデータはApp / Directory、STの下に格納されています _manifestファイル、apk(要求されている場合)は、a / db / db / db / sp /の共有環境設定で、a / appファイル内のAPK(要求された場合)。外部ストレージバックアップを要求した場合(-Sharedオプションを使用)、外部ストレージファイルを含むアーカイブに共有/ディレクトリがあります。

     <コード> backup32  

    暗号化の詳細

    1. AES 256キーは、ランダムに生成された512ビット塩で10000ラウンドのPBKDF2を使用してバックアップ暗号化パスワードから派生しています。
    2. AES 256マスターキーはランダムに生成されています
    3. マスターキー 'checksum'は、新しいランダムに生成された512ビット塩で10000ラウンドのPBKDF2を介してマスターキーを実行して生成されます。
    4. ランダムなバックアップ暗号化IVが生成されます。
    5. IV、マスターキー、およびチェックサムは連結され、1に派生したキーで暗号化されています。結果のBLOBは、ヘッド文字列としてヘッダーに保存されます。
    6. 実際のバックアップデータはマスターキーで暗号化され、ファイルの終わりに追加されます。
    7. サンプルパック/アンパックコード実装(プロダクション/使用)tarアーカイブ: https://github.com/nelenkov/android-backup-extractor

      ここでの詳細: http://nelenkov.blogspot.com /2012/06/unpaking-android-backups.html

      梱包/解凍および壊れたアーカイブの固定のためのPerlスクリプト:

      http://forum.xda-developers.com/ShowThread。 PHP?P = 27840175#Post27840175

 

I started working on this. I'm posting my results so far here as a "community wiki" answer for two reasons: first, if someone else wants to join in, there's a place to talk; second, if I get pulled away from this project, there'll be hints for someone else to start working.

xc2xa0

The backup logic on the host is entirely contained within https://github.com/android/platform_system_core/blob/master/adb/commandline.cpp, in the function named backup. The function is very simple: it validates the command line options, sends the command mostly as-is to the adb daemon on the phone, and writes the phone's output to the file. There isn't even error-checking: if, for example, you refuse the backup on the phone, adb just writes out an empty file.

On the phone, the backup logic starts in service_to_fd() in https://github.com/android/platform_system_core/blob/master/adb/services.cpp. The function identifies that the command from the host is "backup", and passes the unparsed command to /system/bin/bu, which is a trivial shell script to launch com.android.commands.bu.Backup as the main-class of a new Android app process. That calls ServiceManager.getService("backup") to get the backup service as an IBackupManager, and calls IBackupManager.fullBackup(), passing it the still-unused file descriptor (very indirectly) connected to the backup.ab file on the host.

Control passes to fullBackup() in com.android.server.backup.BackupManagerService, which pops up the GUI asking the user to confirm/reject the backup. When the user do so, acknowledgeFullBackupOrRestore() (same file) is called. If the user approved the request, acknowledgeFullBackupOrRestore() figures out if the backup is encrypted, and passes a message to BackupHandler (same file.) BackupHandler then instantiates and kicks off a PerformAdbBackupTask (same file, line 4004 as of time of writing)

We finally start generating output there, in PerformAdbBackupTask.run(), between line 4151 and line 4330.

First, run() writes a header, which consists of either 4 or 9 ASCII lines:

  1. "ANDROID BACKUP"
  2. the backup format version: currently "4"
  3. either "0" if the backup is uncompressed or "1" if it is
  4. the encryption method: currently either "none" or "AES-256"
  5. (if encrypted), the "user password salt" encoded in hex, all caps
  6. (if encrypted), the "master key checksum salt" encoded in hex, all caps
  7. (if encrypted), the "number of PBKDF2 rounds used" as a decimal number: currently "10000"
  8. (if encrypted), the "IV of the user key" encoded in hex, all caps
  9. (if encrypted), the "master IV + key blob, encrypted by the user key" encoded in hex, all caps

The actual backup data follows, either as (depending on compression and encryption) tar, deflate(tar), encrypt(tar), or encrypt(deflate(tar)).

xc2xa0

TODO: write up the code path that generates the tar output -- you can simply use tar as long as entries are in the proper order (see below).

Tar archive format

App data is stored under the app/ directory, starting with a _manifest file, the APK (if requested) in a/, app files in f/, databases in db/ and shared preferences in sp/. If you requested external storage backup (using the -shared option), there will also be a shared/ directory in the archive containing external storage files.

$ 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 

Encryption details

  1. An AES 256 key is derived from the backup encryption password using 10000 rounds of PBKDF2 with a randomly generated 512 bit salt.
  2. An AES 256 master key is randomly generated
  3. A master key 'checksum' is generated by running the master key through 10000 rounds of PBKDF2 with a new randomly generated 512 bit salt.
  4. A random backup encryption IV is generated.
  5. The IV, master key, and checksum are concatenated and encrypted with the key derived in 1. The resulting blob is saved in the header as a hex string.
  6. The actual backup data is encrypted with the master key and appended to end of the file.

Sample pack/unpack code implementation (produces/uses) tar archives: https://github.com/nelenkov/android-backup-extractor

Some more details here: http://nelenkov.blogspot.com/2012/06/unpacking-android-backups.html

Perl scripts for packing/unpacking and fixing broken archives:

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

 
 
         
         
15
 
vote
vote
ベストアンサー
 

バックアップを作成するときに指定した場合を指定しない限り、ファイルは暗号化されません。しかし、圧縮されています(デフレートを使用)。 Androidソース(COM / Android / Server / BackupManagice.java)コードを見ることで、正確なフォーマットを調べることができます。そして、技術的には特定のデータを抽出できるはずです。ただし、IIRC、一部のファイルの整合性チェックがありますので、それはただそれからのデータを削除するだけではおそらく機能しません。残念ながら 9988776554432 コマンドは、特定のApp / Packageのみを復元するか、パッケージを除外するオプションを持っていないようです。

 

The file is not encrypted, unless your specify so when creating the backup. It is however compressed (using deflate). You can find out the exact format by looking at Android source (com/android/server/BackupManagerService.java) code, and, technically, should be able to extract specific data from it. However, IIRC, there are some file integrity checks in place, so it most probably won't work if you just delete a bunch of data from it. Unfortunately the restore command doesn't seem to have an option to restore a particular app/package only or exclude a package.

 
 
         
         
7
 
vote

Nikolay Elenkov 。しかし、私はすでにそのままでそれをここでパッケージ化するソフトウェアをすでに開発するように追加する必要があります。 http:// SourceForge。ネット/プロジェクト/ adbextractor /

パッケージには、JavaツールとPerlツールの両方が含まれています。私は自分自身がJavaを介して任意の日を好むので、私はPerlコードを抽出し、それらが実行可能なものであることを確認し、必要なPerlライブラリをインストールし、 998877666543333 をADBバックアップファイルに対して実行して変換します。問題なしのTARまたはGZIPのtarファイル。

Bash 3で1つのライナーを形成したことさえ、gzipped tarファイルに直接ADBバックアップを行うことを可能にする:

<事前> <コード> backup34

それが役立つことを願っています。

 

Great and detailed answer from Nikolay Elenkov. However I should added that somebody already develop a software that do just that and package it here: http://sourceforge.net/projects/adbextractor/

The package contains both Java and Perl tool. I myself prefer Perl over Java any day, so I extracted the Perl codes, make sure they are executable, installed the required Perl library, and run the backupdecrypt.pl against an adb backup file, and it convert it into a tar or gzipped tar file without any issue.

I even formed a one liner in Bash 3 that allow me to do adb backup directly to gzipped tar file:

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

Hope it helps.

 
 
   
   
-4
 
vote

既存のバックアップファイルを探るために、<a href="https://www.adb-backup.com/www.adb-backup.com/www.adb-backup.com/www.adb-backup.com/www.adb-backup.com http://www.adb-backup.com 、「DD」、「tar」、... </p>なしでは簡単です。

データはこのサーバには保存されません。 DD / TARで操作せずにバックアップを表示する、または追加のソフトウェアをインストールすることなく、このオンラインサービスを開発しました。私はwww.adb-backup.com

を作っています

 

For explore existing backup file, try http://www.adb-backup.com page, it is simple without "dd", "tar", ...

Data is not stored on this server. I've developed this online service to make it easier to view backups without manipulating with dd / tar or installing additional software. I'm author www.adb-backup.com

 
 
       
       

関連する質問

3  MLS / SPCコードをテストできるADBシェルコマンド? [閉まっている]  ( Adb shell command that can test mls spc codes ) 
この質問は将来の訪問者を助けることはほとんどありません。それは、小さな地理的地域、特定の瞬間、またはインターネットの世界的な聴衆に一般的に適用されない非常に狭い状況に関連しています。この...

3  私のNexus 4のADBに関する問題(不正な電話)  ( Problem with adb on my nexus 4 unauthorized phone ) 
CMDでADBデバイスを実行するときは、私の電話が不正であると言います。 RSAの指紋プロンプトと関係があるようです。私はそのようなプロンプトを取得したことがありません。はい、私はPTPモードで実行されていて、デバッグが有効になっています。私はインターネット...

0  Amazon 4K Fire TVスティックでの起動ループ  ( Boot looping on amazon 4k fire tv stick ) 
私はAmazon 4K Fire TVに問題があります。 昨日、私は私たちの家の中で私のリモコンを別の棒にペアしなければならなかった(誰かが彼ら自身のリモートを忘れたから)それ以来、スティックはオレンジ色のアマゾンフォントと白い背景を起動していますテレビ'。...

0  PCからWiFiに接続するためのAndroidタブレットを強制する  ( Forcing an android tablet to connect to a wifi from pc ) 
houth前、私はタブレット(Coby Kyros MID9742)を持っていました。 HDMIケーブルを介したビデオプレーヤーとしてのVideo Playerとしての使用のために、リモコンとして、Projectorへのビデオプレーヤーとして使用しようとし...

49  'su'を入力せずにrootとしてADBシェルを実行する方法はありますか?  ( Is there a way for me to run adb shell as root without typing in su ) 
9988776665544332 を入力せずにrootとしてADBシェルを実行する方法はありますか?私はシェルに入らずにrootアクセスを持つことができたいです。 ...

1  私はOdinで回復しました、なぜ私の電話機の起動はなぜ弓ではありませんか?  ( I flashed recoveries with odin why doesnt my phone boot bow ) 
Samsung S3 Android携帯電話、根強い、株式ファームウェア。 年代順に: FastBootを使用できませんでしたが、USBデバッグをオンにしました。 私はOdinを使って複数の回復を点滅させましたが、私は成功したとは思わない、私は電話が最初に根...

1  Xiaomi M8SE FastBootループTWRPをインストールしようとします  ( Xiaomi m8se fastboot loop when trying to install twrp ) 
TWRP(Xiaomi MI 8SEの最新バージョン)をインストールしようとする場合は、ADB(FastBoot Flash Recovery "C:¥Program Files(x86)¥、FastBoot¥TWRP.IMGを使って最新のTWRPをインスト...

7  再起動なしでADBを使用して「優先ネットワークモード」を変更する方法  ( How to change preferred network mode using adb without reboot ) 
「GSM / WCDMA」(0)から「WCDMAのみ」(2)までの携帯電話(CM 12、Stock 4.2、両方の根本的なネットワークモード)を変更しようとしています。コマンドラインのみを使用するだけです。この回答コマンドを使用して 9988776654433...

13  "ADB PULL"で新しいファイルだけを引く方法? (Android SDKユーティリティ)  ( How to pull only newer files with adb pull android sdk utility ) 
コマンド "ADB PULL / SDCARD /" MY Android Phoneの内部メモリのすべての内容を現在のローカルディレクトリにコピーできます(および「ADB PULL / MNT / EXTSDCARD /」は外部SDと同じです。カード)。しか...

3  「ADB再マウント」は在庫携帯電話で使用できます(未承認)。  ( Can adb remount be used on a stock phone unrooted ) 
998877666544330 を標準のファームウェアで使用することはできません。そうでなければ、装置を根付せずにシステムに書き込み/システムを書き込み可能にするように強制するための別の方法はありますか? ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有