Apakah ada cara untuk melihat ke dalam dan memodifikasi file cadangan yang dibuat adb?

40

Saya membuat cadangan Galaxy Nexus saya dengan adb backup. File yang dihasilkan bernama backup.db dan entah bagaimana dienkripsi.

Saya ingin mengembalikan cadangan, tetapi berhenti ketika harus memulihkan com.android.providers.contacts. Saya biasa adb logcatmencari tahu apa yang terjadi dan menemukan bahwa com.android.acorecrash selama proses pemulihan.

Saya ingin mendapatkan akses ke data dalam cadangan dan menghapus basis data kontak untuk mengembalikan semuanya ke telepon saya. Apakah ada cara lain memulihkan data dari cadangan?

Ingorichter
sumber

Jawaban:

14

File tidak dienkripsi, kecuali jika Anda menentukannya saat membuat cadangan. Namun dikompresi (menggunakan deflate). Anda dapat mengetahui format yang tepat dengan melihat kode sumber Android (com / android / server / BackupManagerService.java), dan, secara teknis, harus dapat mengekstraksi data tertentu darinya. Namun, IIRC, ada beberapa pemeriksaan integritas file di tempat, jadi kemungkinan besar tidak akan berfungsi jika Anda hanya menghapus banyak data dari itu. Sayangnya restoreperintah tersebut tampaknya tidak memiliki opsi untuk mengembalikan aplikasi / paket tertentu saja atau mengecualikan paket.

Nikolay Elenkov
sumber
Terima kasih! Setidaknya itulah titik awal untuk melihat ke dalam file. Akan lebih mudah jika saya tidak memberikan kata sandi untuk cadangan.
ingorichter
Jika Anda memberikan kata sandi, itu memang dienkripsi. `BackupManagerService 'memiliki perincian tentang algoritma enkripsi yang sebenarnya, dan parameter derivasi kunci (garam, jumlah iterasi dll) ditulis dalam header file. Karena Anda mengetahui kata sandi, Anda dapat memperoleh kunci dan mendekripsi data. Jadi masih bisa dilakukan, tetapi tidak terlalu mudah ...
Ya, saya saat ini mengekstraksi mulai dari BackupManagerServicemembaca konten file cadangan. Ini pekerjaan yang bagus, tapi saya perlu data saya kembali ...
ingorichter
@ingorichter ada kemajuan?
jon
@ingorichter Saya mulai mengerjakan ini dan memposting satu ton catatan di bawah, dalam jawaban "komunitas wiki". Jangan ragu untuk menambahkannya.
jon
50

Saya mulai mengerjakan ini. Saya memposting hasil saya sejauh ini di sini sebagai jawaban "komunitas wiki" karena dua alasan: pertama, jika orang lain ingin bergabung, ada tempat untuk berbicara; kedua, jika saya ditarik dari proyek ini, akan ada petunjuk bagi orang lain untuk mulai bekerja.

 

Logika cadangan pada host sepenuhnya terkandung dalam https://github.com/android/platform_system_core/blob/master/adb/commandline.cpp , dalam fungsi yang bernama backup. Fungsi ini sangat sederhana: memvalidasi opsi baris perintah, mengirim perintah sebagian besar apa adanya ke adb daemon di telepon, dan menulis output telepon ke file. Bahkan tidak ada pengecekan kesalahan: jika, misalnya, Anda menolak cadangan di telepon, adbcukup tuliskan file kosong.

Di telepon, logika cadangan dimulai service_to_fd()di https://github.com/android/platform_system_core/blob/master/adb/services.cpp . Fungsi ini mengidentifikasi bahwa perintah dari tuan rumah adalah "backup", dan meneruskan perintah yang tidak diuraikan ke /system/bin/bu, yang merupakan skrip shell sepele untuk diluncurkan com.android.commands.bu.Backupsebagai kelas utama dari proses aplikasi Android baru. Itu panggilan ServiceManager.getService("backup")untuk mendapatkan layanan cadangan sebagai IBackupManager, dan panggilan IBackupManager.fullBackup(), melewati itu deskriptor file yang masih tidak digunakan (sangat tidak langsung) terhubung ke backup.abfile di host.

Kontrol berpindah ke fullBackup()dalam com.android.server.backup.BackupManagerService , yang muncul pada GUI yang meminta pengguna untuk mengonfirmasi / menolak cadangan. Ketika pengguna melakukannya, acknowledgeFullBackupOrRestore()(file yang sama) dipanggil. Jika pengguna menyetujui permintaan tersebut, mencari acknowledgeFullBackupOrRestore()tahu apakah cadangan dienkripsi, dan meneruskan pesan ke BackupHandler(file yang sama.) BackupHandlerKemudian instantiate dan memulai PerformAdbBackupTask( file yang sama, baris 4004 pada saat penulisan)

Kami akhirnya mulai menghasilkan output di sana, diPerformAdbBackupTask.run() , antara baris 4151 dan baris 4330 .

Pertama, run()tulis header, yang terdiri dari 4 atau 9 baris ASCII:

  1. "ANDROID BACKUP"
  2. versi format cadangan: saat ini "4"
  3. baik "0"jika cadangan tidak terkompresi atau "1"jika itu
  4. metode enkripsi: saat ini "none"atau"AES-256"
  5. (jika dienkripsi), "garam kata sandi pengguna" disandikan dalam hex, semuanya huruf besar
  6. (jika dienkripsi), "master checksum salt" dikodekan dalam hex, semuanya caps
  7. (jika dienkripsi), "jumlah putaran PBKDF2 digunakan" sebagai angka desimal: saat ini "10000"
  8. (jika dienkripsi), "IV kunci pengguna" dikodekan dalam hex, semua huruf besar
  9. (jika dienkripsi), "master IV + gumpalan kunci, dienkripsi oleh kunci pengguna" dikodekan dalam hex, semua huruf besar

Backup data aktual berikut, baik sebagai (tergantung pada kompresi dan enkripsi) tar, deflate(tar), encrypt(tar), atau encrypt(deflate(tar)).

 

TODO : tulis jalur kode yang menghasilkan keluaran tar - Anda bisa menggunakan tar selama entri berada dalam urutan yang benar (lihat di bawah).

Format arsip tar

Data aplikasi disimpan di bawah direktori app /, dimulai dengan file _manifest, APK (jika diminta) di file a, file aplikasi di f /, database di db / dan preferensi bersama di sp /. Jika Anda meminta cadangan penyimpanan eksternal (menggunakan opsi-shared), juga akan ada direktori / shared dalam arsip yang berisi file penyimpanan eksternal.

$ 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

Detail enkripsi

  1. Kunci AES 256 berasal dari kata sandi enkripsi cadangan menggunakan 10000 putaran PBKDF2 dengan garam 512 bit yang dihasilkan secara acak.
  2. Kunci master AES 256 dibuat secara acak
  3. Kunci master 'checksum' dihasilkan dengan menjalankan kunci utama melalui 10.000 putaran PBKDF2 dengan garam 512 bit baru yang dihasilkan secara acak.
  4. Enkripsi cadangan acak IV dibuat.
  5. IV, kunci utama, dan checksum disatukan dan dienkripsi dengan kunci yang diturunkan dalam 1. Gumpalan yang dihasilkan disimpan di header sebagai string hex.
  6. Data cadangan aktual dienkripsi dengan kunci master dan ditambahkan ke akhir file.

Contoh paket / unpack implementasi kode (menghasilkan / menggunakan) arsip tar: https://github.com/nelenkov/android-backup-extractor

Beberapa detail lebih lanjut di sini: http://nelenkov.blogspot.com/2012/06/unpacking-android-backups.html

Skrip Perl untuk mengemas / membongkar dan memperbaiki arsip yang rusak:

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

jon
sumber
Jika Anda meletakkan kode di suatu tempat, saya mungkin bisa bergabung. OP (@ngorichter) mungkin memiliki beberapa kode yang bekerja sekarang juga :) Utilitas yang mendekompresi dan mengekstrak file yang sebenarnya mungkin berguna, sehingga Anda dapat mengembalikan hanya bagian (jika Anda memiliki root tentu saja).
Nikolay Elenkov
1
Sedangkan untuk bagian enkripsi, saya harus mencarinya untuk detail, tetapi kuncinya diturunkan menggunakan PBKDF2 oleh garam dan PIN membuka kunci perangkat, kata sandi atau pola (dikonversi ke string). Kunci master dibuat secara acak, dan dienkripsi dengan kunci yang diturunkan kata sandi. Dapatkan bekerja untuk arsip yang tidak dienkripsi terlebih dahulu. Saya dapat mengimplementasikan bagian dekripsi jika Anda mengalami masalah dengannya.
Nikolay Elenkov
Maaf, kunci sebenarnya diturunkan berdasarkan kata sandi yang Anda tentukan saat memulai pencadangan.
Nikolay Elenkov
@NikolayElenkov Saya belum memiliki kode apa pun, tetapi saya berencana untuk menulis utilitas untuk memanipulasi file ab. Enkripsi Wrt, saya tidak berpikir itu akan sulit; hanya saja saya hanya melirik bagian kode itu. Demikian pula, saya telah melacak jalur kode (belum ditulis di atas) yang menghasilkan aliran tar, tetapi belum memeriksa bahwa format sebenarnya adalah tar GNU.
jon
Wow, saya terkesan dengan analisis Anda. Saya mengekstrak beberapa kode dari BackupManagerService menjadi skrip asyik yang sederhana, tetapi ketika saya menjalankan program hasilnya selalu sama: salah memasukkan kata sandi! Saya membuat cadangan baru dengan kata sandi sederhana, tetapi verifikasi kata sandi gagal lagi. Saat ini saya mencoba mengikuti program seperti dijelaskan di atas untuk menemukan kesalahan saya.
ingorichter
7

Jawaban yang bagus dan terperinci dari Nikolay Elenkov . Namun saya harus menambahkan bahwa seseorang sudah mengembangkan perangkat lunak yang melakukan hal itu dan mengemasnya di sini: http://sourceforge.net/projects/adbextractor/

Paket berisi alat Java dan Perl. Saya sendiri lebih suka Perl daripada Java kapan saja, jadi saya mengekstrak kode Perl, memastikan mereka dapat dieksekusi, menginstal pustaka Perl yang diperlukan, dan menjalankan backupdecrypt.plfile cadangan adb, dan mengubahnya menjadi file tar atau gzipped tar tanpa isu.

Saya bahkan membentuk satu liner di Bash 3 yang memungkinkan saya melakukan backup adb langsung ke file tar gzipped:

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

Semoga ini bisa membantu.

SP Arif Sahari Wibowo
sumber
6
Ya, mereka mengemas alat (yang Java) saya tulis :) Saya juga membantu port hal itu ke Perl. Jika Anda tidak membaca READMEs, mungkin tidak akan segera terlihat bahwa luncuran pertama, lalu alat ....
Nikolay Elenkov
Saya telah mengambil cadangan tetapi belum membuat file .ab, melainkan membuat file .backup. Saya ingin tahu cara mengekstraknya. Juga saya tidak yakin apakah ini telah mengambil semua foto dan video sebagai cadangan?
hajirazin
-4

Untuk menjelajahi file cadangan yang ada, coba halaman http://www.adb-backup.com , mudah tanpa "dd", "tar", ...

Data tidak disimpan di server ini. Saya telah mengembangkan layanan online ini untuk membuatnya lebih mudah untuk melihat cadangan tanpa memanipulasi dengan dd / tar atau menginstal perangkat lunak tambahan. Saya penulis www.adb-backup.com

Liszak
sumber
7
Aku akan sangat berhati-hati tentang mengunggah backup adb (dan memberikan password) untuk website acak ... Data termasuk dalam cadangan adb pribadi dan Anda tidak memiliki cara untuk mengetahui apa situs tersebut dengan backup. Ini bisa berbahaya, tetapi saya tidak akan merekomendasikan melakukan ini.
bmdixon
Menurut Metasmoke, ini adalah url spam . Selain itu saya sepenuhnya setuju dengan @bmdixon di sini - terutama karena ada cara aman melakukan tugas secara lokal.
Izzy
@Izzy Anyway, saya ditandai sebagai spam dan melaporkannya ke SmokeDetector.
iBug
Data tidak disimpan di server ini. Saya telah mengembangkan layanan online ini untuk membuatnya lebih mudah untuk melihat cadangan tanpa memanipulasi dengan dd / tar atau menginstal perangkat lunak tambahan. Saya penulis www.adb-backup.com
Liszak