Bir Uygulamanın verilerini “adb yedekleme” ile yapılan tam bir yedeklemeden nasıl ayıklayabilirsiniz?


117

adb backupTüm dosyaları şifrelenmiş bir yedeklemeye yedeklemek için Nexus 7 cihazımı yedeklemekteyim. Bir yedekten geri yükleyebileceğinizi görüyorum adb restore, ancak bu, cihazdaki mevcut verilerimi siler.

Bir Uygulamanın verilerini bu şifrelenmiş yedek dosyadan tam olarak nasıl çıkarabilirim?


Yanıtlar:


113

Sadece başkalarının referansı için, burada .ab dosya biçiminde bazı arka plan.

Android Yedekleme (* .ab) dosyası sıkıştırılmış bir TAR dosyasıdır. DEFLATE algoritması kullanılarak sıkıştırılmıştır . Bunun üzerine, kullanılan AES şifreleme olabilir . Bu, yedeği oluştururken belirlenir, eğer bir şifre girerseniz, yedek şifre şifrelenir; şifreleme yoktur, sadece sıkıştırılmıştır.

Dosyanın HEADER'i normal bir DEFLATE arşivinden biraz farklıdır. Yedekleme hakkında bilgi içerir ve aşağıdakine benzer:

ANDROID BACKUP
1
1
none

İlk satır "Sihirli" satırdır . Bir sonraki satır, Android Yedekleme dosya biçiminin sürümüdür. Sonraki satır, dosyanın sıkıştırılıp sıkıştırılmadığını belirten bir booleandır (doğru veya yanlış, 1 veya 0). Son satır şifreleme türüdür. Bu örnek herhangi bir şifreleme kullanmıyor. Bir şifre olsaydı, satır "AES-256" yazardı. Bundan sonra şifreleme şifresidir. Şifre yoksa, DEFLATE "arşiv" başlar.

Java Deflater kullanılarak sıkıştırılmıştır . Geliştiricilerin bakış açısından, Java'dan başka bir şeyi ayıklamak için kullanmak istiyorsanız sorunlara neden olur. Tüm algoritmaları (C # gibi) "SPEC" i izlemem gerekiyor olsa bile, aynı algoritmayı kullanarak onu çözebilecek bir şey bulamadım.

Bununla birlikte , Apache 2.0 lisansı altında, Nikolay Elenkov tarafından yazılan .ab dosyasını bir tar dosyasına çıkarmanızı sağlayacak açık bir proje var .

Kullanımı:

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

Bunu gerçekten nasıl kullanacağınızdan emin değilseniz (bu cevabın kapsamı dışındadır), Droid Explorer v0.8.8.7'nin bir sonraki sürümü ( burada bulunur ) tam olarak bunu ve daha fazlasını tam Explorer'dan yapmanıza izin verecektir. Blogumdaki özellikler hakkında daha fazla bilgi edinebilirsiniz (evet, biliyorum, utanmaz eklenti. Soruya uyduğunda bunu yaparım)

açmak


1
Şöhretim olsaydı sana oy verirdim, aman tanrım teşekkürler!

rica ederim. Tüm bu bilgileri biliyorum çünkü bu, yakın zamanda Droid Explorer kod tabanına eklediğim bir özellik, bu yüzden biraz araştırma yapmak zorunda kaldım.
Ryan Conrad

Merhaba Ryan, Droid Explorer'ı kullanmayı denedi, ancak yüklü olmasına rağmen doğru yolu sağladığım için Android SDK konumu hakkında şikayet etmeye başlayamıyor.
Umar Farooq Khawaja

@UmarFarooqKhawaja Droid explorer ile ilgili SSS bölümüne göz atın . Son soru-cevap sorununuzu giderir.
Ryan Conrad

Tamam, tar 'dan ilgili' com.app.name 'klasörünü çıkardım, ancak uygulama verilerini geri yüklemek için bunu nasıl kullanırım? Sadece klasörü sdcard / Android / data / dizinine kopyalamak işe yaramıyor ...
pelms 0

91

Veya bir astar ile:

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

2
Güzel! Ayrıca "pack" eşdeğeri var mı (sıkıştırılmamış dizin ağacını almak ve bir .db dosyası oluşturmak için)?
dailyglen

4
Cevabınıza bir açıklama ekler misiniz?
Lucky,

2
BU en iyi cevaptır: D Mükemmel çalışıyor! Şimdi ayıklanıyor.
xdevs23

16
Açıklama: yazar için standart Zlib dosya başlığını oluşturur .tar.gzkayıtlarında printf(komutuyla 0x1F 0x8B, bir imzadır 0x08sıkıştırma yöntemidir, 0x00olan bayrak ve 4 x 0x00damgası olan), daha sonra bu başlığa içeriğini ekler backup.abofset 25d başlayarak dosyanın. Böyle bir akış geçerli bir .tar.gzdosyadır ve tar xfvzkomut onu böyle tanır, böylece akışı başarıyla açabilir.
antonone

3
Adb 1.0.36 (Revizyon 1.7.0.0 + r33-2) ile yedekleme yaptım ve bu yöntem zgip'den bir hata üretti:invalid compressed data--format violated
Rache

31

Bir daha seçenek kullanmaktır bash, catve gunzip( gzip).

Tam işlem bu olabilir ( şifrelenmemiş bir yedeklemeyle ):

  1. bir uygulamanın verilerini yedekle (örneğin " KitKat için DNS'yi geçersiz kıl "):

    $ adb backup -f net.mx17.overridedns.ab -noapk net.mx17.overridedns
    Now unlock your device and confirm the backup operation.
    
  2. sıkıştırılmış veriyi çıkart

    $ 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. sıkıştırılmış veriyi açmak

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

    $ tar xf decompressed-data.tar
    

4
"Beklenmeyen dosya sonu" bekleniyor mu?
hft

2'deki ekstraksiyon şaşırtıcı bir şekilde şifreli bir dosya üzerinde çalışmıştır. Bu nasıl mümkün olabilir? Dekompresyon daha sonra başarısız oldu gzip: stdin: invalid compressed data--format violated. Çıkarma işleminin ddrapor olarak başarılı olduğunu varsayıyorum 22763821+0 records in 22763821+0 records out.
Tom Russell,

4

Başka bir seçenek bu XDA dizisinden Perl AdbBackupRoutines kullanıyor . Gerçi birkaç gereksinimleri var: Açıkçası Perl, artı libterm-readkey-perl, libcrypt-cbc-perlve libcrypt-pbkdf2-perl(yedeklemeleriniz şifrelenmemişse, son bağımlılığı atladığınız satır 103'ü yorumlayarak geçebilirsiniz backupdecrypt.pl- benim için iyi çalıştı).

Kullanımı oldukça kolaydır:

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

Sonuçta ortaya çıkan .tardosya diğer tarballlar gibi incelenebilir. Onun yapısı, en azından bir açıdan oldukça ilginç: o dosyalarından alınmıştır gerçek yolları yansıtmamaktadır (örn değil /data/data/com.app.name/databases/whatever.db, ancak bunun yerine apps/com.app.name/db/whatever.db) - bir cihazda bir uygulama yedeklenen belirten / ROM olabilir restore edilecek adb restoreAsıl yolları kendisi bulmak zorunda olduğu gibi, herhangi bir sorun olmadan başka bir cihaz / ROM .


Bunu yapan başka bir araç var (biraz daha iyi korunur): github.com/nelenkov/android-backup-extractor
lid

Teşekkürler, @lid! Ben de aracıyla biraz kabuk komut dosyası (neredeyse tek liner için) dahil ettik Adebar (ADB yedekleri dönüştürür (Android Cihaz Yedekleme Ve Rapor), .abiçin) .tar.gz:) Arşivleri
Izzy

4

Başkalarının bilgisine dayanarak, şimdi yedek dosyanın yalnızca önceden tanımlanmış bir Sönük (GZip) akış olduğunu biliyorum, bu bilgilere dayanarak bu basit program sizin için açabilir:

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

Bunu yazdım çünkü yukarıda belirtilen Unix araçlarından hiçbirine sahip değilim ve Cygwin ya da diğer araçlardan daha kolaydı.

Avantajları :

  • çapraz platform
  • basit (ezoterik parametre yok)
  • boru aletlerine gerek yok

Dezavantajları :

  • bir JDK'ya ihtiyacınız var (muhtemelen Android SDK ile uğraştığınız için zaten sahip olduğunuz)
  • şifreli yedeklemeler için destek yok
  • Ortaya çıkan tar dosyasını ayıklamak için bir şey lazım (Total Commander kullanıyorum)

Bir komut satırı aracı yapmak için unab.batiçeriğe sahip: java -cp "%~dp0." unab %*ve dizini oluşturun PATH.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.