Gibt es eine Möglichkeit, in eine von adb backup erstellte Datei zu schauen und diese zu ändern?

40

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. Ich habe adb logcatimmer herausgefunden, was los ist und was 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 der Sicherung wiederherzustellen?

ingorichter
quelle

Antworten:

14

Die Datei wird nicht verschlüsselt, es sei denn, Sie geben dies beim Erstellen der Sicherung an. Es ist jedoch komprimiert (mit Deflate). Das genaue Format können Sie anhand des Quellcodes für Android (com / android / server / BackupManagerService.java) herausfinden. Technisch gesehen sollten Sie in der Lage sein, bestimmte Daten daraus zu extrahieren. Allerdings, IIRC, gibt es einige Dateiintegritätsprüfungen, so dass es höchstwahrscheinlich nicht funktionieren wird, 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.

Nikolay Elenkov
quelle
Vielen Dank! 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.
Ingorichter
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, Iterationsanzahl usw.) werden in den Dateikopf geschrieben. Da Sie das Kennwort kennen, können Sie den Schlüssel ableiten und die Daten entschlüsseln. So ist es immer noch machbar, aber nicht besonders einfach ...
Ja, ich extrahiere derzeit alles aus BackupManagerService, um den Inhalt der Sicherungsdatei zu lesen. Es ist eine Menge Arbeit, aber ich brauche meine Daten zurück ...
ingorichter
@ingorichter irgendwelche Fortschritte?
jon
@ingorichter Ich habe angefangen daran zu arbeiten und eine Menge Notizen unten in einer "Community-Wiki" -Antwort gepostet. Fühlen Sie sich frei, etwas hinzuzufügen.
jon
50

Daran habe ich angefangen zu arbeiten. Ich veröffentliche meine 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 zurückgezogen werde, gibt es Hinweise, damit jemand anderes anfängt zu arbeiten.

 

Die Sicherungslogik auf dem Host ist in der genannten Funktion vollständig in https://github.com/android/platform_system_core/blob/master/adb/commandline.cpp enthalten backup. Die Funktion ist sehr einfach: Sie validiert die Befehlszeilenoptionen, sendet den Befehl zumeist 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 beispielsweise die Sicherung auf dem Telefon ablehnen, adbschreiben Sie einfach eine leere Datei aus.

Am Telefon, startet die Backup - Logik in service_to_fd()in https://github.com/android/platform_system_core/blob/master/adb/services.cpp . Die Funktion "backup"erkennt /system/bin/bu, dass der Befehl vom Host stammt , und übergibt den nicht analysierten Befehl an. Hierbei handelt es sich um ein einfaches Shell-Skript , das com.android.commands.bu.Backupals Hauptklasse eines neuen Android-App-Prozesses gestartet werden soll. Das ruft ServiceManager.getService("backup")auf, um den Sicherungsdienst als abzurufen IBackupManager, und ruft auf IBackupManager.fullBackup()und übergibt ihm den noch nicht verwendeten Dateideskriptor (sehr indirekt), der mit der backup.abDatei auf dem Host verbunden ist.

Die Steuerung geht zu fullBackup()in com.android.server.backup.BackupManagerService , die die GUI dem Benutzer zu bestätigen / verwerfen die Sicherung zu fragen erscheint. Wenn der Benutzer dies tut, wird acknowledgeFullBackupOrRestore()(dieselbe Datei) aufgerufen. Wenn der Benutzer die Anforderung genehmigt hat, stellt er fest acknowledgeFullBackupOrRestore(), ob die Sicherung verschlüsselt ist, und übergibt eine Nachricht an BackupHandler(dieselbe Datei). BackupHandlerAnschließend wird eine Instanz erstellt und gestartet PerformAdbBackupTask( dieselbe Datei, Zeile 4004 zum Zeitpunkt des Schreibens).

Wir beginnen dortPerformAdbBackupTask.run() zwischen Zeile 4151 und Zeile 4330 mit der Ausgabe .

Zuerst run()schreibt einen Header, der von entweder 4 oder 9 ASCII Zeilen besteht:

  1. "ANDROID BACKUP"
  2. die Backup-Format-Version: derzeit "4"
  3. Entweder "0"wenn die Sicherung nicht komprimiert ist oder "1"wenn dies der Fall ist
  4. die Verschlüsselungsmethode: derzeit entweder "none"oder"AES-256"
  5. (falls verschlüsselt), das "Benutzerpasswort Salt" in hexadezimaler Schreibweise, alle Großbuchstaben
  6. (falls verschlüsselt), das in hexadezimaler Schreibweise codierte "Hauptschlüssel-Prüfsummensalz", alle Großbuchstaben
  7. (falls verschlüsselt), die "Anzahl der verwendeten PBKDF2-Runden" als Dezimalzahl: aktuell "10000"
  8. (falls verschlüsselt), die "IV des Benutzerschlüssels" in hexadezimaler Schreibweise mit Großbuchstaben
  9. (falls verschlüsselt), das "Master-IV + -Schlüssel-Blob, verschlüsselt durch den Benutzerschlüssel", hexadezimal codiert, alle Großbuchstaben

Die eigentlichen Sicherungsdaten folgen, entweder als (je nach Kompression 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 im Verzeichnis app / gespeichert, beginnend mit einer _manifest-Datei, der APK (falls angefordert) in einem /, App-Dateien in f /, Datenbanken in db / und gemeinsamen Einstellungen in sp /. Wenn Sie eine externe Speichersicherung angefordert haben (mit der Option -shared), befindet sich im Archiv auch ein freigegebenes Verzeichnis /, 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

Details zur Verschlüsselung

  1. Ein AES 256-Schlüssel wird aus dem Sicherungsverschlüsselungskennwort unter Verwendung von 10000 Runden PBKDF2 mit einem zufällig erzeugten 512-Bit-Salt abgeleitet.
  2. Ein AES 256-Hauptschlüssel wird zufällig generiert
  3. Eine Hauptschlüssel-Prüfsumme wird generiert, indem der Hauptschlüssel durch 10000 Runden von PBKDF2 mit einem neuen, zufällig generierten 512-Bit-Salt ausgeführt wird.
  4. Eine zufällige Sicherungsverschlüsselung IV wird generiert.
  5. Die IV, der Hauptschlüssel und die Prüfsumme werden mit dem in 1 abgeleiteten Schlüssel verknüpft und verschlüsselt. Der resultierende Blob wird im Header als Hex-Zeichenfolge gespeichert.
  6. Die eigentlichen Sicherungsdaten werden mit dem Hauptschlüssel verschlüsselt und an das Dateiende angehängt.

Beispiel für das Packen / Entpacken von Code-Implementierungen (produziert / verwendet) von Tar-Archiven: https://github.com/nelenkov/android-backup-extractor

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

jon
quelle
Wenn Sie den Code irgendwo platzieren, kann ich möglicherweise beitreten. Das OP (@ngorichter) hat wahrscheinlich auch einen funktionierenden Code :) Ein Dienstprogramm, das die eigentlichen Dateien dekomprimiert und extrahiert, könnte nützlich sein, damit Sie nur Teile wiederherstellen können (wenn Sie natürlich root haben).
Nikolay Elenkov
1
Was den Verschlüsselungsteil betrifft, muss ich nach den Details suchen, aber der Schlüssel wird mithilfe von PBKDF2 durch die Salt- und Device-Unlock-PIN, das Passwort oder das Muster (konvertiert in einen String) abgeleitet. Der Hauptschlüssel wird zufällig generiert und mit dem vom Kennwort abgeleiteten Schlüssel verschlüsselt. Lassen Sie es zuerst für unverschlüsselte Archive arbeiten. Ich kann den Entschlüsselungsteil implementieren, wenn Sie Probleme damit haben.
Nikolay Elenkov
Entschuldigung, der Schlüssel wird tatsächlich basierend auf dem Kennwort abgeleitet, das Sie beim Starten der Sicherung angegeben haben.
Nikolay Elenkov
@NikolayElenkov Ich habe noch keinen Code, aber ich plane, ein Dienstprogramm zum Bearbeiten von AB-Dateien zu schreiben. Bei der Verschlüsselung denke ich nicht, dass es schwierig sein wird. Es ist nur so, dass ich nur einen Blick auf diesen Teil des Codes geworfen habe. In ähnlicher Weise habe ich den Codepfad verfolgt (der oben noch nicht geschrieben wurde), der den Teer-Stream generiert, aber noch nicht überprüft, ob das tatsächliche Format GNU-Teer ist.
jon
Wow, ich bin beeindruckt von Ihrer Analyse. Ich habe Code aus BackupManagerService in ein einfaches, fetziges Skript extrahiert, aber wenn ich das Programm ausführe, ist das Ergebnis immer das gleiche: Falsches Passwort eingegeben! Ich habe ein neues Backup mit einem einfachen Passwort erstellt, aber die Passwortüberprüfung ist erneut fehlgeschlagen. Derzeit versuche ich, dem oben beschriebenen Programm zu folgen, um meinen Fehler zu finden.
Ingorichter
7

Tolle und ausführliche Antwort von Nikolay Elenkov . Allerdings sollte ich hinzufügen, dass jemand bereits eine Software entwickelt, die genau das tut, und diese hier verpackt: http://sourceforge.net/projects/adbextractor/

Das Paket enthält sowohl Java als auch Perl. Ich selbst bevorzuge jeden Tag Perl gegenüber Java, also extrahiere ich die Perl-Codes, stelle sicher, dass sie ausführbar sind, installiere die erforderliche Perl-Bibliothek und backupdecrypt.plführe die Datei gegen eine ADB-Sicherungsdatei aus und konvertiere sie in eine tar- oder gzipped-tar-Datei ohne eine Problem.

In Bash 3 habe ich sogar einen Einzeiler erstellt, mit dem ich ein ADB-Backup direkt in eine gezippte TAR-Datei erstellen kann:

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

Ich hoffe es hilft.

SP Arif Sahari Wibowo
quelle
6
Ja, sie haben das Tool (das Java-Tool) gepackt, das ich geschrieben habe :) Ich habe auch geholfen, das Ding nach Perl zu portieren. Wenn Sie die READMEs nicht gelesen haben, ist es möglicherweise nicht sofort ersichtlich, dass zuerst der Bericht und dann die Tools geschrieben wurden ....
Nikolay Elenkov
Ich habe ein Backup erstellt, aber es wurde keine .ab-Datei erstellt, sondern eine .backup-Datei. Ich möchte wissen, wie man es extrahiert. Auch ich bin nicht sicher, ob es alle Fotos und Videos als Backup genommen hat?
Hajirazin
-4

Versuchen Sie zum Durchsuchen der vorhandenen Sicherungsdatei die Seite http://www.adb-backup.com. Ohne "dd", "tar", ... ist dies ganz einfach.

Daten werden nicht auf diesem Server gespeichert. Ich habe diesen Onlinedienst entwickelt, um das Anzeigen von Backups zu vereinfachen, ohne mit dd / tar manipulieren oder zusätzliche Software installieren zu müssen. Ich bin Autor www.adb-backup.com

Liszak
quelle
7
Ich würde sehr vorsichtig sein, wenn ich ein ADB-Backup (und das Passwort) auf eine zufällige Website hochlade ... Die in dem ADB-Backup enthaltenen Daten sind privat und Sie können nicht wissen, was die Site mit dem Backup macht. Es könnte harmlos sein, aber ich würde es nicht empfehlen.
BMDIXON
Laut Metasmoke ist dies eine Spam-URL . Ansonsten stimme ich @bmdixon hier voll und ganz zu - zumal es sichere Wege gibt, die Aufgabe lokal auszuführen.
Izzy
@Izzy Trotzdem habe ich mich als Spam gemeldet und es SmokeDetector gemeldet.
iBug
Daten werden nicht auf diesem Server gespeichert. Ich habe diesen Onlinedienst 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
Liszak