53 votes

Existe-t-il un moyen de regarder à l'intérieur et de modifier un fichier créé par adb backup ?

J'ai créé une sauvegarde de mon Galaxy Nexus avec adb backup . Le fichier résultant est nommé backup.db et il est en quelque sorte crypté.

Je voulais restaurer la sauvegarde, mais ça s'arrête au moment de la restauration. com.android.providers.contacts . J'ai utilisé adb logcat pour découvrir ce qui se passe et j'ai découvert que com.android.acore se bloque pendant le processus de restauration.

J'aimerais accéder aux données de la sauvegarde et supprimer la base de données des contacts pour tout restaurer sur mon téléphone. Existe-t-il d'autres moyens de restaurer les données à partir de la sauvegarde ?

0 votes

Je crois qu'aucune des réponses sans utiliser Java ne fonctionnera sur les téléphones cryptés. Voir ma réponse ici : Android.stackexchange.com/a/224474/95893 résumant l'utilisation de l'application de nelenkov (github.com/nelenkov/Android-backup-extractor). Malheureusement, les scripts perl ab2tar d'Adebar d'Izzy ne fonctionneront pas sur les fichiers de sauvegarde chiffrés. Similaire : Android.stackexchange.com/questions/28481/

60voto

UltimateBrent Points 6167

J'ai commencé à travailler sur ce sujet. Je publie mes résultats ici sous forme de réponse "wiki communautaire" pour deux raisons : premièrement, si quelqu'un d'autre veut participer, il y a un endroit pour en parler ; deuxièmement, si je suis retiré de ce projet, il y aura des indices pour que quelqu'un d'autre commence à travailler.

La logique de sauvegarde sur l'hôte est entièrement contenue dans https://github.com/Android/platform_system_core/blob/master/adb/commandline.cpp dans la fonction nommée backup . La fonction est très simple : il valide les options de la ligne de commande, envoie la commande telle quelle au démon adb sur le téléphone, et écrit la sortie du téléphone dans le fichier. Il n'y a même pas de contrôle d'erreur : si, par exemple, vous refusez la sauvegarde sur le téléphone, adb écrit simplement un fichier vide.

Sur le téléphone, la logique de sauvegarde commence dans service_to_fd() en https://github.com/Android/platform_system_core/blob/master/adb/services.cpp . La fonction identifie que la commande de l'hôte est "backup" et transmet la commande non analysée à l'adresse suivante /system/bin/bu qui est un shell trivial script pour lancer com.android.commands.bu.Backup comme classe principale d'un nouveau processus d'application Android. Cela appelle ServiceManager.getService("backup") pour obtenir le service de sauvegarde en tant que IBackupManager et appelle IBackupManager.fullBackup() en lui passant le descripteur de fichier encore inutilisé (de manière très indirecte) connecté à l'extension backup.ab sur l'hôte.

Le contrôle passe à fullBackup() en Service de gestion des sauvegardes com.Android.server.backup.BackupManagerService qui fait apparaître l'interface graphique demandant à l'utilisateur de confirmer ou de rejeter la sauvegarde. Lorsque l'utilisateur le fait, acknowledgeFullBackupOrRestore() (même fichier) est appelé. Si l'utilisateur a approuvé la demande, acknowledgeFullBackupOrRestore() détermine si la sauvegarde est cryptée, et transmet un message à BackupHandler (même dossier.) BackupHandler puis instancie et lance un PerformAdbBackupTask ( même fichier, ligne 4004 au moment de la rédaction)

Nous commençons finalement à générer des sorties à cet endroit, dans PerformAdbBackupTask.run() entre ligne 4151 y ligne 4330 .

D'abord, run() écrit un en-tête, qui consiste en 4 ou 9 lignes ASCII :

  1. "ANDROID BACKUP"
  2. la version du format de sauvegarde : actuellement "4"
  3. soit "0" si la sauvegarde est non compressée ou "1" si c'est le cas
  4. la méthode de cryptage : actuellement soit "none" o "AES-256"
  5. (s'il est crypté), le "sel du mot de passe de l'utilisateur" codé en hexadécimal, tout en majuscules.
  6. (s'il est crypté), le "sel de contrôle de la clé principale" codé en hexadécimal, tout en majuscules.
  7. (s'il est crypté), le "nombre de tours PBKDF2 utilisés" sous forme de nombre décimal : actuellement "10000"
  8. (s'il est crypté), le "IV de la clé utilisateur" codé en hexadécimal, tout en majuscules
  9. (s'il est crypté), le "master IV + key blob, crypté par la clé de l'utilisateur" codé en hexadécimal, tout en majuscules.

Les données de sauvegarde proprement dites suivent, sous forme de (selon la compression et le cryptage) tar , deflate(tar) , encrypt(tar) ou encrypt(deflate(tar)) .

TODO : écrire le chemin de code qui génère la sortie tar -- vous pouvez simplement utiliser tar tant que les entrées sont dans le bon ordre (voir ci-dessous).

Format des archives Tar

Les données de l'application sont stockées dans le répertoire app/, en commençant par un fichier _manifest, l'APK (si demandé) dans a/, les fichiers de l'application dans f/, les bases de données dans db/ et les préférences partagées dans sp/. Si vous avez demandé une sauvegarde de stockage externe (en utilisant l'option -shared), il y aura également un répertoire shared/ dans l'archive contenant les fichiers de stockage externe.

$ 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

Détails du cryptage

  1. Une clé AES 256 est dérivée du mot de passe de cryptage de sauvegarde en utilisant 10000 tours de PBKDF2 avec un sel de 512 bits généré aléatoirement.
  2. Une clé principale AES 256 est générée de façon aléatoire.
  3. Une "somme de contrôle" de la clé principale est générée en faisant passer la clé principale par 10000 cycles de PBKDF2 avec un nouveau sel de 512 bits généré de façon aléatoire.
  4. Un IV de cryptage de sauvegarde aléatoire est généré.
  5. Le IV, la clé principale et la somme de contrôle sont concaténés et chiffrés avec la clé dérivée en 1. Le blob résultant est enregistré dans l'en-tête sous forme de chaîne hexadécimale.
  6. Les données de sauvegarde proprement dites sont cryptées avec la clé principale et ajoutées à la fin du fichier.

Exemple de mise en œuvre du code d'empaquetage/dépaquetage (produit/utilise) des archives tar : https://github.com/nelenkov/Android-backup-extractor

Plus de détails ici : http://nelenkov.blogspot.com/2012/06/unpacking-Android-backups.html

Scripts Perl pour l'empaquetage/dépaquetage et la réparation des archives cassées :

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

0 votes

Si vous mettez le code quelque part, je pourrais peut-être m'inscrire. L'OP (@ngorichter) a probablement du code fonctionnel maintenant aussi :) Un utilitaire qui décompresse et extrait les fichiers réels pourrait être utile, afin que vous puissiez restaurer seulement certaines parties (si vous avez Root bien sûr).

1 votes

En ce qui concerne le cryptage, je dois vérifier les détails, mais la clé est dérivée en utilisant PBKDF2 par le sel et le PIN de déverrouillage du dispositif, le mot de passe ou le modèle (converti en chaîne). La clé principale est générée aléatoirement, et cryptée avec la clé dérivée du mot de passe. Il faut d'abord le faire fonctionner pour les archives non cryptées. Je peux implémenter la partie décryptage si vous avez des problèmes avec elle.

0 votes

Désolé, la clé est en fait dérivée sur la base du mot de passe que vous spécifiez lors du lancement de la sauvegarde.

19voto

Nikolay Elenkov Points 296

Le fichier n'est pas crypté, sauf si vous le spécifiez lors de la création de la sauvegarde. Il est cependant compressé (en utilisant deflate). Vous pouvez découvrir le format exact en consultant le code source d'Android (com/Android/server/BackupManagerService.java) et, techniquement, vous devriez être en mesure d'en extraire des données spécifiques. Cependant, il existe des contrôles d'intégrité des fichiers, ce qui signifie que cela ne fonctionnera probablement pas si vous supprimez simplement un certain nombre de données. Malheureusement, le restore ne semble pas avoir d'option pour restaurer une application/un paquet particulier ou exclure un paquet.

0 votes

Merci ! C'est au moins un point de départ pour regarder à l'intérieur du fichier. Cela aurait été plus facile si je n'avais pas fourni un mot de passe pour la sauvegarde.

0 votes

Si vous avez fourni un mot de passe, il est effectivement crypté. `BackupManagerService' a des détails sur les algorithmes de cryptage réels, et les paramètres de dérivation des clés (sel, nombre d'itérations, etc.) sont écrits dans l'en-tête du fichier. Puisque vous connaissez le mot de passe, vous pouvez dériver la clé et décrypter les données. Donc, c'est encore faisable, mais pas particulièrement facile...

0 votes

Oui, je suis actuellement en train de tout extraire de BackupManagerService pour lire le contenu du fichier de sauvegarde. C'est une bonne quantité de travail, mais j'ai besoin de récupérer mes données...

8voto

Réponse excellente et détaillée de Nikolay Elenkov . Cependant, je dois ajouter que quelqu'un a déjà développé un logiciel qui fait exactement cela et l'a emballé ici : http://sourceforge.net/projects/adbextractor/

Le paquet contient à la fois un outil Java et Perl. Pour ma part, je préfère de loin Perl à Java, j'ai donc extrait les codes Perl, je me suis assuré qu'ils étaient exécutables, j'ai installé la bibliothèque Perl requise et j'ai exécuté le programme backupdecrypt.pl contre un fichier de sauvegarde adb, et il le convertit en un fichier tar ou gzippé sans aucun problème.

J'ai même formé un one liner dans Bash 3 qui me permet de faire une sauvegarde adb directement dans un fichier tar gzippé :

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

J'espère que cela vous aidera.

7 votes

Oui, ils ont emballé l'outil (celui de Java) que j'ai écrit :) J'ai aussi aidé à le porter en Perl. Si vous n'avez pas lu les LISEZMOI, il n'est peut-être pas immédiatement évident que l'écriture est venue en premier, puis les outils.....

0 votes

J'ai fait une sauvegarde mais il n'a pas créé de fichier .ab, mais un fichier .backup. Je veux savoir comment l'extraire. De plus, je ne suis pas sûr qu'il ait pris toutes les photos et vidéos comme sauvegarde ?

-3voto

Liszak Points 9

Pour explorer un fichier de sauvegarde existant, essayez http://www.adb-backup.com page, il est simple sans "dd", "tar", ...

Les données ne sont pas stockées sur ce serveur. J'ai développé ce service en ligne pour faciliter la visualisation des sauvegardes sans manipuler avec dd / tar ou installer des logiciels supplémentaires. Je suis l'auteur www.adb-backup.com

11 votes

Je serais très Attention au téléchargement d'une sauvegarde adb (et à la fourniture du mot de passe) sur un site Web aléatoire... Les données incluses dans la sauvegarde adb sont privées et vous n'avez aucun moyen de savoir ce que le site fait avec la sauvegarde. Cela pourrait être inoffensif mais je ne vous recommande pas de le faire.

0 votes

Selon Metasmoke, c'est une url de spam . En dehors de cela, je suis tout à fait d'accord avec @bmdixon, d'autant plus qu'il existe des moyens sûrs d'effectuer cette tâche localement.

0 votes

@Izzy Quoi qu'il en soit, je l'ai signalé comme spam et signalé à SmokeDetector.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X