ฉันเริ่มทำงานกับสิ่งนี้ ฉันโพสต์ผลลัพธ์ของฉันจนถึงที่นี่ในฐานะคำตอบ "ชุมชน wiki" ด้วยเหตุผลสองประการ: ก่อนอื่นถ้ามีคนต้องการเข้าร่วมมีที่สำหรับพูดคุย สองถ้าฉันถูกดึงออกจากโครงการนี้จะมีคำแนะนำให้คนอื่นเริ่มทำงาน
ตรรกะการสำรองข้อมูลในพื้นที่ที่มีอยู่ทั้งหมดภายในhttps://github.com/android/platform_system_core/blob/master/adb/commandline.cppbackup
ในฟังก์ชั่นที่มีชื่อว่า ฟังก์ชั่นนั้นง่ายมาก : ตรวจสอบตัวเลือกบรรทัดคำสั่งส่งคำสั่งส่วนใหญ่ตามที่เป็นไปยัง adb daemon บนโทรศัพท์และเขียนเอาต์พุตของโทรศัพท์ไปยังไฟล์ ไม่มีแม้แต่การตรวจสอบข้อผิดพลาด: ตัวอย่างเช่นหากคุณปฏิเสธการสำรองข้อมูลทางโทรศัพท์adb
เพียงแค่เขียนไฟล์เปล่า
บนโทรศัพท์มือถือตรรกะการสำรองข้อมูลจะเริ่มต้นในservice_to_fd()
ในhttps://github.com/android/platform_system_core/blob/master/adb/services.cpp ฟังก์ชั่นระบุว่าคำสั่งจากโฮสต์คือ"backup"
และส่งคำสั่งที่ไม่ได้แยกวิเคราะห์ไป/system/bin/bu
ซึ่งเป็นเชลล์สคริปต์ตัวเล็กที่จะเรียกใช้com.android.commands.bu.Backup
เป็นคลาสหลักของกระบวนการแอพ Android ใหม่ การโทรServiceManager.getService("backup")
เพื่อรับบริการสำรองข้อมูลในฐานะIBackupManager
และการโทรIBackupManager.fullBackup()
ส่งผ่านตัวให้คำอธิบายไฟล์ที่ยังไม่ได้ใช้ (ทางอ้อมมาก) เชื่อมต่อกับbackup.ab
ไฟล์บนโฮสต์
การควบคุมผ่านไปยังfullBackup()
ในcom.android.server.backup.BackupManagerServiceซึ่งจะปรากฏขึ้น GUI ขอให้ผู้ใช้ยืนยัน / ปฏิเสธการสำรองข้อมูล เมื่อผู้ใช้ทำเช่นนั้นacknowledgeFullBackupOrRestore()
(ไฟล์เดียวกัน) จะถูกเรียก หากผู้ใช้อนุมัติคำขอให้acknowledgeFullBackupOrRestore()
ระบุว่าการสำรองข้อมูลได้รับการเข้ารหัสและส่งข้อความไปที่BackupHandler
(ไฟล์เดียวกัน) BackupHandler
จากนั้นจะเริ่มต้นและเริ่มต้นPerformAdbBackupTask
( ไฟล์เดียวกันบรรทัด 4004ณ เวลาที่เขียน)
ในที่สุดเราก็เริ่มต้นสร้างผลผลิตที่มีในPerformAdbBackupTask.run()
ระหว่างสาย 4151และสาย 4330
ก่อนอื่นให้run()
เขียนส่วนหัวซึ่งประกอบด้วยบรรทัด ASCII 4 หรือ 9 เส้น:
"ANDROID BACKUP"
- รุ่นรูปแบบการสำรองข้อมูล: ปัจจุบัน
"4"
- ไม่
"0"
ว่าจะเป็นการสำรองข้อมูลหรือ"1"
ไม่
- วิธีการเข้ารหัส: ปัจจุบัน
"none"
หรือ"AES-256"
- (ถ้าเข้ารหัส) "รหัสผ่านเกลือของผู้ใช้" เข้ารหัสเป็นเลขฐานสิบหกตัวพิมพ์ใหญ่ทั้งหมด
- (หากเข้ารหัส) "การตรวจสอบคีย์หลักเกลือ" เข้ารหัสใน hex, ตัวพิมพ์ใหญ่ทั้งหมด
- (ถ้าเข้ารหัส) หมายถึง "จำนวนรอบ PBKDF2 ที่ใช้" เป็นเลขทศนิยม: ปัจจุบัน
"10000"
- (ถ้าเข้ารหัส), "IV ของรหัสผู้ใช้" ที่เข้ารหัสในฐานสิบหก, ตัวพิมพ์ใหญ่ทั้งหมด
- (ถ้าเข้ารหัส), "master IV + blob key, การเข้ารหัสโดยรหัสผู้ใช้" ที่เข้ารหัสใน hex, ตัวพิมพ์ใหญ่ทั้งหมด
สำรองข้อมูลที่เกิดขึ้นจริงต่อไปนี้ไม่ว่าจะเป็น (ขึ้นอยู่กับการบีบอัดและการเข้ารหัส) tar
, deflate(tar)
, หรือencrypt(tar)
encrypt(deflate(tar))
สิ่งที่ต้องทำ : เขียนเส้นทางรหัสที่สร้างออก tar - คุณสามารถใช้ tar ตราบเท่าที่รายการอยู่ในลำดับที่เหมาะสม (ดูด้านล่าง)
รูปแบบไฟล์เก็บถาวร tar
ข้อมูลแอปจะถูกเก็บไว้ภายใต้แอพ / ไดเรกทอรีเริ่มต้นด้วยไฟล์ _manifest, APK (หากมีการร้องขอ) ใน /, ไฟล์แอพใน f /, ฐานข้อมูลใน db / และการตั้งค่าที่แชร์ใน sp / หากคุณร้องขอการสำรองข้อมูลที่จัดเก็บข้อมูลภายนอก (โดยใช้ตัวเลือก -shared) ก็จะมีการแชร์ / ไดเรกทอรีในไฟล์เก็บถาวรที่มีไฟล์จัดเก็บข้อมูลภายนอก
$ 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
รายละเอียดการเข้ารหัส
- คีย์ AES 256 ได้มาจากรหัสผ่านการเข้ารหัสสำรองโดยใช้ 10000 รอบของ PBKDF2 ที่มีเกลือ 512 บิตที่สร้างแบบสุ่ม
- คีย์หลัก AES 256 ถูกสร้างแบบสุ่ม
- คีย์หลัก 'checksum' ถูกสร้างขึ้นโดยการเรียกใช้มาสเตอร์คีย์ถึง 10,000 รอบของ PBKDF2 ด้วยเกลือ 512 บิตที่สร้างขึ้นใหม่แบบสุ่ม
- การเข้ารหัสการสำรองข้อมูลแบบสุ่มถูกสร้างขึ้น IV
- IV, มาสเตอร์คีย์และเช็คซัมถูกต่อกันและเข้ารหัสด้วยคีย์ที่ได้รับใน 1 หยดผลลัพธ์ที่ได้จะถูกบันทึกไว้ในส่วนหัวเป็นสตริงฐานสิบหก
- ข้อมูลสำรองที่แท้จริงถูกเข้ารหัสด้วยคีย์หลักและต่อท้ายไฟล์
ตัวอย่างการใช้โค้ดแพ็ค / แกะ (สร้าง / ใช้) ไฟล์เก็บถาวร tar: https://github.com/nelenkov/android-backup-extractor
รายละเอียดเพิ่มเติมได้ที่นี่: http://nelenkov.blogspot.com/2012/06/unpacking-android-backups.html
สคริปต์ Perl สำหรับการบรรจุ / เปิดออกและการแก้ไขคลังข้อมูลที่เสียหาย:
http://forum.xda-developers.com/showthread.php?p=27840175#post27840175