Есть ли способ заглянуть внутрь и изменить файл созданного файла ADB Backup? -- backup поле с участием adb пол android Связанный проблема

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


43
vote

проблема

русский

Я создал резервную копию моей Galaxy Nexus с adb backup . Полученный файл называется backup.db, и это как-то зашифровано.

Я хотел восстановить резервное копирование, но он останавливается, когда речь идет о восстановлении <код> com.android.providers.contacts . Я использовал adb logcat Чтобы узнать, что происходит и узнает, что <код> com.android.acore сбои во время процесса восстановления.

Я хотел бы получить доступ к данным в резервной копии и удалить базу данных контактов, чтобы восстановить все обратно на мой телефон. Есть ли другие способы восстановления данных из резервной копии?

Английский оригинал

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

Я начал работать над этим. Я публикую свои результаты до тех пор, пока «сообщество Wiki» ответа по двум причинам: во-первых, если кто-то другой хочет присоединиться, есть место для разговора; Во-вторых, если я отстранившись от этого проекта, там будут намерены для того, чтобы кто-то еще начать работать.

Логика резервного копирования на хосте полностью содержится в https: // github.com/android/platform_system_core/blob/master/adb/commandline.cpp , в функции с именем <Код> backup . Функция очень, очень просто: она проверяет параметры командной строки, отправляет команду в основном AS - это до демона ADB на телефоне, и записывает вывод телефона в файл. Нет даже проверки ошибок: если, например, вы отказываетесь от резервной копии на телефоне, <код> adb просто записывают пустой файл.

на телефоне, логика резервного копирования начинается в <код> service_to_fd() в и передает ненудившуюся команду <код> /system/bin/bu , которая представляет собой https a тривиальный скрипт оболочки для запуска <код> com.android.commands.bu.Backup в качестве основного класса нового процесса приложения Android. Это называет <код> ServiceManager.getService("backup") , чтобы получить сервис резервного копирования как <код> adb uninstall com.google.android.apps.maps 0 и звонки <код> adb uninstall com.google.android.apps.maps 1 , передача его неподвижным дескриптором файла (очень косвенно) к <код> adb uninstall com.google.android.apps.maps 2 файла на хосте.

Управление пропусками в <код> adb uninstall com.google.android.apps.maps 3 в com.android.server.backup.backuppmanagerservice , который всплывает графический интерфейс, прося пользователя подтвердить / отклонить резервное копирование. Когда пользователь делает это, <код> adb uninstall com.google.android.apps.maps 4 (тот же файл) вызывается. Если пользователь одобрил запрос, <код> adb uninstall com.google.android.apps.maps 5 определяет, если резервное копирование зашифровано, и передает сообщение <код> adb uninstall com.google.android.apps.maps 6 (тот же файл.) <Код> adb uninstall com.google.android.apps.maps 7 затем Америки и стартуют <код> adb uninstall com.google.android.apps.maps 8 ( тот же файл, строка 4004 на момент написания)

Мы наконец начнем генерировать выходные данные, в adb uninstall com.google.android.apps.maps 9 , между Линия 4151 и Линия 4330 .

Первый, <код> restore0 записывает заголовок, который состоит из 4 или 9 строк ASCII:

  1. <код> restore1
  2. Версия форматирования резервного копирования: в настоящее время <код> restore2
  3. либо <код> restore3 Если резервное копирование несжато или <код> restore4 , если он
  4. Метод шифрования: в настоящее время либо <код> restore5 или <код> restore6
  5. (если зашифровано), «Соль пользователя пароля», закодированной в Hex, все CAPS
  6. (если зашифровано), «Master Key Checksum Salle», закодированная в Hex, все колпачки
  7. (если зашифровано), «Количество раундов PBKDF2» в качестве десятичного числа: в настоящее время <код> restore7
  8. (если зашифровано), «IV клавиши пользователя», закодированной в Hex, все CAPS
  9. (если зашифровано), «Master IV + ключевой BLOB, зашифрован пользовательской клавишей», закодированным в Hex, все CAPS

Фактические данные резервных копий следует, либо как (в зависимости от сжатия и шифрования) <код> restore8 , <код> restore9 , <код> backup0 , или <код> backup1 .

TODO : Запишите путь к коду, которое генерирует вывод TAR - вы можете просто использовать TAL, пока записи находятся в правильном порядке (см. Ниже).

<Сильный> Формат архива TAL

Данные приложения хранятся в приложении / каталоге, начиная с файла _manifest, apk (если запрашивается) в файлах A /, файлов приложений в F /, базах данных в DB / и совместно используемых настроек в SP /. Если вы запросили внешнее резервное копирование хранилища (используя T E-Shared Option), также будет совместно используемый / каталог в архиве, содержащем внешние файлы хранения.

 <код> backup2  

<Сильные> Детали шифрования

  1. Ключ AES 256 получен из пароля резервного копирования шифрования, используя 10000 раундов PBKDF2 со случайно сгенерированной 512-битной солью.
  2. главный ключ AES 256 является случайным образом, генерируется случайным образом
  3. главный ключ "Checksum 'генерируется путем запуска главной клавиши через 10000 раундов PBKDF2 с новой случайно сгенерированной 512-битной солью.
  4. генерируется случайное резервное шифрование IV.
  5. iv, главный ключ и контрольная сумма объединяются и зашифрованы с помощью ключа, полученного в 1. Полученный BLOB сохраняется в заголовке в виде шестигранной строки.
  6. Фактические данные резервного копирования зашифрованы основным ключом и добавляются к концу файла.

Реализация пробопользования / распаковывает код реализации (производит / использует) архивы tar: https://github.com/nedenkov/android-backup-extractor

Еще некоторые подробности здесь: http://nedenkov.blogspot.com /2012/06/unpacking-android-backups.html

Perl Сценарии для упаковки / распаковки и исправления сломанных архивов:

http://forum.xda-developers.com/showtraead. 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
Лучший ответ
 

Файл не зашифрован, если вы не указываете так при создании резервной копии. Тем не менее, сжаты (используя deflate). Вы можете узнать точный формат, глядя на код Android (COM / Android / Server / Backupmanagerservice.java), и, технически, должен быть в состоянии извлечь конкретные данные из него. Тем не менее, IIRC, на месте есть некоторые проверки целостности файлов, поэтому, вероятно, не будет работать, если вы просто удалите кучу данных из него. К сожалению, <код> restore команда, похоже, не имеет возможности восстановить конкретное приложение / пакет только или исключить пакет.

 

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

Отличный и подробный ответ от Николай Еленков . Однако я должен добавить, что кто-то уже разрабатывает программное обеспечение, которое делает только что и упаковать его здесь: http: // sountforge. net / projects / adbextractor /

Пакет содержит как Java, так и Perl Tool. Я сам предпочитаю Perl через Java в любой день, поэтому я извлекил коды Perl, убедитесь, что они исполняются, установили необходимую библиотеку PERL и запустить <код> backup3 против файла резервного копирования ADB, и он преобразует его в TAR или GZIOR TAR-файл без каких-либо проблем.

Я даже сформировал один вкладыш в Bash 3, которые позволяют мне сделать резервную копию ADB непосредственно к GZIOR TAR-файлу:

 <код> backup4  

Надеюсь, это поможет.

 

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

Для изучения существующего файла резервного копирования, попробуйте http://www.adb-backup.com Это просто без «DD», «TAR», ...

Данные

не сохраняются на этом сервере. Я разработал эту онлайн-сервис, чтобы облегчить просмотр резервных копий без манипулирования 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

 
 
       
       

Связанный проблема

1  Xiaomi M8se Fastboot Loop при попытке установить TWRP  ( Xiaomi m8se fastboot loop when trying to install twrp ) 
При попытке установить TWRP (последняя версия для Xiaomi Mi 8SE) мне удается установить новейшие TWRP с помощью ADB (Fastboot Flash Recovery »C: Program File...

1  Я вспыхнул восстановления с Odin, почему мой телефон не ботится наклон?  ( I flashed recoveries with odin why doesnt my phone boot bow ) 
Samsung S3 Android-телефон, не укоренившись, сток-прошивка. в хронологическом порядке: Я включил USB отладку, хотя не мог использовать Fastboot. Я использов...

3  Проблема с ADB на моем Nexus 4 (неавторизованный телефон)  ( Problem with adb on my nexus 4 unauthorized phone ) 
При запуске устройств ADB в CMD он говорит, что мой телефон неавторизован. Похоже, что это есть что связано с подсказок RSA отпечатков пальцев. Я не помню, ка...

0  Принуждение планшета Android подключиться к Wi-Fi от ПК  ( Forcing an android tablet to connect to a wifi from pc ) 
Некоторое время назад у меня была планшет (Coby Kyros Mid9742), который положил полки, когда на экране выходит (половина области сенсорного экрана не распозна...

49  Для меня есть способ запустить adb shell как root, не печатая в "SU"?  ( Is there a way for me to run adb shell as root without typing in su ) 
Есть ли способ для меня запустить adb shell как root, не набрав <код> su ? Я хочу иметь возможность иметь root-доступ, не переходя в оболочку. ...

0  Boot-Looping на Amazon 4k Fire TV Stick  ( Boot looping on amazon 4k fire tv stick ) 
У меня проблемы с моим огненным телевидением Amazon 4K. Вчера я должен был сообразить свой пульт в другую палку в нашем доме (потому что кто-то забыл свой о...

13  Как тянуть только новые файлы с помощью «adb pull»? (Утилита SDK Android)  ( How to pull only newer files with adb pull android sdk utility ) 
С помощью команды «ADB Pull / SDCard /» Я могу скопировать все содержимое внутренней памяти моего телефона Android в мой текущий локальный каталог (и «ADB Pul...

3  Команда Shell adb, которая может тестировать коды MLS / SPC? [закрыто]  ( Adb shell command that can test mls spc codes ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> <Путь d = "M15 6.38A6.48 6.48 0 007.78. 04H-.02A6.49 6.49 0 002.05 ...

3  Может «ADB Remount» будет использоваться на стоковом телефоне (нерешено)?  ( Can adb remount be used on a stock phone unrooted ) 
Можно ли использовать <код> adb remount со стандартной прошивкой и без укоренения устройства? Если нет, есть ли другой способ заставить систему сделать / сис...

7  Как изменить «Предпочитаемый сетевой режим», используя ADB без перезагрузки?  ( How to change preferred network mode using adb without reboot ) 
Я пытаюсь изменить свой телефон (CM 12, на складе 4.2, как укоренившись) Предпочтительный режим сети из «GSM / WCDMA» (0), чтобы «WCDMA только» (2) и наоборот...