Gibt es eine Möglichkeit, in eine von Adb erstellte Backup-Datei hineinzuschauen und sie zu ändern?

Ich habe ein Backup meines Galaxy Nexus mit erstellt adb backup. Die resultierende Datei heißt backup.db und ist irgendwie verschlüsselt.

Ich wollte das Backup wiederherstellen, aber es stoppt, wenn es um die Wiederherstellung geht com.android.providers.contacts. Früher adb logcathabe ich herausgefunden, was los ist, und herausgefunden, dass es com.android.acorewährend des Wiederherstellungsprozesses abstürzt.

Ich möchte auf die Daten in der Sicherung zugreifen und die Kontaktdatenbank entfernen, um alles auf meinem Telefon wiederherzustellen. Gibt es andere Möglichkeiten, die Daten aus dem Backup wiederherzustellen?

Ich glaube, dass keine der Antworten ohne die Verwendung von Java auf verschlüsselten Telefonen funktionieren wird. Siehe meine Antwort hier: android.stackexchange.com/a/224474/95893, die die Verwendung von nelenkovs App zusammenfasst (github.com/nelenkov/android-backup-extractor). Leider funktionieren Izzys Adebar-Perl-Skripte ab2tar nicht mit verschlüsselten Backup-Dateien. Ähnlich: android.stackexchange.com/questions/28481/…

Antworten (4)

Die Datei wird nicht verschlüsselt, es sei denn, Sie geben dies beim Erstellen der Sicherung an. Es wird jedoch komprimiert (durch Deflate). Sie können das genaue Format herausfinden, indem Sie sich den Android-Quellcode (com/android/server/BackupManagerService.java) ansehen, und sollten technisch gesehen in der Lage sein, bestimmte Daten daraus zu extrahieren. Allerdings, IIRC, es gibt einige Dateiintegritätsprüfungen, daher wird es höchstwahrscheinlich nicht funktionieren, wenn Sie nur eine Reihe von Daten daraus löschen. Leider restorescheint der Befehl keine Option zu haben, um nur eine bestimmte App/ein bestimmtes Paket wiederherzustellen oder ein Paket auszuschließen.

Danke! Das ist zumindest ein Ausgangspunkt, um in die Datei zu schauen. Wäre einfacher gewesen, wenn ich kein Passwort für die Sicherung angegeben hätte.
Wenn Sie ein Passwort angegeben haben, ist es tatsächlich verschlüsselt. `BackupManagerService' enthält Details zu den tatsächlichen Verschlüsselungsalgorithmen, und Schlüsselableitungsparameter (Salt, Iterationszähler usw.) werden in den Dateiheader geschrieben. Da Sie das Passwort kennen, können Sie den Schlüssel ableiten und die Daten entschlüsseln. Es ist also noch machbar, aber nicht ganz einfach...
Ja, ich entpacke derzeit alles BackupManagerService, um den Inhalt der Sicherungsdatei zu lesen. Es ist eine Menge Arbeit, aber ich brauche meine Daten zurück...
@ingorichter Ich habe angefangen, daran zu arbeiten, und unten eine Menge Notizen in einer "Community-Wiki" -Antwort gepostet. Fühlen Sie sich frei, es zu ergänzen.

Ich habe angefangen, daran zu arbeiten. Ich poste meine bisherigen Ergebnisse hier aus zwei Gründen als "Community-Wiki" -Antwort: Erstens, wenn jemand anderes mitmachen möchte, gibt es einen Ort zum Reden; Zweitens, wenn ich von diesem Projekt abgezogen werde, gibt es Hinweise für jemand anderen, mit der Arbeit zu beginnen.

 

Die Sicherungslogik auf dem Host ist vollständig in https://github.com/android/platform_system_core/blob/master/adb/commandline.cpp in der Funktion namens enthalten backup. Die Funktion ist sehr einfach: Sie validiert die Befehlszeilenoptionen, sendet den Befehl größtenteils unverändert an den adb-Daemon auf dem Telefon und schreibt die Ausgabe des Telefons in die Datei. Es gibt nicht einmal eine Fehlerprüfung: Wenn Sie zum Beispiel das Backup am Telefon ablehnen, adbschreibt es einfach eine leere Datei aus.

Auf dem Telefon beginnt die Sicherungslogik service_to_fd()in https://github.com/android/platform_system_core/blob/master/adb/services.cpp . Die Funktion identifiziert, dass der Befehl vom Host lautet "backup", und übergibt den nicht geparsten Befehl an /system/bin/bu, ein triviales Shell-Skriptcom.android.commands.bu.Backup , das als Hauptklasse eines neuen Android-App-Prozesses gestartet werden kann. Das ruft ServiceManager.getService("backup")auf, um den Sicherungsdienst als zu erhalten IBackupManager, und ruft IBackupManager.fullBackup()auf und übergibt ihm den noch unbenutzten Dateideskriptor (sehr indirekt), der mit der backup.abDatei auf dem Host verbunden ist.

Die Steuerung geht an fullBackup()in com.android.server.backup.BackupManagerService über , das die GUI öffnet und den Benutzer auffordert, die Sicherung zu bestätigen/abzulehnen. Wenn der Benutzer dies tut, wird acknowledgeFullBackupOrRestore()(gleiche Datei) aufgerufen. Wenn der Benutzer die Anfrage genehmigt hat, stellt acknowledgeFullBackupOrRestore()er fest, ob das Backup verschlüsselt ist, und leitet eine Nachricht an BackupHandler(dieselbe Datei) BackupHandlerweiter, instanziiert und startet dann eine PerformAdbBackupTask( dieselbe Datei, Zeile 4004 zum Zeitpunkt des Schreibens)

Schließlich beginnen wir dort, inPerformAdbBackupTask.run() , zwischen Zeile 4151 und Zeile 4330 mit der Ausgabe .

Schreibt zuerst run()einen Header, der entweder aus 4 oder 9 ASCII-Zeilen besteht:

  1. "ANDROID BACKUP"
  2. die Backup-Format-Version: derzeit"4"
  3. entweder "0", ob die Sicherung unkomprimiert ist oder "1"ob sie es ist
  4. die Verschlüsselungsmethode: derzeit entweder "none"oder"AES-256"
  5. (falls verschlüsselt), das "user password salt" codiert in Hex, alle Großbuchstaben
  6. (falls verschlüsselt), das "Hauptschlüssel-Prüfsummensalz", codiert in Hex, alle Großbuchstaben
  7. (falls verschlüsselt), die "Anzahl der verwendeten PBKDF2-Runden" als Dezimalzahl: derzeit"10000"
  8. (falls verschlüsselt), die "IV des Benutzerschlüssels" codiert in Hex, alle Großbuchstaben
  9. (falls verschlüsselt), der "Master IV + Schlüsselblob, verschlüsselt durch den Benutzerschlüssel", codiert in Hex, alle Großbuchstaben

Die eigentlichen Sicherungsdaten folgen, entweder als (je nach Komprimierung und Verschlüsselung) tar, deflate(tar), encrypt(tar), oder encrypt(deflate(tar)).

 

TODO : Schreiben Sie den Codepfad auf, der die tar-Ausgabe generiert - Sie können einfach tar verwenden, solange die Einträge in der richtigen Reihenfolge sind (siehe unten).

Tar-Archivformat

App-Daten werden unter dem Verzeichnis app/ gespeichert, beginnend mit einer _manifest-Datei, dem APK (falls erforderlich) in a/, App-Dateien in f/, Datenbanken in db/ und gemeinsam genutzten Einstellungen in sp/. Wenn Sie eine externe Speichersicherung (mit der Option -shared) angefordert haben, gibt es im Archiv auch ein Verzeichnis shared/, das externe Speicherdateien enthält.

$ 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

Verschlüsselungsdetails

  1. Ein AES 256-Schlüssel wird aus dem Backup-Verschlüsselungskennwort unter Verwendung von 10000 PBKDF2-Runden mit einem zufällig generierten 512-Bit-Salz abgeleitet.
  2. Ein AES 256-Hauptschlüssel wird zufällig generiert
  3. Eine Hauptschlüssel-'Prüfsumme' wird generiert, indem der Hauptschlüssel 10000 Runden von PBKDF2 mit einem neuen, zufällig generierten 512-Bit-Salz durchläuft.
  4. Eine zufällige Sicherungsverschlüsselung IV wird generiert.
  5. IV, Hauptschlüssel und Prüfsumme werden verkettet und mit dem in 1 abgeleiteten Schlüssel verschlüsselt. Der resultierende Blob wird im Header als Hex-String gespeichert.
  6. Die eigentlichen Sicherungsdaten werden mit dem Hauptschlüssel verschlüsselt und an das Ende der Datei angehängt.

Beispiel für die Implementierung von Code zum Packen/Entpacken (erzeugt/verwendet) tar-Archive: https://github.com/nelenkov/android-backup-extractor

Einige weitere Details hier: http://nelenkov.blogspot.com/2012/06/unpacking-android-backups.html

Perl-Skripte zum Packen/Entpacken und Reparieren defekter Archive:

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

Kommentare sind nicht für längere Diskussionen gedacht; diese Konversation wurde in den Chat verschoben .

Tolle und detaillierte Antwort von Nikolay Elenkov . Ich sollte jedoch hinzufügen, dass jemand bereits eine Software entwickelt hat, die genau das tut, und sie hier verpackt: http://sourceforge.net/projects/adbextractor/

Das Paket enthält sowohl das Java- als auch das Perl-Tool. Ich selbst bevorzuge jeden Tag Perl gegenüber Java, also habe ich die Perl-Codes extrahiert, sichergestellt, dass sie ausführbar sind, die erforderliche Perl-Bibliothek installiert und die backupdecrypt.plgegen eine adb-Backup-Datei ausgeführt, und sie in eine tar- oder gezippte tar-Datei ohne irgendwelche konvertiert Ausgabe.

Ich habe sogar einen Einzeiler in Bash 3 erstellt, der es mir ermöglicht, eine Adb-Sicherung direkt in eine gzippte Tar-Datei durchzuführen:

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

Ich hoffe es hilft.

Ja, sie haben das Tool (das Java-Tool) gepackt, das ich geschrieben habe :) Ich habe auch geholfen, das Ding auf Perl zu portieren. Wenn Sie die READMEs nicht gelesen haben, ist es möglicherweise nicht sofort ersichtlich, dass die Beschreibung zuerst kam, dann die Tools ....
Ich habe eine Sicherungskopie erstellt, aber es wurde keine .ab-Datei erstellt, sondern eine .backup-Datei. Ich möchte wissen, wie man es extrahiert. Ich bin mir auch nicht sicher, ob es alle Fotos und Videos als Backup genommen hat?

Um die vorhandene Sicherungsdatei zu durchsuchen, versuchen Sie die Seite http://www.adb-backup.com , es ist einfach ohne "dd", "tar", ...

Auf diesem Server werden keine Daten gespeichert. Ich habe diesen Online-Dienst entwickelt, um das Anzeigen von Backups zu vereinfachen, ohne mit dd / tar zu manipulieren oder zusätzliche Software zu installieren. Ich bin Autor www.adb-backup.com

Ich wäre sehr vorsichtig mit dem Hochladen eines Adb-Backups (und der Angabe des Passworts) auf eine zufällige Website ... Die im Adb-Backup enthaltenen Daten sind privat und Sie haben keine Möglichkeit zu wissen, was die Site mit dem Backup macht. Es könnte harmlos sein, aber ich würde es nicht empfehlen.
Auf diesem Server werden keine Daten gespeichert. Ich habe diesen Online-Dienst entwickelt, um das Anzeigen von Backups zu vereinfachen, ohne mit dd / tar zu manipulieren oder zusätzliche Software zu installieren. Ich bin Autor www.adb-backup.com