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, adb
boş 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.Backup
ServiceManager.getService("backup")
IBackupManager
IBackupManager.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 BackupHandler
iletir . 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:
"ANDROID BACKUP"
- yedekleme formatı sürümü: şu anda
"4"
- Ya
"0"
yedekleme sıkıştırılmamış veya eğer "1"
öyle ise
- şifreleme yöntemi: şu anda
"none"
veya"AES-256"
- (şifreli ise), altıgen kodlu "kullanıcı şifresi tuzu", tüm büyük harfler
- (şifrelenmişse), hex, tüm büyük harflerle kodlanmış "ana anahtar sağlama toplamı tuzu"
- (şifrelenmişse), "ondalık sayı olarak kullanılan" PBKDF2 mermi sayısı ":
"10000"
- (şifreli ise) "kullanıcı anahtarının IV'ü" hex ile kodlanmış, tüm büyük harfler
- (ş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ı
- Bir AES 256 anahtarı, rastgele oluşturulmuş 512 bit tuzu ile 10000 tur PBKDF2 kullanılarak yedekleme şifreleme şifresinden türetilir.
- Bir AES 256 ana anahtarı rastgele oluşturulur
- 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.
- Rasgele bir yedek şifreleme IV üretilir.
- 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.
- 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