Wie extrahieren Sie die Daten einer App aus einer vollständigen Sicherung, die über "adb backup" erstellt wurde?

Ich habe mein Nexus 7 mit adb backupgesichert, um alle Dateien in einem verschlüsselten Backup zu sichern. Ich sehe, dass Sie aus einem Backup mit wiederherstellen können adb restore, aber das würde alle meine vorhandenen Daten auf dem Gerät löschen.

Wie genau würde ich die Daten einer App aus dieser verschlüsselten Sicherungsdatei extrahieren?

Ich glaube, dass keine der Antworten ohne die Verwendung von Java auf verschlüsselten Telefonen funktionieren wird. Siehe meine Antwort unten, die die Verwendung von nelenkovs App zusammenfasst (github.com/nelenkov/android-backup-extractor). Leider funktionieren Izzys Adebar-Perl-Skripte ab2tar nicht mit verschlüsselten Sicherungsdateien. Ähnlich: android.stackexchange.com/questions/23357/…
verwandtdd if=data.ab bs=1 skip=24 | openssl zlib -d | tar -xvf - - erwähnt stackoverflow.com/questions/18533567/…

Antworten (10)

So extrahieren Sie ab-Dateien

Es gibt ein Open-Source-Projekt unter der Apache 2.0-Lizenz, geschrieben von Nikolay Elenkov , mit dem Sie die .ab-Datei in eine tar-Datei extrahieren können.

Verwendung:

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

Hintergrund

Nur als Referenz für andere, hier einige Hintergrundinformationen zum .ab-Dateiformat.

Die Android-Sicherungsdatei (*.ab) ist eine komprimierte TAR -Datei. Es wird mit dem DEFLATE- Algorithmus komprimiert. Darüber hinaus kann eine AES-Verschlüsselung verwendet werden. Dies wird beim Erstellen des Backups festgelegt, wenn Sie ein Passwort eingeben, wird das Backup verschlüsselt, andernfalls; Es gibt keine Verschlüsselung, es wird nur komprimiert.

Der HEADER der Datei unterscheidet sich ein wenig von einem normalen DEFLATE-Archiv. Es enthält Informationen über das Backup und sieht wie folgt aus:

ANDROID BACKUP
1
1
none

Die erste Zeile ist die „Magic“-Zeile . Die nächste Zeile ist die Version des Android Backup-Dateiformats. Die nächste Zeile ist ein boolescher Wert (wahr oder falsch, 1 oder 0), der angibt, ob die Datei komprimiert ist. Die letzte Zeile ist die Art der Verschlüsselung. Dieses Beispiel verwendet keine Verschlüsselung. Wenn es ein Passwort gäbe, würde die Zeile "AES-256" lauten. Danach folgt die Verschlüsselungs-Chiffre. Wenn kein Passwort vorhanden ist, beginnt das DEFLATE-"Archiv".

Es wird mit dem Java Deflater komprimiert . Was aus Entwicklersicht Probleme verursacht, wenn Sie etwas anderes als Java zum Extrahieren verwenden möchten. Ich konnte nichts finden, was es mit demselben Algorithmus entleeren könnte, obwohl alles, was ich gefunden habe (wie C #), der "SPEC" folgen soll.

Wenn Sie sich nicht sicher sind, wie Sie das wirklich verwenden sollen (was den Rahmen dieser Antwort sprengen würde), können Sie mit Droid Explorer seit v0.8.8.7 ( hier verfügbar ) genau dies und mehr direkt vom Explorer aus tun. Sie können mehr über die Funktionen auf meinem Blog lesen (ja, ich weiß, schamloser Plug. Ich mache das, wenn es zur Frage passt)

auspacken

Ich würde dich wählen, wenn ich den Ruf hätte, mein Gott, danke!
keine Ursache. Ich kenne all diese Informationen nur, weil dies eine Funktion ist, die ich erst kürzlich zur Codebasis von Droid Explorer hinzugefügt habe, also musste ich einige Nachforschungen anstellen.
Hallo Ryan, ich habe versucht, Droid Explorer zu verwenden, aber er kann sich nicht über den Speicherort des Android SDK beschweren, obwohl er installiert ist und ich den richtigen Pfad angebe.
@UmarFarooqKhawaja Werfen Sie einen Blick auf die FAQ für Droid Explorer. Die letzte Frage/Antwort befasst sich mit Ihrem Problem.
OK, habe den relevanten Ordner „com.app.name“ aus dem tar extrahiert, aber wie verwende ich das, um die App-Daten wiederherzustellen? Das einfache Kopieren des Ordners nach sdcard/Android/data/ scheint nicht zu funktionieren ...
Das resultierende tarArchiv hat möglicherweise einen falschen Header, den ich gefunden habe. Der letzte Rat, den ich bekommen habe, ist, den folgenden Befehl darauf auszuführen, was nicht geholfen hat. YMMV:dd if=backup01.tar bs=24 skip=1 | zlib-flate -uncompress | tar xf -
Es kann sich lohnen, den Leuten zu sagen, wo sie klicken müssen, um es zu installieren, ohne das Ganze in Visual Studio i.stack.imgur.com/7GQUB.png zu laden

Oder mit einem Einzeiler:

( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 backup.ab ) |  tar xfvz -
Nett! Haben Sie auch das Äquivalent von "pack" (um den unkomprimierten Verzeichnisbaum zu nehmen und eine .db-Datei zu erstellen)?
Könnten Sie der Antwort eine Erklärung hinzufügen?
DAS ist die beste Antwort :D Funktioniert einwandfrei! Jetzt extrahieren.
Erläuterung: Der Autor erstellt einen Standard-Zlib-Dateiheader für eine .tar.gzDatei mit dem printfBefehl ( 0x1F 0x8Bist eine Signatur, 0x08ist die Komprimierungsmethode, 0x00sind Flags und 4 x 0x00ist ein Zeitstempel) und hängt dann an diesen Header den Inhalt der backup.abDatei an, beginnend bei Offset 25d. Ein solcher Stream ist eine gültige .tar.gzDatei, und der tar xfvzBefehl erkennt sie als solche, sodass er den Stream erfolgreich dekomprimieren kann.
Ich habe ein Backup mit adb 1.0.36 (Revision 1.7.0.0+r33-2) erstellt und diese Methode hat einen Fehler von zgip erzeugt:invalid compressed data--format violated
Sehr schön. Kann es geändert werden, um ein Entschlüsselungskennwort zu akzeptieren?
Danke, das war wirklich hilfreich! Als einer der Kommentatoren einer ähnlichen Antwort erhielt ich einen Fehler "unerwartetes Dateiende", aber alles scheint in Ordnung zu sein. Und wie @dailyglen würde ich gerne wissen, ob das reversibel ist?
habe das gleiche Problem, gzip: stdin: ungültige komprimierte Daten – Format verletzt tar: Kind starb mit Signal 13 tar: Fehler ist nicht behebbar: wird jetzt beendet
@Matifou @Rache Da ich das gleiche Problem mit invalid compressed datahabe und beim Backup ein Passwort gesetzt habe, vermute ich das als Problem. Da weder tar noch gzip den Passwortschutz unterstützen, gibt es wohl jetzt eine Möglichkeit, diesen Befehl einfach so anzupassen, dass er nach einem Passwort fragt. :(
Gibt es eine Möglichkeit, dies mit einem verschlüsselten Backup zum Laufen zu bringen? Ich habe kürzlich mein Telefon aktualisiert und mich entschieden, sein Dateisystem zu verschlüsseln. Das gab mir ein verschlüsseltes Backup und ich musste auf die weitaus kompliziertere abe.jarMethode zurückgreifen.
Ich habe jede Methode ausprobiert, die hier in allen Antworten angegeben ist, aber ich bekomme nur leere Tar-Dateien. Was mache ich falsch?
@JosefScript, alles für unverschlüsselte ab-Dateien. Ich bin im selben Boot. Versuchen Sie Izzys Antwort unten ( android.stackexchange.com/a/42224/95893 ), die Perl verwendet, und versuchen Sie tatsächlich seine GitHub-App, weil es mühsam ist, die Anforderungen für sein Skript zu installieren. Ich habe gerade ein Problem auf seinem GitHub darüber gepostet, wie man sein ab2tar-Tool verschlüsselt verwendet. Lassen Sie mich wissen, wenn Ihnen etwas einfällt, und ich werde dasselbe tun, danke
2x schneller mit dd als tail auf meinem Laptop:(printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" && dd if=backup.ab bs=1M iflag=skip_bytes skip=24) | tar ztv

Eine weitere Option ist die Verwendung von bash, catund gunzip( gzip).

Der vollständige Prozess könnte so aussehen ( mit einem unverschlüsselten Backup ):

  1. Sichern Sie die Daten einer App (z. B. " DNS für KitKat überschreiben "):

    $ adb backup -f net.mx17.overridedns.ab -noapk net.mx17.overridedns
    Now unlock your device and confirm the backup operation.
    
  2. Extrahieren Sie die komprimierten Daten

    $ 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. dekomprimieren Sie die komprimierten Daten

    $ printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" \
        | cat - compressed-data | gunzip -c > decompressed-data.tar
    gzip: stdin: unexpected end of file
    
  4. Entpacken Sie die Tar-Datei

    $ tar xf decompressed-data.tar
    
Ist mit dem „unerwarteten Dateiende“ zu rechnen?
Die Extraktion in 2 funktionierte überraschenderweise bei einer verschlüsselten Datei. Wie ist das möglich? Die Dekomprimierung schlug dann mit fehl gzip: stdin: invalid compressed data--format violated. Ich gehe davon aus, dass die Extraktion erfolgreich war, wie ddberichtet wird 22763821+0 records in 22763821+0 records out.
@TomRussell Die Extraktion kürzt lediglich Bytes am Anfang.
Ist dd nicht ein bisschen übertrieben, nur 24 Bytes zu überspringen? Dies ist auch nicht ausfallsicher, es sei denn, es conv=noerror,sync iflag=fullblockwird hinzugefügt: superuser.com/a/1523120/910769 Sie könnten diese Antwort in Betracht ziehen: android.stackexchange.com/a/78183/340401

Basierend auf den Informationen anderer weiß ich jetzt, dass die Sicherungsdatei nur ein vorangestellter deflationierter (GZip) Stream ist, basierend auf diesen Informationen kann dieses einfache Programm sie für Sie entpacken:

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

Ich habe dies geschrieben, weil ich keines der oben genannten Unix-Tools habe und es einfacher war, als Cygwin oder andere Tools zu installieren.

Vorteile :

  • plattformübergreifend
  • einfach (keine esoterischen Parameter)
  • keine Notwendigkeit für Rohrleitungswerkzeuge

Nachteile :

  • Benötigen Sie ein JDK (das Sie wahrscheinlich bereits haben, weil Sie mit Android SDK herumspielen)
  • keine Unterstützung für verschlüsselte Backups
  • brauche etwas, um die resultierende tar-Datei zu extrahieren (ich benutze Total Commander)

Um es zu einem Befehlszeilentool zu machen, erstellen Sie unab.batmit Inhalten: java -cp "%~dp0." unab %*und dem Verzeichnis zu PATH.

Dies ist eigentlich eine recht elegante Lösung - Sie können sofort sehen, was Sie in kleinem Java-Code tun. Verwenden Sie einfach Java (es ist die meiste Zeit bereits auf Ihrem Computer vorhanden): Fügen Sie den obigen Code in "unab.java" ein, rufen Sie "javac unab.java" von der Befehlszeile auf und rufen Sie dann "java unab YUORFILE.ab" auf und das ist es. Danke!

Da die implizite Frage auch lautet, "wie man einzelne App-Daten wiederherstellt", möchte ich dieses raffinierte Skript erwähnen , das eine gegebene full-backup.ab in single-app.ab-Dateien aufteilt.

Es erfordert diese JAR-Dateien: abe.jar und tar-bin-split.jar .

Zumindest für meinen Testfall hat es mit den referenzierten Ressourcen funktioniert.

Eine andere Option ist die Verwendung der Perl AdbBackupRoutines aus diesem XDA-Thread . Sie haben jedoch ein paar Anforderungen: Perl natürlich, plus libterm-readkey-perl, libcrypt-cbc-perl, und libcrypt-pbkdf2-perl(wenn Ihre Backups unverschlüsselt sind, können Sie die letzte Abhängigkeit überspringen, indem Sie einfach Zeile 103 auskommentieren, in der backupdecrypt.plsie enthalten ist - hat bei mir gut funktioniert).

Die Nutzung ist ganz einfach:

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

Die resultierende .tarDatei kann dann wie jeder andere Tarball untersucht werden. Seine Struktur ist in mindestens einem Aspekt recht interessant: Sie spiegelt nicht die tatsächlichen Pfade wider, aus denen die Dateien stammen (z. B. nicht /data/data/com.app.name/databases/whatever.db, sondern stattdessen apps/com.app.name/db/whatever.db) – was darauf hinweist, dass eine auf einem Gerät/ROM gesicherte App wiederhergestellt werden könnte jedes andere Gerät / ROM ohne Probleme, da adb restoredie tatsächlichen Pfade selbst ermittelt werden müssen.

Es gibt ein anderes Tool (etwas besser gepflegt), das dies tut: github.com/nelenkov/android-backup-extractor
Danke, @lid! Ich habe auch ein kleines Shell-Skript (fast nur ein Einzeiler) mit meinem Tool Adebar (Android DEvice Backup And Report) hinzugefügt, das ADB-Backups ( .ab) in .tar.gzArchive konvertiert :)

Um eine weitere Option hinzuzufügen, hier eine Windows PowerShell-Version der Header-Manipulation:

$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)

Sie können versuchen, die ausführbare tar-Datei in den aktuellen Windows 10-Versionen 17063 oder höher zu verwenden, um die Datei zu extrahieren, aber es scheint, dass sie die bei diesem Prozess erzeugte falsch formatierte Datei derzeit nicht so gut verarbeitet wie die Linux-Version. YMMV:

tar -xvzf $file_temp

Um den vollständigen Inhalt zu erhalten, können Sie manuell mit 7zip oder ähnlichem extrahieren. Oder könnte mit einer der Antworten aus der nativen .tar-Extraktion in Powershell kombiniert werden .

7zip und auch andere Archivierungstools verfügen über Kommandozeilen-Tools
Ich mag diese Technik, aber ich erhalte einen OOM (Out Of Memory)-Fehler, wenn ich versuche, sie zu verwenden. Es ist die vorletzte Zeile im PS-Skript, die den gesamten verfügbaren Arbeitsspeicher aufzufressen scheint.

Nur um andere Antworten zu ergänzen, habe ich es endlich mit der App von Nelenkov und den Anweisungen von hier bekommen . Ich habe versucht, den zusätzlichen Speicherplatz von 800 MB für Java zu vermeiden. Die meisten Telefone bewegen sich standardmäßig in Richtung Verschlüsselung, und ich denke, die App von Nelenkov ist die einzige Lösung, die gut mit Verschlüsselung funktioniert.

Hier ist ein direkter Link zu nelenkovs kompilierter JAR-Version . Bitte überprüfen Sie, ob es die neueste ist, und folgen Sie dann den Anweisungen unter dem obigen Link. Es enthält weitere Informationen zu Helium und zum Aufteilen einer AB-Datei in einzelne App-Dateien. Und auch eine Möglichkeit, Apps zu ändern, die nicht auf die Verwendung von Adb-Backups ohne Root eingestellt sind. Ersetzen Sie abe-all.jar, wenn Sie diese Release-Datei verwenden.

  1. Konvertieren Sie das ursprüngliche Adb-Backup in das Tar-Format:

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

  1. Extrahieren Sie den Inhalt des tar-Archivs. Dies sollte auf einem Dateisystem erfolgen, auf dem die Zugriffsrechte der Dateien im tar erhalten bleiben, beispielsweise unter Verwendung von Linux, Mac oder BSD. Es können bis zu zwei Ordner erscheinen, Apps und Shared:

tar -xvf nexus7.tar

Jetzt sollten Sie neue Ordner haben, in denen Sie nachsehen können. Jetzt können Sie sehen, welche Apps gesichert sind und welche nicht.

Übrigens, Izzys Antwort ist gut, aber sein Skript erfordert die Installation mehrerer Perl-Module, von denen ich das dritte nicht leicht finden konnte. Seine App ist voll funktionsfähig, aber finden Sie adb2tarin Adebar-master/tools/. Auch hier funktioniert es jedoch nicht mit verschlüsselten AB-Dateien.

Mir war nicht bewusst ab2tar, dass Perl-Module erforderlich sind. Was es im Grunde tut, ist das, was rmils Antwort beschreibt;) Aber vielleicht hat es das in einer älteren Version getan…

Dies funktionierte für mich in einer Linux-Umgebung:

dd if=backup.adb skip=1 bs=24 | zlib-flate -uncompress | cat > somewhere.tar
tar xvf somewhere.tar
Duplizieren nach oben als zB android.stackexchange.com/a/73052/340401 ?
@Cadoiz nein, überprüfen Sie die Befehle genau. Dies hier ist eher das, was ab2tarAdebar tut (siehe die Antwort der Alchemie).
Was bringt es, stdin durchzuleiten cat? Löschen Sie den gesamten | catSchritt in der Pipeline.

Sie können die neueste Binärdatei des Android Backup Processors herunterladen . Extrahieren Sie nach dem Herunterladen die ZIP-Datei und führen Sie Folgendes aus:

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

Befehle
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]