149 votes

Comment extraire les données d'une application à partir d'une sauvegarde complète créée par "adb backup" ?

J'ai sauvegardé mon Nexus 7 avec adb backup pour sauvegarder tous les fichiers dans une sauvegarde cryptée. Je vois que vous pouvez restaurer à partir d'une sauvegarde avec adb restore, mais cela effacerait toutes mes données existantes sur l'appareil.

Comment pourrais-je extraire les données d'une application de ce fichier de sauvegarde crypté?

0 votes

Je crois que aucune des réponses sans utiliser Java ne fonctionnera sur les téléphones chiffrés. Voir ma réponse ci-dessous résumant l'utilisation de l'application de nelenkov (github.com/nelenkov/android-backup-extractor). Malheureusement, les scripts perl Adebar d'Izzy ab2tar ne fonctionneront pas sur les fichiers de sauvegarde chiffrés. Similaire: android.stackexchange.com/questions/23357/…

1 votes

Corrélation- dd if=data.ab bs=1 skip=24 | openssl zlib -d | tar -xvf - mentionné stackoverflow.com/questions/18533567/…

142voto

mercutio Points 5828

Comment extraire les fichiers ab

Il existe un projet open source sous la licence Apache 2.0, écrit par Nikolay Elenkov qui vous permettra d'extraire le fichier .ab dans un fichier tar.

Utilisation:

java -jar abe.jar unpack   

Contexte

Juste pour information des autres, voici quelques informations sur le format de fichier .ab.

Le fichier de sauvegarde Android (*.ab) est un fichier tar compressé. Il est compressé en utilisant l'algorithme DEFLATE. De plus, il peut y avoir un chiffrement AES utilisé. Cela est déterminé lorsque vous créez la sauvegarde, si vous saisissez un mot de passe alors la sauvegarde est chiffrée, sinon; il n'y a pas de chiffrement, c'est seulement compressé.

L'EN-TÊTE du fichier est un peu différent d'une archive DEFLATE normale. Il contient des informations sur la sauvegarde et ressemble à ce qui suit:

ANDROID BACKUP
1
1
none

La première ligne est la ligne "Magic". La ligne suivante est la version du format de fichier de sauvegarde Android. La ligne suivante est un booléen (true ou false, 1 ou 0) indiquant si le fichier est compressé. La dernière ligne est le type de chiffrement. Cet exemple n'utilise aucun chiffrement. S'il y avait un mot de passe, la ligne indiquerait "AES-256". Après cela, le chiffrement DEFLATE "archive" commence.

Il est compressé en utilisant le Java Deflater. Ce qui, du point de vue d'un développeur, pose des problèmes si vous voulez utiliser quelque chose d'autre que Java pour l'extraire. Je n'ai pas été en mesure de trouver quelque chose qui puisse le décompresser en utilisant le même algorithme, même si tout ce que j'ai trouvé (comme pour C#) est censé suivre la "SPEC".

Si vous n'êtes pas sûr de savoir vraiment comment l'utiliser (ce qui dépasse le cadre de cette réponse) Droid Explorer depuis la version 0.8.8.7 (disponible ici) vous permet de le faire exactement cela, et plus, directement depuis l'Explorateur. Vous pouvez en savoir plus sur les fonctionnalités sur mon blog (oui, je sais, auto-promotion. Je le fais quand cela convient à la question)

unpack

4 votes

Je te donnerais un vote positif si j'avais la réputation, mon dieu mec merci!

1 votes

Votre bienvenue. Je connais toutes ces informations parce que c'est une fonctionnalité que j'ai récemment ajoutée à la base de code de Droid Explorer, donc j'ai dû faire des recherches dessus.

0 votes

Salut Ryan, j'ai essayé d'utiliser Droid Explorer mais ça ne démarre pas en se plaignant de l'emplacement du SDK Android, même s'il est installé et que je fournis le bon chemin.

121voto

Kari Points 1111

Ou avec une seule ligne :

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

5 votes

Génial! Avez-vous aussi l'équivalent de "pack" (pour prendre l'arborescence de répertoires non compressée et créer un fichier .db)?

7 votes

Pouvez-vous ajouter une explication à la réponse ?

3 votes

Veuillez traduire ceci en conservant les mêmes balises HTML s'il y en a : CECI est la meilleure réponse :D Fonctionne parfaitement ! Extraction maintenant.

38voto

Priyank Bolia Points 3825

Une autre option est d'utiliser bash, cat et gunzip (gzip).

Le processus complet pourrait être le suivant (avec une sauvegarde non chiffrée) :

  1. sauvegarde des données d'une application (par exemple "Override DNS for KitKat") :

    $ adb backup -f net.mx17.overridedns.ab -noapk net.mx17.overridedns
    Déverrouillez maintenant votre appareil et confirmez l'opération de sauvegarde.
  2. extraire les données compressées

    $ dd if=net.mx17.overridedns.ab bs=1 skip=24 > compressed-data
    1285+0 enregistrements lus
    1285+0 enregistrements écrits
    1285 bytes (1,3 kB) copiés, 0,00745877 s, 172 kB/s
  3. décompresser les données compressées

    $ printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" \
        | cat - compressed-data | gunzip -c > decompressed-data.tar
    gzip: stdin: unexpected end of file
  4. décompresser le fichier tar

    $ tar xf decompressed-data.tar

7 votes

La "fin de fichier inattendue" est-elle à prévoir ?

0 votes

L'extraction en 2 a étonnamment fonctionné sur un fichier crypté. Comment est-ce possible? La décompression a ensuite échoué avec gzip: stdin: données compressées invalides -- format violé. Je suppose que l'extraction a réussi, car dd rapporte 22763821+0 enregistrements dans 22763821+0 enregistrements sorties.

0 votes

@TomRussell L'extraction se contente simplement de supprimer des octets du début.

11voto

TWiStErRob Points 321

Sur la base des informations fournies par d'autres, je sais maintenant que le fichier de sauvegarde est simplement un flux Deflated (GZip) préfixé, sur la base de cette information ce programme simple peut le décompresser pour vous :

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("Fin de fichier inattendue lors du saut de l'en-tête de sauvegarde.");
                }
                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();
        }
    }
}

J'ai écrit ceci car je n'ai aucun des outils Unix mentionnés ci-dessus, et c'était plus facile que d'installer Cygwin ou d'autres outils.

Avantages:

  • multiplateforme
  • simple (aucun paramètre ésotérique)
  • pas besoin d'outils de piping

Inconvénients:

  • besoin d'un JDK (que vous avez probablement déjà car vous manipulez le SDK Android)
  • pas de support pour les sauvegardes cryptées
  • besoin de quelque chose pour extraire le fichier tar résultant (j'utilise Total Commander)

Pour en faire un outil en ligne de commande, créez unab.bat avec le contenu : java -cp "%~dp0." unab %* et ajoutez le répertoire au PATH.

1 votes

C'est en fait une solution assez élégante - vous pouvez voir immédiatement ce que vous faites dans un petit code java. Utilisez simplement java (il est déjà sur votre ordinateur la plupart du temps) : mettez le code ci-dessus dans "unab.java", appelez "javac unab.java" depuis la ligne de commande, puis appelez "java unab VOTREFICHIER.ab" et c'est tout. Merci!

6voto

joe_zeroh Points 61

Comme la question implicite est également "comment restaurer les données d'une seule application", je voudrais mentionner ce script astucieux, qui divise un fichier full-backup.ab donné en fichiers single-app.ab.

Il nécessite ces fichiers jar: abe.jar et tar-bin-split.jar.

Au moins pour mon cas d'essai, cela a fonctionné en utilisant les ressources référencées.

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