Как извлечь данные приложения из полной резервной копии, сделанной с помощью «резервной копии»?

Я поддерживаю свой Nexus 7 с помощью adb backup для резервного копирования всех файлов в зашифрованную резервную копию. Я вижу, что вы можете восстановить из резервной копии с помощью adb restore, но это уничтожит все мои существующие данные на устройстве.

Как именно я извлечу данные одного приложения из этого зашифрованного файла резервной копии?

96 голосов | спросил user11553 30 AM00000030000003031 2012, 03:51:30

6 ответов


99

Просто для справки других, вот какой-то фон в формате .ab.

Файл Android Backup (* .ab) представляет собой сжатый файл TAR , Он сжимается с помощью алгоритма DEFLATE . Кроме того, может использоваться шифрование AES . Это определяется при создании резервной копии, если вы вводите пароль, тогда резервная копия зашифровывается, в противном случае; нет шифрования, он только сжат.

HEADER файла немного отличается от обычного архива DEFLATE. Он содержит информацию о резервном копировании и выглядит следующим образом:

ANDROID BACKUP
1
1
none

Первая строка - строка «Магия» . Следующая строка - это версия формата файла Android Backup. Следующая строка - логическая (true или false, 1 или 0), указывающая, сжат ли файл. Последняя строка - тип шифрования. В этом примере не используется шифрование. Если бы был пароль, строка читала бы «AES-256». После этого шифр шифрования. Если пароль отсутствует, начинается «архив» DEFLATE.

Он сжимается с помощью Java Deflater . Что, с точки зрения разработчиков, вызывает проблемы, если вы хотите использовать что-либо помимо Java, чтобы извлечь его. Я не смог найти ничего, что могло бы сдуть его, используя тот же алгоритм, хотя все, что я нашел (например, C #), должно следовать за «SPEC».

С учетом этого существует проект с открытым исходным кодом под лицензией Apache 2.0, написанный Николаем Еленковым , который позволит вам извлечь .ab в tar-файл.

Использование:

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

Если вы не знаете, как реально использовать это (что выходит за рамки этого ответа), следующая версия Droid Explorer v0.8.8.7 ( доступно здесь ) позволит вам сделать именно это, и больше, прямо от Проводника. Подробнее о функциях можно узнать на странице мой блог (да, я знаю, бесстыдный плагин. Я делаю это, когда он подходит к вопросу)

unpack

ответил Ryan Conrad 30 AM00000050000004531 2012, 05:33:45
74

Или с одним слоем:

( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 backup.ab ) |  tar xfvz -
ответил Kari 27 J000000Sunday14 2014, 16:58:02
28

Еще один вариант - использовать bash, cat и gunzip (gzip).

Полный процесс может быть таким ( с незашифрованной резервной копией ):

  1. резервное копирование данных одного приложения (например, Переопределение DNS для KitKat " ):

    $ adb backup -f net.mx17.overridedns.ab -noapk net.mx17.overridedns
    Now unlock your device and confirm the backup operation.
    
  2. извлечь сжатые данные

    $ 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. распаковать сжатые данные

    $ printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" \
        | cat - compressed-data | gunzip -c > decompressed-data.tar
    gzip: stdin: unexpected end of file
    
  4. "untar" tar-файл

    $ tar xf decompressed-data.tar
    
ответил MaxChinni 12 J0000006Europe/Moscow 2014, 14:06:24
4

Другим вариантом является использование Perl AdbBackupRoutines из этого потока XDA . У них есть несколько требований: Perl, очевидно, плюс libterm-readkey-perl, libcrypt-cbc-perl и libcrypt-pbkdf2-perl (если ваши резервные копии не зашифрованы, вы можете пропустить последнюю зависимость, просто прокомментировав строку 103 из backupdecrypt.pl, где она включена - работала отлично для меня).

Использование довольно просто:

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

Полученный файл .tar затем может быть исследован как любой другой архив. Его структура довольно интересна, по крайней мере, по одному аспекту: она не отражает реальные пути, из которых были взяты файлы (например, не /data/data/com.app.name/databases/whatever.db, но вместо этого apps/com.app.name/db/whatever.db) - указывает, что резервное копирование приложения на одном устройстве /ROM может быть восстановлено до любое другое устройство /ПЗУ без проблем, так как adb restore должен определить реальные пути.

ответил Izzy 24 MarpmSun, 24 Mar 2013 15:59:29 +04002013-03-24T15:59:29+04:0003 2013, 15:59:29
2

Основываясь на информации других пользователей, теперь я знаю, что файл резервной копии представляет собой только префиксный поток Deflated (GZip), основанный на этой информации, эта простая программа может распаковать его для вас:

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

Я написал это, потому что у меня нет ни одного из упомянутых выше инструментов Unix, и это было проще, чем установка Cygwin или других инструментов.

Преимущества :

  • кросс-платформенный
  • простой (без эзотерических параметров)
  • нет необходимости в инструментах для трубопроводов

Недостатки

  • нужен JDK (которого вы, вероятно, уже имеете, потому что вы возитесь с Android SDK)
  • нет поддержки зашифрованных резервных копий
  • нужно что-то извлечь из полученного tar-файла (я использую Total Commander)

Чтобы сделать это инструментом командной строки, создайте unab.bat с содержимым: java -cp "%~dp0." unab %* и каталог PATH.

ответил TWiStErRob 27 PMpWed, 27 Apr 2016 20:37:02 +030037Wednesday 2016, 20:37:02
1

Как и в неявном вопросе, как восстановить данные отдельных приложений, я хотел бы упомянуть этот отличный скрипт, который разбивает данный full-backup.ab в файлах с одним-app.ab:

https://sourceforge.net/projects/adb-split/

для этого требуются файлы jar: abe.jar и tar-bin-split.jar который можно найти здесь:

sourceforge.net/projects/adbextractor/files/
sourceforge.net/projects/tar-binary-splitter/files/

(не может размещать более двух ссылок ... arrg)

Он работал, по крайней мере, для моей тестовой версии.

ответил joe_zeroh 19 +03002016-10-19T01:31:14+03:00312016bEurope/MoscowWed, 19 Oct 2016 01:31:14 +0300 2016, 01:31:14

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132