İçine bakmak ve bir adb yedeği oluşturulan dosyayı değiştirmek için bir yolu var mı?


40

Galaxy Nexus'umun bir yedeğini aldım adb backup. Ortaya çıkan dosya backup.db olarak adlandırılır ve bir şekilde şifrelenir.

Yedeklemeyi geri yüklemek istedim, ancak geri yükleme söz konusu olduğunda durur com.android.providers.contacts. Kullandığım adb logcatoluyor ne olduğunu öğrenmek için ve öğrendim com.android.acoregeri yükleme işlemi sırasında çökme.

Yedeklemedeki verilere erişmek ve her şeyi telefonuma geri yüklemek için rehber veritabanını kaldırmak istiyorum. Verileri yedekten geri almanın başka yolları var mı?

Yanıtlar:


14

Yedek oluştururken belirttiğiniz sürece dosya şifrelenmez. Ancak sıkıştırılır (deflate kullanılarak). Tam formatı Android kaynak (com / android / server / BackupManagerService.java) koduna bakarak öğrenebilirsiniz ve teknik olarak ondan belirli verileri çıkarabilmelisiniz. Bununla birlikte, IIRC, yerinde bazı dosya bütünlüğü kontrolleri vardır, bu nedenle, yalnızca ondan bir demet veriyi silerseniz büyük olasılıkla işe yaramaz. Maalesef, restorekomut yalnızca belirli bir uygulamayı / paketi geri yükleme veya bir paketi dışlama seçeneğine sahip görünmüyor.


Teşekkürler! Bu en azından dosyanın içine bakmak için bir başlangıç ​​noktası. Yedekleme için bir şifre vermeseydim daha kolay olurdu.
ingorichter

Bir şifre girmişseniz, gerçekten şifrelenir. 'BackupManagerService', gerçek şifreleme algoritmaları hakkında ayrıntılı bilgi verir ve anahtar türetme parametreleri (tuz, yineleme sayısı vb.) Dosya başlığına yazılır. Şifreyi bildiğinizden, anahtarı türetebilir ve verilerin şifresini çözebilirsiniz. Bu yüzden hala yapılabilir, ancak özellikle kolay değil ...

Evet, şu anda BackupManagerServiceyedekleme dosyasının içeriğini okumak için her şeyi ayıkladım. Çok iyi bir iş, ancak verilerime geri ihtiyacım var ...
ingorichter

@ingorichter herhangi bir gelişme var mı?
jon

@ingorichter Bu konuda çalışmaya başladım ve "topluluk wiki" cevabında aşağıda bir ton not yazdım. Eklemek için çekinmeyin.
jon

50

Bunun üzerinde çalışmaya başladım. Sonuçlarımı şimdiye kadar iki nedenden dolayı "topluluk wiki" yanıtı olarak gönderiyorum: birincisi, katılmak isteyen biri varsa, konuşacak bir yer var; ikincisi, bu projeden ayrılırsam başkasının çalışmaya başlaması için ipuçları olacak.

 

Ana bilgisayardaki yedekleme mantığı tamamen https://github.com/android/platform_system_core/blob/master/adb/commandline.cpp içinde adlandırılan işlevde bulunur backup. İşlev çok basittir: komut satırı seçeneklerini doğrular, komutu çoğunlukla telefondaki adbemonuna gönderir ve telefonun çıkışını dosyaya yazar. Hata denetimi bile yok: örneğin, telefondaki yedeklemeyi reddederseniz, adbboş bir dosya yazar.

Telefonda, yedekleme mantığı başlar service_to_fd()içinde https://github.com/android/platform_system_core/blob/master/adb/services.cpp . İşlev, ana bilgisayardan gelen komutun tanımını yapar "backup"ve yeni bir Android uygulaması işleminin ana sınıfı olarak başlatılacak önemsiz bir kabuk betiği/system/bin/bu olan ayrıştırılmamış komutu iletir . Bu , yedekleme hizmetini bir olarak almak için çağırır ve hala kullanılmayan dosya tanımlayıcısını (çok dolaylı olarak) ana bilgisayardaki dosyaya bağlı olarak çağırır .com.android.commands.bu.BackupServiceManager.getService("backup")IBackupManagerIBackupManager.fullBackup()backup.ab

Denetim fullBackup(), GUI'den kullanıcıdan yedeklemeyi onaylamasını / reddetmesini isteyen, com.android.server.backup.BackupManagerService'e geçer . Kullanıcı bunu yaptığında acknowledgeFullBackupOrRestore()(aynı dosya) çağrılır. Kullanıcı isteği acknowledgeFullBackupOrRestore()onaylarsa, yedeklemenin şifrelenip şifrelenmediğini anlar ve BackupHandler(aynı dosyaya) bir mesaj BackupHandleriletir . Daha sonra başlatır ve başlatır PerformAdbBackupTask( aynı dosya, 4004 numaralı satırda yazılır )

SonundaPerformAdbBackupTask.run() , satır 4151 ile satır 4330 arasında çıktı üretmeye başlıyoruz .

İlk olarak, run()4 veya 9 ASCII satırından oluşan bir başlık yazar:

  1. "ANDROID BACKUP"
  2. yedekleme formatı sürümü: şu anda "4"
  3. Ya "0"yedekleme sıkıştırılmamış veya eğer "1"öyle ise
  4. şifreleme yöntemi: şu anda "none"veya"AES-256"
  5. (şifreli ise), altıgen kodlu "kullanıcı şifresi tuzu", tüm büyük harfler
  6. (şifrelenmişse), hex, tüm büyük harflerle kodlanmış "ana anahtar sağlama toplamı tuzu"
  7. (şifrelenmişse), "ondalık sayı olarak kullanılan" PBKDF2 mermi sayısı ": "10000"
  8. (şifreli ise) "kullanıcı anahtarının IV'ü" hex ile kodlanmış, tüm büyük harfler
  9. (şifrelenmişse), hex, tüm büyük harflerle kodlanmış "kullanıcı anahtarı tarafından şifrelenmiş" ana IV + anahtar bloğu "

Gerçek veri yedekleme (sıkıştırma ve şifreleme bağlı olarak), ya da aşağıdaki tar, deflate(tar), encrypt(tar)ya da encrypt(deflate(tar)).

 

TODO : tar çıktısını üreten kod yolunu yazın - girdiler uygun sırada olduğu sürece sadece tar kullanabilirsiniz (aşağıya bakınız).

Tar arşiv formatı

Uygulama verileri, uygulama / dizin altında depolanır, _manifest dosyası, a / 'daki APK (istenirse), f /' daki uygulama dosyaları, db / 'deki veritabanları ve sp /' de paylaşılan tercihler. Harici depolama yedeklemesi istediyseniz (-shared seçeneğini kullanarak), arşivde harici depolama dosyaları içeren bir paylaşılan / dizin olacaktır.

$ 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

Şifreleme detayları

  1. Bir AES 256 anahtarı, rastgele oluşturulmuş 512 bit tuzu ile 10000 tur PBKDF2 kullanılarak yedekleme şifreleme şifresinden türetilir.
  2. Bir AES 256 ana anahtarı rastgele oluşturulur
  3. Ana anahtar, 10000 tur PBKDF2 boyunca rastgele oluşturulmuş yeni bir 512 bit tuzla çalıştırılarak bir ana anahtar 'sağlama toplamı' oluşturulur.
  4. Rasgele bir yedek şifreleme IV üretilir.
  5. IV, ana anahtar ve sağlama toplamı, 1'de türetilen anahtarla birleştirilir ve şifrelenir. Sonuçta ortaya çıkan blob, başlıkta onaltılık bir dize olarak kaydedilir.
  6. Gerçek yedekleme verileri ana anahtarla şifrelenir ve dosyanın sonuna eklenir.

Örnek paket / paket açma kodu uygulaması (üretir / kullanır) tar arşivleri: https://github.com/nelenkov/android-backup-extractor

Burada daha fazla detay: http://nelenkov.blogspot.com/2012/06/unpacking-android-backups.html

Kırık arşivleri paketlemek / açmak ve düzeltmek için perl scriptleri:

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


Kodu bir yere koyarsanız, katılabilirim. OP (@ngorichter) muhtemelen şu ana kadar bazı çalışma kodlarına da sahiptir :) Asıl dosyaları açan ve ayıklayan bir yardımcı program yararlı olabilir, böylece yalnızca bölümleri geri yükleyebilirsiniz (tabii kökünüz varsa).
Nikolay Elenkov

1
Şifreleme bölümüne gelince, ayrıntılara bakmak zorundayım, ancak anahtar tuz ve cihazın kilidini açma PIN, parola veya kalıp (dizgiye dönüştürülmüş) PBKDF2 kullanılarak türetildi. Ana anahtar rastgele oluşturulur ve parola türetilmiş anahtarla şifrelenir. Önce şifrelenmemiş arşivlerde çalışmasını sağlayın. Bununla ilgili sorun yaşıyorsanız şifre çözme bölümünü uygulayabilirim.
Nikolay Elenkov

Maalesef, anahtar aslında yedeği başlatırken belirlediğiniz parola temelinde türetilmiş.
Nikolay Elenkov,

@NikolayElenkov Henüz bir kodum yok, ancak ab dosyalarını işlemek için bir yardımcı program yazmayı planlıyorum. Wrt şifreleme, zor olacağını sanmıyorum; sadece kodun sadece o bölümüne göz attım. Benzer şekilde, tar akışını oluşturan kod yolunu (henüz yukarıda yazılmamış) izledim, ancak asıl formatın GNU tar olduğunu kontrol etmedim.
Jon,

Vay, analizinden etkilendim. Bazı kodları BackupManagerService'den basit bir groovy betiğine aldım, ancak programı çalıştırdığımda sonuç hep aynı: yanlış şifre girildi! Basit bir şifre ile yeni bir yedekleme oluşturdum, ancak şifre doğrulama tekrar başarısız oldu. Şu anda hatamı bulmak için programı yukarıda açıklandığı gibi izlemeye çalışıyorum.
ingorichter

7

Nikolay Elenkov'dan harika ve ayrıntılı cevap . Ancak birisinin zaten bunu yapan ve burada paketleyen bir yazılım geliştirdiğini eklemeliyim: http://sourceforge.net/projects/adbextractor/

Paket hem Java hem de Perl aracı içerir. Ben her gün Java'dan Perl'i tercih ediyorum, bu yüzden Perl kodlarını çıkarttım, çalıştırılabilir olduklarından emin olun, gerekli Perl kütüphanesini yükledim ve backupdecrypt.pladb yedekleme dosyasına karşı çalıştırdım ve herhangi bir özelliği olmadan bir tar veya gzipped tar dosyasına dönüştürdüm. konu.

Bash 3'te doğrudan gzipped tar dosyasına adb yedeklemesi yapmama izin veren bir astar bile kurdum:

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

Umarım yardımcı olur.


6
Evet, aracı paketlediler (Java olanı). Yazdım :) Ben de Perl'e olan şeyin taşınmasına yardım ettim. Eğer README'leri okumadıysanız, yazımın ilk geldiği hemen anlaşılmayabilirdi, sonra araçlar ....
Nikolay Elenkov

Yedek aldım ancak .ab dosyası yaratmadı, bunun yerine .backup dosyası yarattı. Nasıl çıkarılacağını bilmek istiyorum. Ayrıca tüm fotoğrafların ve videoların yedeklenip çekilmediğinden emin değilim?
hajirazin

-4

Mevcut yedekleme dosyasını araştırmak için http://www.adb-backup.com sayfasını deneyin , "dd", "tar", ...

Veriler bu sunucuda depolanmadı. Bu çevrimiçi hizmeti, dd / tar ile işlem yapmadan veya ek yazılım yüklemeden yedeklemeleri daha kolay görebilmek için geliştirdim. Ben yazarım www.adb-backup.com


7
Rastgele bir web sitesine bir adb yedekleme (ve şifreyi sağlama) yükleme konusunda çok dikkatli olurdum ... Adb yedeğinde yer alan veriler özeldir ve sitenin yedeklemeyle ne yaptığını bilmenin hiçbir yolu yoktur. Zararsız olabilir ama bunu yapmayı tavsiye etmem.
bmdixon

Metasmoke'ye göre, bu bir spam URL'si . Bunun haricinde, burada @ bmdixon ile tamamen aynı fikirdeyim - özellikle yerel olarak güvenli yollar mevcut olduğu için görevi yerine getirin.
Izzy

@Izzy Neyse spam olarak işaretlendi ve SmokeDetector'e bildirdim.
iBug

Veriler bu sunucuda saklanmadı. Bu çevrimiçi hizmeti, dd / tar ile işlem yapmadan veya ek yazılım yüklemeden yedeklemeleri daha kolay görebilmek için geliştirdim. Ben yazarım www.adb-backup.com
Liszak
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.