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

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

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

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

38 голосов | спросил ingorichter 23 Mayam12 2012, 04:01:19

4 ответа


13

Файл не зашифрован, если вы не указали это при создании резервной копии. Он, однако, сжат (с использованием дефлята). Вы можете узнать точный формат, посмотрев на исходный код Android (com /android /server /BackupManagerService.java) и, технически, сможете извлечь из него определенные данные. Тем не менее, IIRC, есть некоторые проверки целостности файлов, поэтому, скорее всего, это не сработает, если вы просто удалите из него кучу данных. К сожалению, команда restore, похоже, не имеет возможности восстановить конкретное приложение /пакет или исключить пакет.

ответил Nikolay Elenkov 23 Mayam12 2012, 07:05:45
44

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

A

Логика резервного копирования на хосте полностью содержится в https: //github.com/android/platform_system_core/blob/master/adb/commandline.cpp в функции с именем backup. Функция very проста: она проверяет параметры командной строки, отправляет команду в основном как на демона adb на телефоне и записывает вывод телефона в файл. Существует даже проверка ошибок: если, например, вы отказываетесь от резервной копии на телефоне, adb просто записывает пустой файл.

В телефоне логика резервного копирования начинается с service_to_fd() в https://github.com/android/platform_system_core/blob/master/adb/services.cpp . Функция определяет, что команда из хоста "backup", и передает команду unparsed в /system/bin/bu, которая является тривиальный сценарий оболочки для запуска com.android.commands.bu.Backup в качестве основного класса нового приложения для Android. Это вызывает 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. (если он зашифрован), «пароль для пароля пользователя», закодированный в шестнадцатеричном виде, все кепки
  6. (если он зашифрован), «соль контрольной суммы главного ключа», закодированная в шестнадцатеричном виде, все кепки
  7. (если он зашифрован), «количество использованных раундов PBKDF2» как десятичное число: в настоящее время "10000"
  8. (если он зашифрован), «IV ключа пользователя» закодирован в шестнадцатеричном виде, все кепки
  9. (если он зашифрован), «основной ключ + ключ + ключ, зашифрованный ключом пользователя», закодированный в шестнадцатеричном виде, все кепки

Ниже приводятся фактические данные резервного копирования: (в зависимости от сжатия и шифрования) tar, deflate(tar), encrypt(tar) , или encrypt(deflate(tar)).

A

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

Формат tar-архива

Данные приложения хранятся в каталоге app /, начиная с файла _manifest, APK (если требуется) в файлах /, app в файлах f /, в db /и общих настройках в sp /. Если вы запросили резервное копирование внешнего хранилища (с использованием опции -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-ключ получен из пароля резервного шифрования, используя 10000 патронов PBKDF2 со случайно сформированной солью из 512 бит.
  2. Мастер-ключ AES 256 генерируется случайным образом
  3. Контрольная сумма главного ключа генерируется путем запуска главного ключа через 10000 раундов PBKDF2 с новой случайно сформированной сотой 512 бит.
  4. Генерируется случайное резервное шифрование IV.
  5. IV, главный ключ и контрольная сумма объединяются и зашифровываются с помощью ключа, полученного в 1. Получающийся в результате блок-блок сохраняется в заголовке как шестнадцатеричная строка.
  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? р = 27840175 # post27840175

ответил Nikolay Elenkov 23 Mayam12 2012, 07:05:45
6

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

В пакете содержатся инструменты Java и Perl. Я сам предпочитаю Perl над Java в любой день, поэтому я извлек коды Perl, убедитесь, что они исполняемы, установил требуемую библиотеку Perl и запустил backupdecrypt.pl в резервном файле adb, и он конвертирует он в tar или gzipped tar-файл без каких-либо проблем.

Я даже создал один лайнер в Bash 3, который позволяет мне делать резервное копирование adb непосредственно в файл gzipped tar:

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

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

ответил S P Arif Sahari Wibowo 22 PM00000040000003331 2014, 16:25:33
-4

Для изучения существующего файла резервной копии попробуйте http://www.adb-backup.com , это просто без "dd", "tar", ...

Данные не хранятся на этом сервере. Я разработал этот онлайн-сервис, чтобы упростить просмотр резервных копий без использования dd /tar или установки дополнительного программного обеспечения. Я автор www.adb-backup.com

ответил Liszak 19 Jpm1000000pmFri, 19 Jan 2018 15:55:04 +030018 2018, 15:55:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132