¿Hay alguna manera de mirar dentro y modificar un archivo de copia de seguridad de ADB? -- backup campo con adb camp android Relacionados El problema

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


43
vote

problema

Español

He creado una copia de seguridad de mi Galaxy Nexus con ABCDEFGHIJKLMNABCDEFGHIJKLMN4 . El archivo resultante se llama Backup.db y se cifra de alguna manera.

Quería restaurar la copia de seguridad, pero se detiene cuando se trata de restaurar ABCDEFGHIJKLMNABCDEFGHIJKLMN5 . Utilicé ABCDEFGHIJKLMNABCDEFGHIJKLMN6 Para averiguar qué está sucediendo y descubrí que com.android.acore se bloquea durante el proceso de restauración.

Me gustaría acceder a los datos en la copia de seguridad y eliminar la base de datos de contactos para restaurar todo a mi teléfono. ¿Hay alguna otra forma de restaurar los datos de la copia de seguridad?

Original en ingles

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?

     
 
 

Lista de respuestas

57
 
vote

Comencé a trabajar en esto. Estoy publicando mis resultados hasta ahora como una respuesta de "Wiki de la comunidad" por dos razones: primero, si alguien más quiere unirse, hay un lugar para hablar; En segundo lugar, si me alejarme de este proyecto, hubo sugerencias para que alguien más comience a trabajar.

La lógica de copia de seguridad en el host está totalmente contenida dentro de https: // github.com/android/platform_system_core/blob/master/adb/commandline.cpp , en la función llamada backup . La función es Muy simple: valida las opciones de línea de comandos, envía el comando en su mayoría como es el daemon ADB en el teléfono, y escribe la salida del teléfono al archivo. Ni siquiera hay una comprobación de errores: si, por ejemplo, rechaza la copia de seguridad en el teléfono, adb solo escribe un archivo vacío.

En el teléfono, la lógica de respaldo se inicia en service_to_fd() en https://github.com/android/platform_system_core/blob/master/adb/services.cpp . La función identifica que el comando del host es "backup" , y pasa el comando despojado a /system/bin/bu , que es una script trivial shell para iniciar com.android.commands.bu.Backup como la clase principal de un nuevo proceso de aplicación de Android. Que llama ServiceManager.getService("backup") para obtener el servicio de copia de seguridad como un adb uninstall com.google.android.apps.maps 0 , y llama adb uninstall com.google.android.apps.maps 1 , pasándola el descriptor de archivo aún no utilizado (muy indirectamente) conectado al archivo adb uninstall com.google.android.apps.maps 2 en el host.

Control pasa a adb uninstall com.google.android.apps.maps 3 en com.android.server.backup.backupmanagerservice , que aparece la GUI pidiéndole al usuario que confirme / rechace la copia de seguridad. Cuando el usuario lo hace, abcdefghijklmnadb uninstall com.google.android.apps.maps 4 (mismo archivo) se llama. Si el usuario aprobó la solicitud, ABCDEFGHIJKLMNABCDEFGHIJKLMN15. Instancheates y inicia un ABCDEFGHIJKLMNABCDEFGHIJKLMN18 ( mismo archivo, línea 4004 a tiempo de escritura)

Finalmente comenzamos a generar salida allí, en adb uninstall com.google.android.apps.maps 9 , entre línea 4151 y línea 4330 .

Primero, ABCDEFGHIJKLMNABCDEFGHIJKLMN20 escribe un encabezado, que consta de 4 o 9 líneas ASCII:

  1. restore1
  2. la versión de formato de copia de seguridad: actualmente restore2
  3. ya sea restore3 Si la copia de seguridad no es comprimida o restore4 si es
  4. El método de cifrado: actualmente, ya sea restore5 o restore6
  5. (si está encriptado), la "sal de contraseña de usuario" codificada en hexagonal, todas las capas
  6. (si está cifrado), la "sal de suma de suma de suma maestra" codificada en Hex, todas las capas
  7. (si se cifra), el "Número de rondas PBKDF2 utilizadas" como número decimal: actualmente restore7
  8. (si está cifrado), la "IV de la llave de usuario" codificada en hexagonal, todas las capas
  9. (Si está cifrado), la "Master IV + Blob, encriptado por la tecla de usuario" codificada en Hex, todas las capas

Los datos de copia de seguridad reales siguen, ya sea como (dependiendo de la compresión y el cifrado) restore8 , , backup0 , o backup1 .

todo : Escriba la ruta del código que genera la salida de alquitrán: simplemente puede usar alquitrán siempre que las entradas estén en el orden correcto (ver más abajo).

Formato de archivo de alquitrán

Los datos de la aplicación se almacenan en la aplicación / directorio, comenzando con un archivo _manifest, la APK (si se solicita) en A /, APP LOCHES en F /, Bases de datos en DB / Y Preferencias compartidas en SP /. Si solicitó una copia de seguridad de almacenamiento externo (usando la opción-compartido), también habrá un directorio compartido en el archivo que contiene archivos de almacenamiento externos.

  ABCDEFGHIJKLMNABCDEFGHIJKLMN32   

Detalles de cifrado

  1. Una clave AES 256 se deriva de la contraseña de cifrado de respaldo usando 10000 rondas de PBKDF2 con una sal de 512 bits generada al azar.
  2. Una llave maestra AES 256 se genera aleatoriamente
  3. Se genera una clave maestra ', la suma de suma de suma de comprobación "ejecuta la clave maestra a través de 10000 rondas de PBKDF2 con una nueva sal de 512 bits generada al azar.
  4. Se genera un cifrado aleatorio de cifrado IV.
  5. La IV, la llave maestra y la suma de comprobación se concatenan y cifradas con la clave derivada en 1. La bloba resultante se guarda en el encabezado como una cadena hexagonal.
  6. Los datos reales de copia de seguridad se cifran con la clave maestra y se adjuntan al final del archivo.

paquete de muestra / implementación del código de desempaquete (produce / usos) Archivos de alquitrán: https://github.com/nelenkov/android-backup-extractor

Algunas más detalles aquí: http://nelenkov.blogspot.com /2012/06/unpacking-android-backups.html

Perl Scripts para embalaje / desempaquetado y fijación de archivos rotos:

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
La mejor respuesta
 

El archivo no está encriptado, a menos que lo especifique cuando cree la copia de seguridad. Sin embargo, se comprime (usando el desinflado). Puede encontrar el formato exacto al observar el código de origen de Android (COM / Android / servidor / backupmanagerservice.java), y, técnicamente, debe poder extraer datos específicos de él. Sin embargo, IIRC, hay algunos controles de integridad de archivos en su lugar, por lo que probablemente no funcione si simplemente elimina un montón de datos de él. Desafortunadamente, el comando restoredefghijklmn2 no parece tener una opción para restaurar una aplicación / paquete particular solamente o excluir un paquete.

 

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

Excelente y detallada respuesta de Nikolay Elenkov . Sin embargo, debería agregar que alguien ya desarrolle un software que hace precisamente eso y empaquetado aquí: http: // sourceforge. red / proyectos / adbextractor /

El paquete contiene tanto la herramienta Java como la Perl. Yo mismo prefiero perl sobre Java cualquier día, así que extrayé los códigos PERL, asegúrese de que sean ejecutables, instalen la biblioteca Perl requerida y ejecute el ABCDEFGHIJKLMNABCDEFGHIJKLMN33 contra un archivo de copia de seguridad de ADB, y lo convierte en un archivo de alquitrán de alquitrán o gzipado sin ningún problema.

Incluso formé un único forro en Bash 3 que me permite hacer una copia de seguridad de ADB directamente al archivo TAR GIZPPEPE:

  backup4  

espero que ayude.

 

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

Para explorar el archivo de copia de seguridad existente, intente http://www.adb-backup.com página , es simple sin "DD", "TAR", ...

Los datos no se almacenan en este servidor. He desarrollado este servicio en línea para facilitar la vista de copias de seguridad sin manipular con DD / tar o instalar software adicional. Estoy autor 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

 
 
       
       

Relacionados problema

0  Forzando una tableta Android para conectarse a un WiFi desde PC  ( Forcing an android tablet to connect to a wifi from pc ) 
hace un tiempo, tuve una tableta (coby kyros mid9742), que se archivó cuando la pantalla abandonó (la mitad del área de la pantalla táctil no reconocerá toque...

3  Problema con ADB en mi Nexus 4 (teléfono no autorizado)  ( Problem with adb on my nexus 4 unauthorized phone ) 
Al ejecutar dispositivos ADB en CMD, dice que mi teléfono no está autorizado. Parece que tiene algo que ver con el indicador de huella digital RSA. No recuerd...

1  Xiaomi M8Se Fastboot Loop al intentar instalar TWRP  ( Xiaomi m8se fastboot loop when trying to install twrp ) 
Al intentar instalar TWRP (última versión para Xiaomi MI 8SE), logré instalar el nuevo TWRP usando ADB (Fastboot Flash Recovery "C: Archivos de programa (X86...

7  ¿Cómo cambiar el "Modo de red preferido" usando ADB sin reinicio?  ( How to change preferred network mode using adb without reboot ) 
Estoy tratando de cambiar el modo de red preferido de mi teléfono (cm 12, stock 4.2, ambos enraizado) de "GSM / WCDMA" (0) a "solo WCDMA" (2) y viceversa (pue...

3  ¿Se puede usar "ADB REMOUNT" en un teléfono de stock (URROOTED)?  ( Can adb remount be used on a stock phone unrooted ) 
¿Es posible usar adb remount con un firmware estándar y sin haber arraigado el dispositivo? Si no, ¿hay otra forma de forzar al sistema a hacer una escritur...

3  ¿Comando ADB Shell que puede probar los códigos MLS / SPC? [cerrado]  ( Adb shell command that can test mls spc codes ) 
Es poco probable que esta pregunta ayude a cualquier visitante futuro; Solo es relevante para un pequeño área geográfica, u...

49  ¿Hay alguna manera para que ejecute ADB Shell como raíz sin escribir en 'su'?  ( Is there a way for me to run adb shell as root without typing in su ) 
¿Hay alguna manera de ejecutar ADB Shell como raíz sin escribir en su ? Quiero poder tener acceso de root sin entrar en la cáscara. ...

1  Flashé las recuperaciones con Odin, ¿por qué mi teléfono bota el arco?  ( I flashed recoveries with odin why doesnt my phone boot bow ) 
Teléfono Android Samsung S3, no enraizado, Firmware Stock. en orden cronológico: Encendí la depuración USB, aunque no pudo usar Fastboot. Utilicé Odin para ...

13  ¿Cómo extraer solo archivos más nuevos con "Adb Pull"? (Utilidad SDK de Android)  ( How to pull only newer files with adb pull android sdk utility ) 
Con el comando "ADB PULT / SDCARD /" I puede copiar todos los contenidos de la memoria interna de mi teléfono Android en mi directorio local actual (y "ADB PU...

0  Bucle de arranque en la palanca de TV de fuego de Amazon 4K  ( Boot looping on amazon 4k fire tv stick ) 
Estoy teniendo problemas con mi televisor de fuego de Amazon 4K. Ayer, tuve que emparejar mi control remoto a un palo diferente en nuestra casa (porque algu...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos