Come si estraggono i dati di un'app da un backup completo effettuato tramite "backup adb"?


117

Ho eseguito il backup del mio Nexus 7 adb backupper eseguire il backup di tutti i file in un backup crittografato. Vedo che è possibile ripristinare da un backup con adb restore, ma che cancellerebbe tutti i miei dati esistenti sul dispositivo.

Come estrarrei esattamente i dati di un'app da questo file di backup crittografato?


Risposte:


113

Solo per riferimento ad altri, ecco alcuni retroscena sul formato di file .ab.

Il file di backup Android (* .ab) è un file TAR compresso . È compresso usando l' algoritmo DEFLATE . Inoltre, è possibile utilizzare la crittografia AES . Questo viene determinato quando si crea il backup, se si immette una password, il backup viene crittografato, altrimenti; non c'è crittografia, è solo compresso.

HEADER del file è leggermente diverso da un normale archivio DEFLATE. Contiene informazioni sul backup e ha il seguente aspetto:

ANDROID BACKUP
1
1
none

La prima linea è la linea "Magia" . La riga successiva è la versione del formato del file di backup Android. La riga successiva è un valore booleano (vero o falso, 1 o 0) che indica se il file è compresso. L'ultima riga è il tipo di crittografia. Questo esempio non utilizza alcuna crittografia. Se fosse presente una password, la riga visualizzerà "AES-256". Dopo questo è il codice di crittografia. Se nessuna password, viene avviato "DEFLATE" archivio.

Viene compresso utilizzando il Deflater Java . Che, dal punto di vista degli sviluppatori, causa problemi se si desidera utilizzare qualcosa oltre a Java per estrarlo. Non sono stato in grado di trovare nulla in grado di sgonfiarlo utilizzando lo stesso algoritmo, anche se tutto ciò che ho trovato (come C #) dovrebbe seguire la "SPEC".

Detto questo, esiste un progetto open source con licenza Apache 2.0, scritto da Nikolay Elenkov che ti permetterà di estrarre il file .ab in un file tar.

Uso:

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

Se non sei sicuro di come utilizzare davvero (che va oltre lo scopo di questa risposta), la prossima versione di Droid Explorer v0.8.8.7 ( disponibile qui ) ti permetterà di fare esattamente questo, e altro, direttamente da Explorer. Puoi leggere di più sulle funzionalità del mio blog (sì, lo so, spina spudorata. Lo faccio quando si adatta alla domanda)

disfare


1
Vorrei votarti se avessi la reputazione, mio ​​dio grazie!

prego. Conosco solo tutte queste informazioni perché questa è una funzione che ho appena aggiunto alla base di codici di Droid Explorer, quindi ho dovuto fare qualche ricerca su di essa.
Ryan Conrad,

Ciao Ryan, ho provato a utilizzare Droid Explorer ma non riesce a lamentarsi della posizione dell'SDK di Android, anche se è installato e sto fornendo la strada giusta.
Umar Farooq Khawaja

@UmarFarooqKhawaja Dai un'occhiata alle FAQ per Droid Explorer. L'ultimo Q / A risolve il problema.
Ryan Conrad,

OK, ho estratto la relativa cartella 'com.app.name' dal tar ma come posso usarla per ripristinare i dati dell'app?
Copiare

91

O con una fodera:

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

2
Bello! Hai anche l'equivalente di "pack" (per prendere l'albero delle directory non compresso e creare un file .db)?
dailyglen,

4
Potresti aggiungere una spiegazione alla risposta?
Lucky

2
QUESTA è la risposta migliore: D Funziona perfettamente! Estrazione ora.
xdevs23,

16
Spiegazione: l'autore crea un'intestazione di file Zlib standard per un .tar.gzfile con printfcomando ( 0x1F 0x8Bè una firma, 0x08è il metodo di compressione, 0x00sono flag e 4 x 0x00è timestamp), quindi aggiunge a questa intestazione il contenuto del backup.abfile, a partire dall'offset 25d. Tale flusso è un .tar.gzfile valido e il tar xfvzcomando lo riconosce come tale, quindi può decomprimere correttamente il flusso.
antonone,

3
Ho fatto un backup con adb 1.0.36 (Revisione 1.7.0.0 + r33-2) e questo metodo ha prodotto un errore da zgip:invalid compressed data--format violated
Rache

31

Un'altra opzione è usare bash, cate gunzip( gzip).

Il processo completo potrebbe essere questo ( con un backup non crittografato ):

  1. eseguire il backup dei dati di un'app (ad esempio " Sostituisci DNS per KitKat "):

    $ adb backup -f net.mx17.overridedns.ab -noapk net.mx17.overridedns
    Now unlock your device and confirm the backup operation.
    
  2. estrarre i dati compressi

    $ 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. decomprimere i dati compressi

    $ printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" \
        | cat - compressed-data | gunzip -c > decompressed-data.tar
    gzip: stdin: unexpected end of file
    
  4. "untar" il file tar

    $ tar xf decompressed-data.tar
    

4
La "fine imprevista del file" è prevedibile?
hft

L'estrazione in 2 ha funzionato sorprendentemente su un file crittografato. Com'è possibile? La decompressione quindi fallì gzip: stdin: invalid compressed data--format violated. Presumo che l'estrazione sia riuscita, come ddriporta 22763821+0 records in 22763821+0 records out.
Tom Russell,

4

Un'altra opzione è utilizzare Perl AdbBackupRoutines da questo thread XDA . Tuttavia, hanno alcuni requisiti: Perl ovviamente, plus libterm-readkey-perl, libcrypt-cbc-perle libcrypt-pbkdf2-perl(se i backup non sono crittografati, puoi saltare l'ultima dipendenza semplicemente commentando la riga 103 di backupdecrypt.pldove è inclusa - ha funzionato bene per me).

L'utilizzo è abbastanza semplice:

./backupdecrypt.pl [options] <backupfile.ab> <outfile.tar>

Il .tarfile risultante può quindi essere esaminato come qualsiasi altro tarball. La sua struttura è piuttosto interessante in almeno un aspetto: non riflette i percorsi reali da cui sono stati presi i file (ad esempio no /data/data/com.app.name/databases/whatever.db, ma invece apps/com.app.name/db/whatever.db) - che indica che un'app di cui è stato eseguito il backup su un dispositivo / ROM potrebbe essere ripristinata su qualsiasi altro dispositivo / ROM senza problemi, come adb restoredeve capire i percorsi reali stessi.


C'è un altro strumento (un po 'meglio mantenuto) che fa questo: github.com/nelenkov/android-backup-extractor
coperchio

Grazie, @lid! Ho anche incluso un piccolo script di shell (quasi solo una riga ) con il mio strumento Adebar (Android DEvice Backup And Report), che converte i backup ADB ( .ab) in .tar.gzarchivi :)
Izzy

4

Sulla base delle informazioni di altri, ora so che il file di backup è solo un flusso Deflated (GZip) con prefisso, in base a queste informazioni questo semplice programma può decomprimerlo per te:

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();
        }
    }
}

L'ho scritto perché non ho nessuno degli strumenti Unix sopra menzionati ed è stato più facile che installare Cygwin o altri strumenti.

Vantaggi :

  • piattaforme
  • semplice (nessun parametro esoterico)
  • non sono necessari strumenti per le tubazioni

Svantaggi :

  • hai bisogno di un JDK (che probabilmente hai già perché stai scherzando con Android SDK)
  • nessun supporto per backup crittografati
  • serve qualcosa per estrarre il file tar risultante (io uso Total Commander)

Per renderlo uno strumento da riga di comando creare unab.batcon il contenuto: java -cp "%~dp0." unab %*e la directory in PATH.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.