53 votos

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

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

Quería restaurar la copia de seguridad, pero se detiene cuando se trata de restaurar com.android.providers.contacts . Yo usé adb logcat para averiguar lo que está pasando y descubrir que com.android.acore se bloquea durante el proceso de restauración.

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

0 votos

Creo que ninguna de las respuestas sin usar Java funcionará en teléfonos encriptados. Ver mi respuesta aquí: Android.stackexchange.com/a/224474/95893 que resume el uso de la aplicación de nelenkov (github.com/nelenkov/Android-backup-extractor). Lamentablemente, los scripts perl de Adebar ab2tar de Izzy no funcionan con archivos de copia de seguridad encriptados. Algo parecido: Android.stackexchange.com/questions/28481/

60voto

UltimateBrent Puntos 6167

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

La lógica de respaldo en el anfitrión está enteramente contenida en https://github.com/Android/platform_system_core/blob/master/adb/commandline.c en la función llamada backup . La función es muy simple: valida las opciones de la línea de comandos, envía el comando tal cual al demonio adb del teléfono, y escribe la salida del teléfono en el archivo. Ni siquiera hay una comprobación de errores: si, por ejemplo, rechazas la copia de seguridad en el teléfono, adb sólo escribe un archivo vacío.

En el teléfono, la lógica de la copia de seguridad comienza en service_to_fd() en https://github.com/Android/platform_system_core/blob/master/adb/services.c . La función identifica que el comando del anfitrión es "backup" y pasa la orden no preparada a backup_service() en https://github.com/Android/platform_system_core/blob/master/adb/backup_service.c . Eso, a su vez, es un fino envoltorio alrededor /system/bin/bu que es un trivial shell script para lanzar com.android.commands.bu.Backup como la clase principal de un nuevo proceso de aplicación para Android. Eso llama ServiceManager.getService("backup") para obtener el servicio de respaldo como IBackupManager y llama IBackupManager.fullBackup() pasándole el descriptor de archivo aún no utilizado (muy indirectamente) conectado a la backup.ab archivo sobre el anfitrión.

El control pasa a fullBackup() en com.Android.server.BackupManagerService lo que hace que aparezca el GUI pidiendo al usuario que confirme/rechace la copia de seguridad. Cuando el usuario lo hace, acknowledgeFullBackupOrRestore() (mismo archivo) se llama. Si el usuario aprobó la solicitud, acknowledgeFullBackupOrRestore() averigua si la copia de seguridad está encriptada, y pasa un mensaje a BackupHandler (mismo archivo.) BackupHandler y luego se instanciará y se pondrá en marcha un PerformFullBackupTask ( mismo archivo, línea 2228 en el momento de escribir este artículo)

Finalmente empezamos a generar la producción allí, en PerformFullBackupTask.run() entre línea 2367 y línea 2453 .

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

  1. "ANDROID BACKUP"
  2. la versión del formato de copia de seguridad: actualmente siempre "1"
  3. o bien "0" si la copia de seguridad no está comprimida o "1" Si es así
  4. el método de encriptación: actualmente "none" o "AES-256"
  5. (si está encriptada), la "sal de la contraseña de usuario" codificada en hexágono, todo en mayúsculas
  6. (si está codificado), la "sal de suma de control de la llave maestra" codificada en hexágono, todo en mayúsculas
  7. (si está encriptado), el "número de rondas PBKDF2 utilizadas" como número decimal
  8. (si está codificado), la "IV de la llave de usuario" codificada en hexágono, todo en mayúsculas
  9. (si está codificado), el "master IV + blob de la llave, codificado por la llave de usuario" codificado en hexadecimal, todo en mayúsculas

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

TODO : escribir la ruta del código que genera la salida de alquitrán -- puedes usar simplemente alquitrán siempre y cuando las entradas estén en el orden apropiado (ver más abajo).

El formato de archivo de 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 ha solicitado una copia de seguridad de almacenamiento externo (utilizando la opción -compartido), también habrá un directorio compartido/ en el archivo que contiene los 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 la encriptación

  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 es generada aleatoriamente
  3. Una "suma de comprobación" de la llave maestra se genera al pasar la llave maestra a través de 10000 rondas de PBKDF2 con una nueva sal de 512 bits generada al azar.
  4. Se genera un IV de encriptación de respaldo aleatorio.
  5. La IV, la clave maestra y la suma de comprobación se concatenan y encriptan con la clave derivada en 1. La mancha resultante se guarda en el encabezamiento como una cadena hexagonal.
  6. Los datos reales de la copia de seguridad se codifican con la clave maestra y se añaden al final del archivo.

Implementación del código de muestra del paquete/desempaque (produce/utiliza) archivos de alquitrán: https://github.com/nelenkov/Android-backup-extractor

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

Guiones en perl para empaquetar/desempaquetar y arreglar archivos rotos:

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

0 votos

Si pones el código en algún sitio, quizá pueda unirme. El OP (@ngorichter) probablemente ya tenga algún código que funcione también :) Una utilidad que descomprime y extrae los archivos reales podría ser útil, para que pueda restaurar sólo partes (si usted tiene Root, por supuesto).

1 votos

En cuanto a la parte de encriptación, tengo que buscar los detalles, pero la clave se obtiene usando PBKDF2 por la sal y el PIN de desbloqueo del dispositivo, la contraseña o el patrón (convertido a cadena). La clave maestra se genera aleatoriamente, y se encripta con la clave derivada de la contraseña. Consigue que funcione para los archivos no encriptados primero. Puedo implementar la parte de descifrado si tienes problemas con ella.

0 votos

Lo siento, la clave se deriva en realidad en base a la contraseña que se especifica al iniciar la copia de seguridad.

19voto

Nikolay Elenkov Puntos 206

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

0 votos

¡Gracias! Eso es al menos un punto de partida para mirar dentro del archivo. Habría sido más fácil si no hubiera proporcionado una contraseña para la copia de seguridad.

0 votos

Si has proporcionado una contraseña, efectivamente está encriptada. El `BackupManagerService' tiene detalles sobre los algoritmos de encriptación reales, y los parámetros de derivación de la clave (sal, recuento de iteraciones, etc.) están escritos en la cabecera del archivo. Dado que conoces la contraseña, puedes derivar la clave y descifrar los datos. Así que todavía es posible, pero no es particularmente fácil...

0 votos

Sí, actualmente estoy extrayendo todo de BackupManagerService para leer el contenido del archivo de copia de seguridad. Es una buena cantidad de trabajo, pero necesito recuperar mis datos...

8voto

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

El paquete contiene tanto la herramienta Java como la Perl. Yo prefiero Perl a Java cualquier día, así que extraje los códigos Perl, me aseguré de que fueran ejecutables, instalé la librería Perl necesaria y ejecuté el backupdecrypt.pl contra un archivo de copia de seguridad adb, y lo convierte en un archivo tar o gzipped tar sin ningún problema.

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

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

Espero que ayude.

7 votos

Sí, empaquetaron la herramienta (la de Java) que escribí:) También ayudé a portar la cosa a Perl. Si no lees los READMEs, puede que no sea inmediatamente aparente que la escritura vino primero, luego las herramientas....

0 votos

He hecho una copia de seguridad pero no se ha creado el archivo .ab, sino que se ha creado el archivo .backup. Quiero saber cómo extraerlo. También no estoy seguro de si se ha tomado todas las fotos y videos como copia de seguridad?

-3voto

Liszak Puntos 11

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 que sea más fácil ver las copias de seguridad sin manipular con dd / tar o la instalación de software adicional. Soy el autor www.adb-backup.com

11 votos

Sería muy cuidado con subir una copia de seguridad de adb (y proporcionar la contraseña) a un sitio web aleatorio... Los datos incluidos en la copia de seguridad adb son privados y usted no tiene manera de saber lo que el sitio hace con la copia de seguridad. Podría ser inofensivo, pero yo no recomendaría hacer esto.

0 votos

Según Metasmoke, esta es una url de spam . Por lo demás, estoy totalmente de acuerdo con @bmdixon, sobre todo porque existen formas seguras de realizar la tarea localmente.

0 votos

@Izzy De todas formas lo marqué como spam y lo reporté a SmokeDetector.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X