He estado haciendo una copia de seguridad de mi Nexus 7 adb backup
para hacer una copia de seguridad de todos los archivos en una copia de seguridad cifrada. Veo que puede 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 respaldo encriptado?
Hay un proyecto de código abierto bajo la licencia Apache 2.0, escrito por Nikolay Elenkov que le permitirá extraer el .ab en un archivo tar.
Uso:
java -jar abe.jar unpack <backup.ab> <backup.tar> <password>
Solo 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 TAR comprimido . Se comprime utilizando el algoritmo DEFLATE . Además de eso, se puede utilizar el cifrado AES . Esto se determina cuando crea la copia de seguridad, si ingresa una contraseña, la copia de seguridad se cifra, de lo contrario; no hay cifrado, solo está comprimido.
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 "Magic" . La siguiente línea es la versión del formato de archivo de copia de seguridad de Android. La siguiente línea es un valor 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 ninguna encriptación. Si hubiera una contraseña, la línea diría "AES-256". Después de eso está el cifrado de cifrado. Si no hay contraseña, se inicia el "archivo" DEFLATE.
Se comprime utilizando Java Deflater . Lo cual, desde la perspectiva de los desarrolladores, causa problemas si desea usar algo además de Java para extraerlo. No he podido encontrar nada que pueda desinflarlo usando el mismo algoritmo, aunque se supone que todo lo que he encontrado (como C #) sigue el "SPEC".
Si no está seguro de cómo usar eso realmente (que está más allá del alcance de esta respuesta), Droid Explorer desde v0.8.8.7 ( disponible aquí ) le permite hacer exactamente esto y más, directamente desde Explorer. Puede leer más sobre las características en mi blog (sí, lo sé, enchufe desvergonzado. Lo hago cuando se ajusta a la pregunta)
tar
puede tener un encabezado incorrecto, lo he encontrado. El último consejo que he recibido es ejecutar el siguiente comando, que no ayudó. YMMV:dd if=backup01.tar bs=24 skip=1 | zlib-flate -uncompress | tar xf -
O con una sola línea:
( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 backup.ab ) | tar xfvz -
.tar.gz
archivo con printf
comando ( 0x1F 0x8B
es una firma, 0x08
es el método de compresión, 0x00
son indicadores y 4 x 0x00
es una marca de tiempo), luego agrega a este encabezado el contenido del backup.ab
archivo, comenzando desde el desplazamiento 25d. .tar.gz
Dicho flujo es un archivo válido y el tar xfvz
comando lo reconoce como tal, por lo que puede descomprimirlo con éxito.invalid compressed data--format violated
invalid compressed data
y configuré una contraseña en la copia de seguridad, sospecho que ese es el problema. Dado que ni tar ni gzip admiten la protección con contraseña, supongo que ahora hay una manera, este comando se puede ajustar fácilmente para solicitar una contraseña. :(abe.jar
método mucho más complicado.(printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" && dd if=backup.ab bs=1M iflag=skip_bytes skip=24) | tar ztv
Una opción más es usar bash
, cat
y gunzip
( gzip
).
El proceso completo podría ser este ( con una copia de seguridad sin cifrar ):
hacer una copia de seguridad de los datos de una aplicación (por ejemplo, " Anular DNS para KitKat "):
$ adb backup -f net.mx17.overridedns.ab -noapk net.mx17.overridedns
Now unlock your device and confirm the backup operation.
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
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
"descomprimir" el archivo tar
$ tar xf decompressed-data.tar
gzip: stdin: invalid compressed data--format violated
. Supongo que la extracción tuvo éxito, como dd
informa 22763821+0 records in 22763821+0 records out
.conv=noerror,sync iflag=fullblock
se agregue: superuser.com/a/1523120/910769 Puede considerar esta respuesta: android.stackexchange.com/a/78183/340401Basado en la información de otros, ahora sé que el archivo de copia de seguridad es solo una secuencia desinflada (GZip) con prefijo, según esta información, este programa simple puede descomprimirlo 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 de Unix mencionadas anteriormente, y fue más fácil que instalar Cygwin u otras herramientas.
ventajas :
Desventajas :
Para convertirlo en una herramienta de línea de comandos, cree unab.bat
con contenidos: java -cp "%~dp0." unab %*
y el directorio para PATH
.
Como la pregunta implícita también es "cómo restaurar los datos de una sola aplicación", me gustaría mencionar este ingenioso script , que divide un full-backup.ab dado en archivos single-app.ab.
Requiere estos archivos jar: abe.jar y tar-bin-split.jar .
Al menos para mi caso de prueba, funcionó con los recursos a los que se hace referencia.
Otra opción es usar Perl AdbBackupRoutines de este subproceso XDA . Sin embargo, tienen algunos requisitos: Perl obviamente, más libterm-readkey-perl
, libcrypt-cbc-perl
y libcrypt-pbkdf2-perl
(si sus copias de seguridad no están encriptadas, puede omitir la última dependencia simplemente comentando la línea 103 de backupdecrypt.pl
donde está incluida; funcionó bien para mí).
El uso es bastante fácil:
./backupdecrypt.pl [options] <backupfile.ab> <outfile.tar>
El archivo resultante .tar
se puede investigar como cualquier otro tarball. Su estructura es bastante interesante en al menos un aspecto: no refleja las rutas reales de las que se han tomado los archivos (por ejemplo, no /data/data/com.app.name/databases/whatever.db
, sino apps/com.app.name/db/whatever.db
), lo que indica que una aplicación respaldada en un dispositivo/ROM podría restaurarse a cualquier otro dispositivo/ROM sin problemas, ya que adb restore
debe descubrir las rutas reales por sí mismo.
.ab
) en .tar.gz
archivos :)Para agregar otra opción, aquí hay una versión de Windows PowerShell de la manipulación del encabezado:
$file_in = (Get-Location).Path + "\backup.ab"
$file_temp = (Get-Location).Path + "\temp.tgz"
[int32[]]$header = 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00
$bytes = [System.IO.File]::ReadAllBytes($file_in)
$bytesout = $header + $bytes[24..($bytes.Length - 1)]
[System.IO.File]::WriteAllBytes($file_temp, $bytesout)
Puede intentar usar el ejecutable tar en las versiones actuales de Windows 10 17063 o posteriores para extraer el archivo, sin embargo, parece que actualmente no maneja el archivo deformado producido en este proceso tan bien como la versión de Linux. YMMV:
tar -xvzf $file_temp
Para obtener el contenido completo, puede extraerlo manualmente con 7zip o similar. O podría combinarse con una de las respuestas de la extracción Native .tar en Powershell .
Solo para agregar a otras respuestas, finalmente lo obtuve usando la aplicación de nelenkov y las instrucciones de aquí . Estaba tratando de evitar el espacio en disco adicional de 800 mb para Java. La mayoría de los teléfonos se están moviendo hacia el cifrado de forma predeterminada, y creo que la aplicación de nelenkov es la única solución que funciona bien con el cifrado.
Aquí hay un enlace directo al lanzamiento de jar compilado de nelenkov . Verifique si es el último, luego siga las instrucciones del enlace anterior. Tiene más información sobre Helium y Dividir un archivo ab en archivos de aplicaciones individuales. Y también una forma de cambiar las aplicaciones que no están configuradas para usar la copia de seguridad adb sin root. Sustitúyalo abe-all.jar
si utiliza este archivo de versión.
- Convierta la copia de seguridad adb original al formato tar:
java -jar abe.jar unpack nexus7.ab nexus7.tar <password>
- Extraiga el contenido del archivo tar. Esto debe hacerse en un sistema de archivos donde se conserven los permisos de los archivos dentro del tar, por ejemplo, usando linux, mac o bsd. Pueden aparecer hasta dos carpetas, apps y shared:
tar -xvf nexus7.tar
Ahora debería tener nuevas carpetas para buscar. Ahora puede ver qué aplicaciones están respaldadas y cuáles no.
Por cierto, la respuesta de Izzy es buena, pero su secuencia de comandos requiere la instalación de varios módulos de Perl, el tercero de los cuales no pude encontrar fácilmente. Su aplicación tiene todas las funciones, pero encuentra adb2tar
en Adebar-master/tools/
. Una vez más, no funciona con archivos ab cifrados.
ab2tar
que requiere ningún módulo de Perl. Básicamente, lo que hace es lo que describe la respuesta de rmil;) Pero tal vez lo hizo en una versión anterior...Esto funcionó para mí en el entorno Linux:
dd if=backup.adb skip=1 bs=24 | zlib-flate -uncompress | cat > somewhere.tar
tar xvf somewhere.tar
ab2tar
que hace Adebar (ver la respuesta de la alquimia).cat
? Elimine todo el | cat
paso en la canalización.Puede descargar el último binario del procesador de copia de seguridad de Android . Una vez descargado, extraiga el archivo zip y ejecute:
java -jar abp.jar unpack <backup.ab> <backup.tar> <password>
Usage:
info: java -jar abp.jar [-debug] [-useenv=yourenv] info <backup.ab> [password]
unpack: java -jar abp.jar [-debug] [-useenv=yourenv] unpack <backup.ab> <backup.tar> [password]
pack: java -jar abp.jar [-debug] [-useenv=yourenv] pack <backup.tar> <backup.ab> [password]
pack-kk: java -jar abp.jar [-debug] [-useenv=yourenv] pack-kk <backup.tar> <backup.ab> [password]
izzy
alquimia
barlop
dd if=data.ab bs=1 skip=24 | openssl zlib -d | tar -xvf -
mencionado stackoverflow.com/questions/18533567/…