มีวิธีดูภายในและแก้ไขไฟล์สำรองข้อมูล adb ที่สร้างขึ้นหรือไม่


40

ฉันสร้างการสำรองข้อมูลของ Galaxy Nexus adb backupของฉันด้วย ไฟล์ที่ได้นั้นมีชื่อว่า backup.db และมันจะถูกเข้ารหัสอย่างใด

ผมอยากจะเรียกคืนการสำรอง com.android.providers.contactsแต่มันจะหยุดเมื่อมันมาถึงการฟื้นฟู ฉันเคยadb logcatค้นหาว่าเกิดอะไรขึ้นและพบว่าcom.android.acoreข้อขัดข้องในระหว่างกระบวนการกู้คืน

ฉันต้องการเข้าถึงข้อมูลในการสำรองข้อมูลและลบฐานข้อมูลผู้ติดต่อเพื่อกู้คืนทุกอย่างกลับสู่โทรศัพท์ของฉัน มีวิธีอื่นในการกู้คืนข้อมูลจากการสำรองข้อมูลหรือไม่

คำตอบ:


14

ไฟล์ไม่ได้รับการเข้ารหัสเว้นแต่คุณจะระบุไว้เมื่อสร้างข้อมูลสำรอง อย่างไรก็ตามมันถูกบีบอัด (โดยใช้การยุบ) คุณสามารถค้นหารูปแบบที่แน่นอนได้โดยดูที่รหัส Android (com / android / server / BackupManagerService.java) รหัสและในทางเทคนิคควรจะสามารถดึงข้อมูลเฉพาะจากมันได้ อย่างไรก็ตาม IIRC มีการตรวจสอบความสมบูรณ์ของไฟล์อยู่ดังนั้นจึงอาจไม่ทำงานหากคุณเพียงลบข้อมูลจำนวนมากออก น่าเสียดายที่restoreคำสั่งดูเหมือนจะไม่มีตัวเลือกในการกู้คืนแอป / แพ็กเกจเฉพาะหรือไม่รวมแพ็กเกจ


ขอบคุณ! อย่างน้อยก็เป็นจุดเริ่มต้นในการดูไฟล์ คงจะง่ายกว่านี้ถ้าฉันไม่ได้ให้รหัสผ่านสำหรับการสำรองข้อมูล
ingorichter

หากคุณระบุรหัสผ่านมันจะถูกเข้ารหัสอย่างแน่นอน `BackupManagerService 'มีรายละเอียดเกี่ยวกับอัลกอริธึมการเข้ารหัสจริงและพารามิเตอร์ที่ได้รับมา (เกลือจำนวนการทำซ้ำและอื่น ๆ ) จะถูกเขียนในส่วนหัวของไฟล์ เมื่อคุณรู้รหัสผ่านคุณสามารถรับรหัสและถอดรหัสข้อมูลได้ ดังนั้นมันจึงยังคงเป็นไปได้ แต่ไม่ใช่เรื่องง่ายโดยเฉพาะ ...

ใช่ฉันกำลังแยกทุกอย่างจากBackupManagerServiceเพื่ออ่านเนื้อหาของไฟล์สำรอง มันเป็นงานที่ดี แต่ฉันต้องการข้อมูลของฉันคืนมา ...
ingorichter

@ingorichter ความคืบหน้าใด ๆ
จอน

@ingorichter ฉันเริ่มทำสิ่งนี้และโพสต์ข้อความมากมายด้านล่างในคำตอบ "ชุมชนวิกิ" รู้สึกอิสระที่จะเพิ่มไป
จอน

50

ฉันเริ่มทำงานกับสิ่งนี้ ฉันโพสต์ผลลัพธ์ของฉันจนถึงที่นี่ในฐานะคำตอบ "ชุมชน 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 เส้น:

  1. "ANDROID BACKUP"
  2. รุ่นรูปแบบการสำรองข้อมูล: ปัจจุบัน "4"
  3. ไม่"0"ว่าจะเป็นการสำรองข้อมูลหรือ"1"ไม่
  4. วิธีการเข้ารหัส: ปัจจุบัน"none"หรือ"AES-256"
  5. (ถ้าเข้ารหัส) "รหัสผ่านเกลือของผู้ใช้" เข้ารหัสเป็นเลขฐานสิบหกตัวพิมพ์ใหญ่ทั้งหมด
  6. (หากเข้ารหัส) "การตรวจสอบคีย์หลักเกลือ" เข้ารหัสใน hex, ตัวพิมพ์ใหญ่ทั้งหมด
  7. (ถ้าเข้ารหัส) หมายถึง "จำนวนรอบ PBKDF2 ที่ใช้" เป็นเลขทศนิยม: ปัจจุบัน "10000"
  8. (ถ้าเข้ารหัส), "IV ของรหัสผู้ใช้" ที่เข้ารหัสในฐานสิบหก, ตัวพิมพ์ใหญ่ทั้งหมด
  9. (ถ้าเข้ารหัส), "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

รายละเอียดการเข้ารหัส

  1. คีย์ AES 256 ได้มาจากรหัสผ่านการเข้ารหัสสำรองโดยใช้ 10000 รอบของ PBKDF2 ที่มีเกลือ 512 บิตที่สร้างแบบสุ่ม
  2. คีย์หลัก AES 256 ถูกสร้างแบบสุ่ม
  3. คีย์หลัก 'checksum' ถูกสร้างขึ้นโดยการเรียกใช้มาสเตอร์คีย์ถึง 10,000 รอบของ PBKDF2 ด้วยเกลือ 512 บิตที่สร้างขึ้นใหม่แบบสุ่ม
  4. การเข้ารหัสการสำรองข้อมูลแบบสุ่มถูกสร้างขึ้น IV
  5. IV, มาสเตอร์คีย์และเช็คซัมถูกต่อกันและเข้ารหัสด้วยคีย์ที่ได้รับใน 1 หยดผลลัพธ์ที่ได้จะถูกบันทึกไว้ในส่วนหัวเป็นสตริงฐานสิบหก
  6. ข้อมูลสำรองที่แท้จริงถูกเข้ารหัสด้วยคีย์หลักและต่อท้ายไฟล์

ตัวอย่างการใช้โค้ดแพ็ค / แกะ (สร้าง / ใช้) ไฟล์เก็บถาวร 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


หากคุณวางรหัสไว้ที่ใดที่หนึ่งฉันอาจเข้าร่วมได้ OP (@ngorichter) อาจมีโค้ดทำงานอยู่ด้วย :) ยูทิลิตี้ที่คลายบีบอัดและแตกไฟล์จริงอาจมีประโยชน์เพื่อให้คุณสามารถกู้คืนเฉพาะบางส่วน (ถ้าคุณมีรูตแน่นอน)
Nikolay Elenkov

1
ในส่วนของการเข้ารหัสฉันต้องค้นหารายละเอียด แต่กุญแจนั้นได้มาจากการใช้ PBKDF2 โดยเกลือและอุปกรณ์ปลดล็อค PIN รหัสผ่านหรือรูปแบบ (แปลงเป็นสตริง) คีย์หลักถูกสร้างแบบสุ่มและเข้ารหัสด้วยคีย์ที่ได้รับรหัสผ่าน ใช้เพื่อทำงานกับไฟล์เก็บถาวรที่ไม่ได้เข้ารหัสก่อน ฉันสามารถใช้ส่วนถอดรหัสได้หากคุณมีปัญหา
Nikolay Elenkov

ขออภัยคีย์จะได้รับจริงตามรหัสผ่านที่คุณระบุเมื่อเริ่มการสำรองข้อมูล
Nikolay Elenkov

@NikolayElenkov ฉันยังไม่มีรหัสใด ๆ แต่ฉันวางแผนที่จะเขียนโปรแกรมอรรถประโยชน์เพื่อจัดการไฟล์ ab การเข้ารหัส Wrt ฉันไม่คิดว่ามันจะยาก เป็นเพียงฉันได้เหลือบมองไปที่ส่วนหนึ่งของรหัส ในทำนองเดียวกันฉันได้ติดตามเส้นทางโค้ด (ยังไม่ได้เขียนด้านบน) ที่สร้าง tar stream แต่ยังไม่ได้ตรวจสอบว่ารูปแบบจริงคือ GNU tar
จอน

ว้าวฉันประทับใจการวิเคราะห์ของคุณมาก ฉันแยกรหัสจาก BackupManagerService ลงในสคริปต์ groovy แบบง่าย ๆ แต่เมื่อฉันรันโปรแกรมผลลัพธ์จะเหมือนกันเสมอ: ใส่รหัสผ่านผิด! ฉันสร้างการสำรองข้อมูลใหม่ด้วยรหัสผ่านง่าย ๆ แต่การตรวจสอบรหัสผ่านล้มเหลวอีกครั้ง ขณะนี้ฉันพยายามติดตามโปรแกรมตามที่อธิบายไว้ข้างต้นเพื่อหาความผิดพลาดของฉัน
ingorichter

7

คำตอบที่ดีและรายละเอียดจากนิโค Elenkov อย่างไรก็ตามฉันควรเพิ่มว่ามีใครบางคนพัฒนาซอฟต์แวร์ที่ทำเพียงแค่นั้นและจัดทำแพคเกจที่นี่: http://sourceforge.net/projects/adbextractor/

แพคเกจประกอบด้วยเครื่องมือ Java และ Perl ตัวฉันเองชอบ Perl มากกว่า Java ทุกวันดังนั้นฉันจึงแยกรหัส Perl ตรวจสอบให้แน่ใจว่าสามารถใช้งานได้ติดตั้งไลบรารี Perl ที่จำเป็นและเรียกใช้backupdecrypt.plไฟล์สำรองข้อมูล adb และแปลงเป็นไฟล์ tar หรือ gzipped tar โดยไม่ต้องมี ปัญหา.

ฉันยังสร้างซับใน Bash 3 ที่อนุญาตให้ฉันสำรองข้อมูล adb โดยตรงไปยังไฟล์ gzipped tar:

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

หวังว่ามันจะช่วย


6
ใช่พวกเขาบรรจุเครื่องมือ (Java หนึ่ง) ฉันเขียน :) ฉันยังช่วยพอร์ตสิ่งที่ Perl หากคุณไม่ได้อ่าน README อาจไม่ชัดเจนว่าการเขียนมาก่อนแล้วเครื่องมือ ....
Nikolay Elenkov

ฉันสำรองข้อมูลไว้แล้ว แต่ไม่ได้สร้างไฟล์. ab แต่สร้างไฟล์สำรองข้อมูลแทน ฉันต้องการทราบวิธีการแยก นอกจากนี้ฉันไม่แน่ใจว่ามันได้ทำการสำรองรูปภาพและวิดีโอทั้งหมดหรือไม่?
hajirazin

-4

สำหรับการสำรวจไฟล์สำรองที่มีอยู่ให้ลองหน้าhttp://www.adb-backup.comมันง่ายโดยไม่ต้อง "dd", "tar", ...

ข้อมูลจะไม่ถูกเก็บไว้ในเซิร์ฟเวอร์นี้ ฉันได้พัฒนาบริการออนไลน์นี้เพื่อให้ง่ายต่อการดูการสำรองข้อมูลโดยไม่ต้องจัดการกับ dd / tar หรือติดตั้งซอฟต์แวร์เพิ่มเติม ฉันเป็นผู้เขียน www.adb-backup.com


7
ฉันต้องระวังอย่างมากเกี่ยวกับการอัปโหลดสำเนาสำรองของ adb (และแจ้งรหัสผ่าน) ไปยังเว็บไซต์สุ่ม ... ข้อมูลที่รวมอยู่ในข้อมูลสำรอง adb นั้นเป็นข้อมูลส่วนตัวและคุณไม่มีทางรู้ว่าเว็บไซต์ทำอะไรกับการสำรองข้อมูล อาจไม่เป็นอันตราย แต่ฉันไม่แนะนำให้ทำเช่นนี้
bmdixon

ตาม Metasmoke, นี้เป็น URL นอกจากนั้นฉันเห็นด้วยอย่างเต็มที่กับ @bmdixon ที่นี่ - โดยเฉพาะอย่างยิ่งเมื่อมีวิธีที่ปลอดภัยอยู่แล้วให้ทำงานในพื้นที่
Izzy

@Izzy ต่อไปฉันตั้งค่าสถานะเป็นสแปมและรายงานไปยัง SmokeDetector
iBug

ไม่มีการจัดเก็บข้อมูลบนเซิร์ฟเวอร์นี้ ฉันได้พัฒนาบริการออนไลน์นี้เพื่อให้ง่ายต่อการดูการสำรองข้อมูลโดยไม่ต้องจัดการกับ dd / tar หรือติดตั้งซอฟต์แวร์เพิ่มเติม ฉันเป็นผู้เขียน www.adb-backup.com
Liszak
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.