¿Hay alguna manera de mirar dentro y modificar un archivo creado con una copia de seguridad adb?

Creé una copia de seguridad de mi Galaxy Nexus con adb backup. El archivo resultante se llama backup.db y de alguna manera está encriptado.

Quería restaurar la copia de seguridad, pero se detiene cuando se trata de restaurar com.android.providers.contacts. Solía adb logcat​​averiguar qué estaba pasando y descubrí que com.android.acorefalla durante el proceso de restauración.

Me gustaría obtener acceso 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?

Creo que ninguna de las respuestas sin usar Java funcionará en teléfonos encriptados. Vea mi respuesta aquí: android.stackexchange.com/a/224474/95893 resumiendo el uso de la aplicación de nelenkov (github.com/nelenkov/android-backup-extractor). Desafortunadamente, los scripts perl ab2tar de Adebar de Izzy no funcionarán en archivos de copia de seguridad encriptados. Similar: android.stackexchange.com/questions/28481/…

Respuestas (4)

El archivo no está encriptado, a menos que lo especifique al crear la copia de seguridad. Sin embargo, está comprimido (usando deflate). Puede averiguar el formato exacto consultando el código fuente de Android (com/android/server/BackupManagerService.java) y, técnicamente, debería poder extraer datos específicos de él. Sin embargo, IIRC, existen algunas verificaciones de integridad de archivos, por lo que lo más probable es que no funcione si solo elimina un montón de datos. Desafortunadamente, el restorecomando no parece tener una opción para restaurar solo una aplicación/paquete en particular o excluir un paquete.

¡Gracias! Ese es al menos un punto de partida para mirar dentro del archivo. Hubiera sido más fácil si no hubiera proporcionado una contraseña para la copia de seguridad.
Si proporcionó una contraseña, de hecho está encriptada. 'BackupManagerService' tiene detalles sobre los algoritmos de encriptación reales, y los parámetros de derivación de claves (sal, número de iteraciones, etc.) están escritos en el encabezado del archivo. Como conoce la contraseña, puede derivar la clave y descifrar los datos. Así que todavía es factible, pero no particularmente fácil...
Sí, actualmente estoy extrayendo todo BackupManagerServicepara leer el contenido del archivo de copia de seguridad. Es una buena cantidad de trabajo, pero necesito recuperar mis datos...
@ingorichter Empecé a trabajar en esto y publiqué un montón de notas a continuación, en una respuesta de "wiki de la comunidad". Siéntete libre de agregarle.

Empecé a trabajar en esto. Estoy publicando mis resultados hasta ahora aquí como una respuesta de "wiki de la comunidad" por dos razones: primero, si alguien más quiere unirse, hay un lugar para hablar; segundo, si me apartan de este proyecto, habrá pistas para que alguien más empiece a trabajar.

 

La lógica de copia de seguridad en el host está completamente contenida en https://github.com/android/platform_system_core/blob/master/adb/commandline.cpp , en la función denominada backup. La función es muy simple: valida las opciones de la línea de comandos, envía el comando casi como está al demonio adb en el teléfono y escribe la salida del teléfono en el archivo. Ni siquiera hay verificación de errores: si, por ejemplo, rechaza la copia de seguridad en el teléfono, adbsimplemente escribe un archivo vacío.

En el teléfono, la lógica de respaldo comienza 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 sin analizar a /system/bin/bu, que es un script de shell trivial para iniciar com.android.commands.bu.Backupcomo la clase principal de un nuevo proceso de aplicación de Android. Eso llama ServiceManager.getService("backup")para obtener el servicio de respaldo como un IBackupManager, y llama IBackupManager.fullBackup(), pasándole el descriptor de archivo aún sin usar (muy indirectamente) conectado al backup.abarchivo en el host.

El control pasa a fullBackup()com.android.server.backup.BackupManagerService , que abre la GUI y le pide al usuario que confirme o rechace la copia de seguridad. Cuando el usuario lo hace, acknowledgeFullBackupOrRestore()se llama (mismo archivo). Si el usuario aprobó la solicitud, acknowledgeFullBackupOrRestore()averigua si la copia de seguridad está encriptada y pasa un mensaje a BackupHandler(mismo archivo) BackupHandler, luego crea una instancia y lanza un PerformAdbBackupTask( mismo archivo, línea 4004 en el momento de escribir este artículo)

Finalmente comenzamos a generar resultados allí, enPerformAdbBackupTask.run() , entre la línea 4151 y la línea 4330 .

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

  1. "ANDROID BACKUP"
  2. la versión del formato de copia de seguridad: actualmente"4"
  3. ya sea "0"si la copia de seguridad no está comprimida o "1"si está
  4. el método de cifrado: actualmente "none"o bien"AES-256"
  5. (si está encriptada), la "contraseña de usuario salt" codificada en hexadecimal, todo en mayúsculas
  6. (si está encriptada), la "sal de la suma de comprobación de la clave maestra" codificada en hexadecimal, todo en mayúsculas
  7. (si está encriptado), el "número de rondas de PBKDF2 utilizadas" como un número decimal: actualmente"10000"
  8. (si está cifrado), el "IV de la clave de usuario" codificado en hexadecimal, todo en mayúsculas
  9. (si está encriptado), el "master IV + key blob, encriptado por la clave de usuario" codificado en hexadecimal, todo en mayúsculas

Los datos reales de la copia de seguridad siguen, ya sea como (dependiendo de la compresión y el cifrado) tar, deflate(tar), encrypt(tar)o encrypt(deflate(tar)).

 

TODO : escriba la ruta del código que genera la salida tar; simplemente puede usar tar siempre que las entradas estén en el orden correcto (ver más abajo).

formato de archivo tar

Los datos de la aplicación se almacenan en el directorio app/, comenzando con un archivo _manifest, el APK (si se solicita) en a/, los archivos de la aplicación en f/, las bases de datos en db/ y las preferencias compartidas en sp/. Si solicitó una copia de seguridad de almacenamiento externo (usando la opción -shared), también habrá un directorio shared/ en el archivo que contiene archivos de almacenamiento externo.

$ 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

Detalles de cifrado

  1. Una clave AES 256 se deriva de la contraseña de cifrado de respaldo utilizando 10000 rondas de PBKDF2 con una sal de 512 bits generada aleatoriamente.
  2. Se genera aleatoriamente una clave maestra AES 256
  3. Se genera una 'suma de verificación' de clave maestra ejecutando la clave maestra a través de 10000 rondas de PBKDF2 con una nueva sal de 512 bits generada aleatoriamente.
  4. Se genera un cifrado de copia de seguridad aleatorio IV.
  5. El IV, la clave maestra y la suma de comprobación se concatenan y cifran con la clave derivada en 1. El blob resultante se guarda en el encabezado como una cadena hexadecimal.
  6. Los datos reales de la copia de seguridad se cifran con la clave maestra y se agregan al final del archivo.

Implementación de código de empaquetado/desempaquetado de muestra (produce/usa) archivos tar: https://github.com/nelenkov/android-backup-extractor

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

Scripts de Perl para empaquetar/desempaquetar y reparar archivos rotos:

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

Los comentarios no son para una discusión extensa; esta conversación se ha movido a chat .

Gran y detallada respuesta de Nikolay Elenkov . Sin embargo, debo agregar que alguien ya desarrolló un software que hace exactamente eso y lo empaqueta aquí: http://sourceforge.net/projects/adbextractor/

El paquete contiene la herramienta Java y Perl. Yo mismo prefiero Perl a Java cualquier día, así que extraje los códigos Perl, me aseguré de que sean ejecutables, instalé la biblioteca Perl requerida y backupdecrypt.plejecuté contra un archivo de copia de seguridad adb, y lo convertí en un archivo tar o tar comprimido con gzip sin ningún tipo de asunto.

Incluso formé una sola línea en Bash 3 que me permite hacer una copia de seguridad adb directamente en un archivo tar comprimido con gzip:

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

Espero eso ayude.

Sí, empaquetaron la herramienta (la de Java) que escribí :) También ayudé a migrar la cosa a Perl. Si no leyó los archivos README, es posible que no sea evidente de inmediato que el informe fue primero, luego las herramientas...
He realizado una copia de seguridad pero no ha creado un archivo .ab, sino que ha creado un archivo .backup. Quiero saber cómo extraerlo. Además, no estoy seguro de si ha tomado todas las fotos y videos como copia de seguridad.

Para explorar el archivo de respaldo existente, pruebe la página http://www.adb-backup.com , es simple sin "dd", "tar", ...

Los datos no se almacenan en este servidor. Desarrollé este servicio en línea para que sea más fácil ver las copias de seguridad sin manipularlas con dd/tar o instalar software adicional. Soy el autor www.adb-backup.com

Tendría mucho cuidado al cargar una copia de seguridad de adb (y proporcionar la contraseña) a un sitio web aleatorio... Los datos incluidos en la copia de seguridad de adb son privados y no tiene forma de saber qué hace el sitio con la copia de seguridad. Podría ser inofensivo, pero no recomendaría hacer esto.
Los datos no se almacenan en este servidor. Desarrollé este servicio en línea para que sea más fácil ver las copias de seguridad sin manipularlas con dd/tar o instalar software adicional. Soy el autor www.adb-backup.com