149 votos

¿Cómo se extraen los datos de una aplicación de una copia de seguridad completa hecha a través de "adb backup"?

He estado respaldando mi Nexus 7 con adb backup para hacer una copia de seguridad de todos los archivos en una copia de seguridad encriptada. Veo que puedes restaurar desde una copia de seguridad con adb restore pero eso borraría todos mis datos existentes en el dispositivo.

¿Cómo extraería exactamente los datos de una aplicación de este archivo de copia de seguridad encriptado?

0 votos

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

1 votos

relacionado- dd if=data.ab bs=1 skip=24 | openssl zlib -d | tar -xvf - mencionado stackoverflow.com/questions/18533567/

142voto

mercutio Puntos 5828

Sólo para referencia de otros, aquí hay algunos antecedentes sobre el formato de archivo .ab.

El archivo de copia de seguridad de Android (*.ab) es un archivo comprimido TAR archivo. Está comprimido usando el DEFLATE algoritmo. Además de eso, puede haber Encriptación AES usado. Esto se determina cuando se crea la copia de seguridad, si se introduce una contraseña entonces la copia de seguridad está cifrada, de lo contrario; no hay cifrado, sólo está comprimida.

El encabezado del archivo es un poco diferente al de un archivo DEFLATE normal. Contiene información sobre la copia de seguridad y tiene el siguiente aspecto:

ANDROID BACKUP
1
1
none

La primera línea es la Línea "mágica" . La siguiente línea es la versión del formato de archivo de copia de seguridad de Android. La siguiente línea es un booleano (verdadero o falso, 1 o 0) que indica si el archivo está comprimido. La última línea es el tipo de cifrado. Este ejemplo no utiliza ningún tipo de cifrado. Si hubiera una contraseña, la línea diría "AES-256". Después de eso está el cifrado de la encriptación. Si no hay contraseña, entonces el "archivo" DEFLATE comienza.

Se comprime usando el Desinflamador de Java . Lo cual, desde la perspectiva de los desarrolladores, causa problemas si quieres usar algo más que Java para extraerlo. No he sido capaz de encontrar nada que pueda desinflarlo usando el mismo algoritmo, aunque todo lo que he encontrado (para como C#) se supone que sigue el "SPEC".

Dicho esto, hay un proyecto de código abierto bajo la licencia de Apache 2.0, escrito por Nikolay Elenkov que le permitirá extraer el .ab en un archivo de alquitrán.

Uso:

java -jar abe.jar unpack <backup.ab> <backup.tar> <password>

Si no está seguro de cómo usar realmente eso (lo cual está fuera del alcance de esta respuesta) la próxima versión de Explorador de droides v0.8.8.7 ( disponible aquí ) le permitirá hacer exactamente esto, y más, directamente desde el Explorador. Puedes leer más sobre las características en mi blog (sí, lo sé, enchufe desvergonzado. Lo hago cuando encaja con la pregunta)

unpack

4 votos

Te votaría si tuviera la reputación, ¡Dios mío, gracias!

1 votos

de nada. Sólo conozco toda esa información porque se trata de una función que he añadido recientemente a la base de código del Droid Explorer, así que tuve que investigar un poco sobre ella.

0 votos

Hola Ryan, traté de usar Droid Explorer pero falla al iniciar quejándose de la ubicación del SDK de Android, a pesar de que está instalado y estoy suministrando la ruta correcta.

120voto

Kari Puntos 101

O con una sola línea:

( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 backup.ab ) |  tar xfvz -

5 votos

¡Bien! ¿También tiene el equivalente de "pack" (para tomar el árbol de directorios sin comprimir y crear un archivo .db)?

7 votos

¿Podría añadir una explicación a la respuesta?

3 votos

ESTA es la mejor respuesta :D ¡Funciona perfectamente bien! Extrayendo ahora.

37voto

Priyank Bolia Puntos 3825

Una opción más es usar bash , cat y gunzip ( gzip ).

El proceso completo podría ser este ( con una copia de seguridad no encriptada ):

  1. hacer una copia de seguridad de los datos de una aplicación (por ejemplo " Anular el DNS para KitKat "):

    $ adb backup -f net.mx17.overridedns.ab -noapk net.mx17.overridedns
    Now unlock your device and confirm the backup operation.
  2. extraer los datos comprimidos

    $ dd if=net.mx17.overridedns.ab bs=1 skip=24 > compressed-data
    1285+0 records in
    1285+0 records out
    1285 bytes (1,3 kB) copied, 0,00745877 s, 172 kB/s
  3. descomprimir los datos comprimidos

    $ printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" \
        | cat - compressed-data | gunzip -c > decompressed-data.tar
    gzip: stdin: unexpected end of file
  4. "destar" el archivo de alquitrán

    $ tar xf decompressed-data.tar

7 votos

¿Es de esperar el "final inesperado del archivo"?

0 votos

La extracción en la 2 funcionó sorprendentemente en un archivo encriptado. ¿Cómo es posible? La descompresión luego falló con gzip: stdin: invalid compressed data--format violated . Supongo que la extracción tuvo éxito, ya que dd informa 22763821+0 records in 22763821+0 records out .

0 votos

@TomRussell La extracción simplemente recorta los bytes del inicio.

10voto

TWiStErRob Puntos 136

Basado en la información por otros, ahora sé que el archivo de copia de seguridad es sólo un flujo prefijado Deflated (GZip), sobre la base de esta información este sencillo programa puede descomprimir para usted:

import java.io.*;
import java.util.zip.*;

/** Run: javac unab.java && java unab backupfile.ab */
public class unab {
    private static final int BACKUP_HEADER_LENGTH = 24;
    public static void main(String[] args) throws IOException {
        InputStream in = new FileInputStream(args[0]);
        try {
            OutputStream out = new FileOutputStream(args[0] + ".tar");
            try {
                if (in.skip(BACKUP_HEADER_LENGTH) != BACKUP_HEADER_LENGTH) {
                    throw new IOException("Unexpected end of file while skipping backup header.");
                }
                byte[] buffer = new byte[100 * 1024];
                int count;
                InputStream zip = new InflaterInputStream(in);
                while ((count = zip.read(buffer)) > 0) {
                    out.write(buffer, 0, count);
                }
            } finally {
                out.close();
            }
        } finally {
            in.close();
        }
    }
}

Escribí esto porque no tengo ninguna de las herramientas Unix mencionadas anteriormente, y era más fácil que instalar Cygwin u otras herramientas.

Ventajas :

  • plataforma cruzada
  • simple (sin parámetros esotéricos)
  • sin necesidad de herramientas de canalización

Desventajas :

  • necesita un JDK (que probablemente ya tiene porque está jugando con el SDK de Android)
  • no hay soporte para copias de seguridad encriptadas
  • necesito algo para extraer el archivo tar resultante (yo uso Total Commander)

Para que sea una herramienta de línea de comandos, cree unab.bat con contenido: java -cp "%~dp0." unab %* y el directorio a PATH .

1 votos

En realidad es una solución bastante elegante - se puede ver de inmediato lo que está haciendo en un pequeño código java. Sólo tienes que usar java (ya está ahí en tu máquina la mayoría de las veces): pon el código anterior en "unab.java", llama a "javac unab.java" desde la línea de comandos y luego llama a "java unab YUORFILE.ab" y ya está. Gracias.

6voto

joe_zeroh Puntos 51

Como la pregunta implícita es también, "cómo restaurar los datos de una sola aplicación", me gustaría mencionar este ingenioso script que divide un determinado full-backup.ab en archivos single-app.ab.

Requiere estos archivos jar: abe.jar y tar-bin-split.jar .

Al menos en mi caso de prueba, funcionó utilizando los recursos referenciados.

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