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

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

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

0  Nexus 10 не распознается на Debian Rheezy / Mac OS / Windows 8 с ADB  ( Nexus 10 not recognized on debian wheezy mac os windows 8 with adb ) 
Я пытаюсь подключить мой планшет Nexus 10 + Android 4.4 + Cyanogen-Mod 11 на мой настольный компьютер, где я установил Debian Rheezy с помощью ADB. Он работал...

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-доступ, не переходя в оболочку. ...

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 ...

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...

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

4  ADB Pull - скопируйте всю папку на компьютер  ( Adb pull copy whole folder to computer ) 
Как я могу скопировать папку с моего устройства Android к определенной папке моего компьютера? Если я использую эту команду: <код> adb pull efs Это ко...

31  Резервное копирование и восстановление настроек Android и приложение через ADB  ( Backup and restore android settings and application through adb ) 
Я хотел бы спросить, можно ли сделать резервную копию и восстановить все настройки Android и приложения через ADB. Я попробовал: <код> adb backup -all adb...

50  Backup ADB создает 0-байтовый файл; Подсказки для текущего пароля резервного копирования, даже если я никогда не устанавливаю; «Не удалось установить пароль» для пароля резервного копирования рабочего стола  ( Adb backup creates 0 byte file prompts for current backup password even though ) 
Проблема: Каждый раз, когда я запускаю Backup adb, я получаю сообщение возле нижней части домашнего экрана, говоря <код> Backup starting... , с последующим ...

1  TWRP Advanced Wipe Soft Bricked?  ( Twrp advanced wipe soft bricked ) 
запутался с моим мото G7 Plus Lake на Lineage 17.1 и AMP; в конечном итоге с TWRP на раздевании B & AMP; Восстановление линии на раздел А, независимо от моих ...

14  В чем разница между «adb push 'and' adb install '?  ( Whats the difference between adb push and adb install ) 
<код> adb push скопировать только файл в целевое место, тогда как <код> adb install копирует файл в целевое место и также устанавливает правильное разреш...

2  Резервное копирование ADB на зефир - это отличается?  ( Adb backup on marshmallow is it different ) 
Устройство и настройки: . moto x play (на складе 6.0.1), . USB отладки , отладки USB включено в параметрах разработчика и проверено, используя <код> ad...

7  Как извлечь .zip через adb shell  ( How to extract zip through adb shell ) 
именно то, что говорит название. У меня есть Zip-файл 1,5 ГБ на моей SDCard, который я хотел бы извлечь через ADB (не тянусь к ПК и нажимаю назад). Есть ли пр...

1  Как сделать резервную копию и восстановить настройку APN через ADB?  ( How to backup and restore apn setting via adb ) 
Как сделать резервную копию и восстановить настройку APN через ADB? Я на Android 6.0 без рута. ...

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

6  Как получить доступ к файлам .img с yaffs2?  ( How do i access img files with yaffs2 ) 
Я пытался установить их в Ubuntu, не удача, <Код> mount не распознает файловую систему Yaffs2. Я пробовал <Код> yaffs2utils и <код> ./unyaffs2 Но оно не ра...

0  Проблема ADB при подключении через WiFi  ( Adb issue while connecting through wifi ) 
Я запускаю переадресацию портов ADB с компьютера на мобильный с этой командой: <код> adb forward tcp:6401 tcp:50000 который работает полностью отличным ...

1  Резервное копирование Android 5.1 ADB несовместимо с Android 6.0?  ( Is an android 5 1 adb backup incompatible with android 6 0 ) 
Я недавно загрузил Cyanogenmod 13 на мой Nexus 4. До мигания я сделал полную резервную копию ADB и резервную копию данных приложений для Com.king.candycrushsa...

43  Есть ли способ заглянуть внутрь и изменить файл созданного файла ADB Backup?  ( Is there a way to look inside and modify an adb backup created file ) 
Я создал резервную копию моей Galaxy Nexus с adb backup . Полученный файл называется backup.db, и это как-то зашифровано. Я хотел восстановить резервное ко...

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

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

5  Запуск задачи Tasker через SSHDroid (или Shell adb)  ( Running a tasker task via sshdroid or adb shell ) 
Я пытаюсь запустить задачу Tasker вручную из adb shell, через sshdroid. я Запуск следующего в Putty (клиент Windows SSH): AM BRAVCECTAT-NET.DIGNISLISCH.And...

1  Измените разрешения ADB на RW? [Дубликат]  ( Change adb permissions to rw ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

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

1  Я вспыхнул восстановления с Odin, почему мой телефон не ботится наклон? 
0  Принуждение планшета Android подключиться к Wi-Fi от ПК 
7  Как изменить «Предпочитаемый сетевой режим», используя ADB без перезагрузки? 
0  Nexus 10 не распознается на Debian Rheezy / Mac OS / Windows 8 с ADB 
49  Для меня есть способ запустить adb shell как root, не печатая в "SU"? 
3  Команда Shell adb, которая может тестировать коды MLS / SPC? [закрыто] 
1  Xiaomi M8se Fastboot Loop при попытке установить TWRP 
13  Как тянуть только новые файлы с помощью «adb pull»? (Утилита SDK Android) 
4  ADB Pull - скопируйте всю папку на компьютер 
31  Резервное копирование и восстановление настроек Android и приложение через ADB 
50  Backup ADB создает 0-байтовый файл; Подсказки для текущего пароля резервного копирования, даже если я никогда не устанавливаю; «Не удалось установить пароль» для пароля резервного копирования рабочего стола 
1  TWRP Advanced Wipe Soft Bricked? 
14  В чем разница между «adb push 'and' adb install '? 
2  Резервное копирование ADB на зефир - это отличается? 
7  Как извлечь .zip через adb shell 
1  Как сделать резервную копию и восстановить настройку APN через ADB? 
3  Проблема с ADB на моем Nexus 4 (неавторизованный телефон) 
6  Как получить доступ к файлам .img с yaffs2? 
0  Проблема ADB при подключении через WiFi 
1  Резервное копирование Android 5.1 ADB несовместимо с Android 6.0? 
43  Есть ли способ заглянуть внутрь и изменить файл созданного файла ADB Backup? 
0  Boot-Looping на Amazon 4k Fire TV Stick 
3  Может «ADB Remount» будет использоваться на стоковом телефоне (нерешено)? 
5  Запуск задачи Tasker через SSHDroid (или Shell adb) 
1  Измените разрешения ADB на RW? [Дубликат]