Có cách nào để nhìn vào bên trong và sửa đổi tệp sao lưu adb đã tạo không?


40

Tôi đã tạo bản sao lưu Galaxy Nexus của mình với adb backup. Tệp kết quả được đặt tên là backup.db và bằng cách nào đó nó được mã hóa.

Tôi muốn khôi phục lại bản sao lưu, nhưng nó dừng lại khi khôi phục lại com.android.providers.contacts. Tôi đã từng adb logcattìm hiểu những gì đang xảy ra và phát hiện ra rằng com.android.acoresự cố trong quá trình khôi phục.

Tôi muốn có quyền truy cập vào dữ liệu trong bản sao lưu và xóa cơ sở dữ liệu danh bạ để khôi phục mọi thứ trở lại điện thoại của tôi. Có cách nào khác để khôi phục dữ liệu từ bản sao lưu không?

Câu trả lời:


14

Các tập tin không được mã hóa, trừ khi bạn chỉ định như vậy khi tạo bản sao lưu. Tuy nhiên, nó được nén (sử dụng giảm phát). Bạn có thể tìm ra định dạng chính xác bằng cách xem mã nguồn Android (com / android / server / BackupManagerService.java) và về mặt kỹ thuật, có thể trích xuất dữ liệu cụ thể từ nó. Tuy nhiên, IIRC, có một số kiểm tra tính toàn vẹn của tệp, vì vậy rất có thể nó sẽ không hoạt động nếu bạn chỉ xóa một loạt dữ liệu khỏi nó. Thật không may, restorelệnh dường như không có tùy chọn để chỉ khôi phục một ứng dụng / gói cụ thể hoặc loại trừ một gói.


Cảm ơn! Đó ít nhất là một điểm khởi đầu để nhìn vào bên trong tập tin. Sẽ dễ dàng hơn nếu tôi không cung cấp mật khẩu cho bản sao lưu.
ingorichter

Nếu bạn cung cấp một mật khẩu, nó thực sự được mã hóa. `BackupManagerService 'có chi tiết về các thuật toán mã hóa thực tế và các tham số phái sinh chính (muối, số lần lặp, v.v.) được viết trong tiêu đề tệp. Vì bạn biết mật khẩu, bạn có thể lấy khóa và giải mã dữ liệu. Vì vậy, nó vẫn có thể thực hiện được, nhưng không đặc biệt dễ dàng ...

Có, tôi hiện đang trích xuất mọi thứ BackupManagerServiceđể đọc nội dung của tệp sao lưu. Đó là một lượng công việc tốt, nhưng tôi cần dữ liệu của mình trở lại ...
ingorichter

@ingorichter có tiến triển gì không?
jon

@ingorichter Tôi bắt đầu làm việc này và đăng một tấn ghi chú bên dưới, trong câu trả lời "wiki cộng đồng". Hãy thêm vào nó.
jon

50

Tôi bắt đầu làm việc này. Tôi đang đăng kết quả của mình cho đến nay dưới dạng câu trả lời "wiki cộng đồng" vì hai lý do: thứ nhất, nếu ai đó muốn tham gia, có một nơi để nói chuyện; thứ hai, nếu tôi bị kéo ra khỏi dự án này, sẽ có gợi ý cho người khác bắt đầu làm việc.

 

Logic sao lưu trên máy chủ hoàn toàn được chứa trong https://github.com/android/pl platform_system_core / blog / master / adb / commandline.cpp , trong hàm có tên backup. Chức năng này rất đơn giản: nó xác nhận các tùy chọn dòng lệnh, gửi lệnh chủ yếu là tương tự với daemon adb trên điện thoại và ghi đầu ra của điện thoại vào tệp. Thậm chí không có kiểm tra lỗi: ví dụ, nếu bạn từ chối bản sao lưu trên điện thoại, adbchỉ cần ghi ra một tập tin trống.

Trên điện thoại, logic sao lưu bắt đầu service_to_fd()trong https://github.com/android/pl platform_system_core / blog / master / adb / service.cpp . Hàm xác định rằng lệnh từ máy chủ lưu trữ "backup"và chuyển lệnh chưa được xử lý tới /system/bin/bu, đây là một tập lệnh shell tầm thường để khởi chạy com.android.commands.bu.Backupnhư là lớp chính của một quy trình ứng dụng Android mới. Điều đó gọi ServiceManager.getService("backup")để có được dịch vụ sao lưu dưới dạng IBackupManagervà gọi IBackupManager.fullBackup(), chuyển cho nó bộ mô tả tệp vẫn chưa được sử dụng (rất gián tiếp) được kết nối với backup.abtệp trên máy chủ.

Kiểm soát chuyển đến fullBackup()trong com.android.server.backup.BackupManagerService , bật lên GUI yêu cầu người dùng xác nhận / từ chối sao lưu. Khi người dùng làm như vậy, acknowledgeFullBackupOrRestore()(cùng một tệp) được gọi. Nếu người dùng chấp thuận yêu cầu, hãy acknowledgeFullBackupOrRestore()tìm hiểu xem bản sao lưu có được mã hóa hay không và gửi một tin nhắn đến BackupHandler(cùng một tệp.) BackupHandlerSau đó khởi tạo và khởi động một PerformAdbBackupTask( cùng một tệp, dòng 4004 tại thời điểm viết)

Cuối cùng chúng tôi bắt đầu tạo đầu ra ở đó, trongPerformAdbBackupTask.run() , giữa dòng 4151dòng 4330 .

Đầu tiên, run()viết một tiêu đề, bao gồm 4 hoặc 9 dòng ASCII:

  1. "ANDROID BACKUP"
  2. phiên bản định dạng sao lưu: hiện tại "4"
  3. hoặc "0"nếu sao lưu không nén hoặc "1"nếu nó là
  4. phương thức mã hóa: hiện tại "none"hoặc"AES-256"
  5. (nếu được mã hóa), "muối mật khẩu người dùng" được mã hóa thành hex, tất cả các chữ hoa
  6. (nếu được mã hóa), "muối tổng kiểm tra chính" được mã hóa ở dạng hex, tất cả các chữ hoa
  7. (nếu được mã hóa), "số vòng PBKDF2 được sử dụng" dưới dạng số thập phân: hiện tại "10000"
  8. (nếu được mã hóa), "IV của khóa người dùng" được mã hóa ở dạng hex, tất cả các chữ hoa
  9. (nếu được mã hóa), "blob khóa IV + chính, được mã hóa bởi khóa người dùng" được mã hóa thành hex, tất cả các chữ hoa

Chức năng sao lưu dữ liệu thực tế sau, hoặc là (tùy thuộc vào nén và mã hóa) tar, deflate(tar), encrypt(tar), hoặc encrypt(deflate(tar)).

 

TODO : viết đường dẫn mã tạo đầu ra tar - bạn chỉ cần sử dụng tar miễn là các mục nhập theo đúng thứ tự (xem bên dưới).

Định dạng lưu trữ Tar

Dữ liệu ứng dụng được lưu trữ trong thư mục ứng dụng /, bắt đầu bằng tệp _manifest, APK (nếu được yêu cầu) trong /, tệp ứng dụng trong f /, cơ sở dữ liệu theo db / và tùy chọn chia sẻ trong sp /. Nếu bạn yêu cầu sao lưu bộ nhớ ngoài (sử dụng tùy chọn chia sẻ), cũng sẽ có một thư mục / chia sẻ trong kho lưu trữ chứa các tệp lưu trữ ngoài.

$ 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

Chi tiết mã hóa

  1. Khóa AES 256 được lấy từ mật khẩu mã hóa dự phòng bằng 10000 vòng PBKDF2 với muối 512 bit được tạo ngẫu nhiên.
  2. Khóa chính AES 256 được tạo ngẫu nhiên
  3. Khóa chính 'tổng kiểm tra' được tạo bằng cách chạy khóa chính thông qua 10000 vòng PBKDF2 với muối 512 bit được tạo ngẫu nhiên mới.
  4. Một IV mã hóa sao lưu ngẫu nhiên được tạo ra.
  5. Khóa IV, khóa chính và tổng kiểm tra được nối và mã hóa với khóa xuất phát trong 1. Blob kết quả được lưu trong tiêu đề dưới dạng chuỗi hex.
  6. Dữ liệu sao lưu thực tế được mã hóa bằng khóa chính và được thêm vào cuối tệp.

Gói mẫu / giải nén mã thực hiện (sản xuất / sử dụng) lưu trữ tar: https://github.com/nelenkov/android-backup-extractor

Một số chi tiết ở đây: http://nelenkov.blogspot.com/2012/06/unpacking-android-backups.html

Các kịch bản Perl để đóng gói / giải nén và sửa chữa các tài liệu lưu trữ bị hỏng:

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


Nếu bạn đặt mã ở đâu đó, tôi có thể tham gia. OP (@ngorichter) có thể cũng có một số mã hoạt động :) Một tiện ích giải nén và trích xuất các tệp thực tế có thể hữu ích, do đó bạn chỉ có thể khôi phục các phần (nếu bạn có root tất nhiên).
Nikolay Elenkov

1
Về phần mã hóa, tôi phải tìm kiếm chi tiết, nhưng khóa được lấy bằng PBKDF2 bằng mã PIN, mật khẩu hoặc mẫu mở khóa của thiết bị (được chuyển thành chuỗi). Khóa chính được tạo ngẫu nhiên và được mã hóa bằng khóa có nguồn gốc mật khẩu. Làm cho nó hoạt động cho các tài liệu lưu trữ không được mã hóa đầu tiên. Tôi có thể thực hiện phần giải mã nếu bạn gặp rắc rối với nó.
Nikolay Elenkov

Xin lỗi, khóa thực sự có nguồn gốc dựa trên mật khẩu bạn chỉ định khi bắt đầu sao lưu.
Nikolay Elenkov

@NikolayElenkov Tôi chưa có mã nào, nhưng tôi có kế hoạch viết một tiện ích để thao tác các tập tin ab. Mã hóa Wrt, tôi không nghĩ nó sẽ khó khăn; chỉ là tôi chỉ liếc qua phần mã đó. Tương tự, tôi đã theo dõi đường dẫn mã (chưa được viết ở trên) tạo ra luồng tar, nhưng chưa kiểm tra định dạng thực tế là GNU tar.
jon

Wow, tôi ấn tượng với phân tích của bạn. Tôi đã trích xuất một số mã từ BackupManagerService thành một tập lệnh Groovy đơn giản, nhưng khi tôi chạy chương trình thì kết quả luôn giống nhau: nhập sai mật khẩu! Tôi đã tạo một bản sao lưu mới với một mật khẩu đơn giản, nhưng việc xác minh mật khẩu lại thất bại. Hiện tại tôi cố gắng theo chương trình như mô tả ở trên để tìm lỗi của mình.
ingorichter

7

Câu trả lời tuyệt vời và chi tiết từ Nikolay Elenkov . Tuy nhiên tôi nên nói thêm rằng ai đó đã phát triển một phần mềm làm việc đó và gói nó ở đây: http://sourceforge.net/projects/adbextractor/

Gói chứa cả công cụ Java và Perl. Bản thân tôi thích Perl hơn Java bất kỳ ngày nào, vì vậy tôi đã trích xuất mã Perl, đảm bảo chúng có thể thực thi được, cài đặt thư viện Perl cần thiết và chạy backupdecrypt.pltệp chống lại tệp sao lưu adb và nó chuyển đổi nó thành tệp tar hoặc gzip mà không cần bất kỳ vấn đề.

Tôi thậm chí đã tạo một lớp lót trong Bash 3 cho phép tôi thực hiện sao lưu adb trực tiếp vào tệp tar được nén:

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

Hy vọng nó giúp.


6
Vâng, họ đã đóng gói công cụ (cái Java) tôi đã viết :) Tôi cũng đã giúp chuyển thứ đó sang Perl. Nếu bạn không đọc README, có thể không rõ ràng rằng việc viết ra trước, sau đó là các công cụ ....
Nikolay Elenkov

Tôi đã sao lưu nhưng nó chưa tạo tệp .ab, thay vào đó nó đã tạo tệp .backup. Tôi muốn biết làm thế nào để giải nén nó. Ngoài ra tôi không chắc liệu nó đã lấy tất cả ảnh và video làm bản sao lưu chưa?
hajirazin

-4

Để khám phá tệp sao lưu hiện có, hãy thử trang http://www.adb-backup.com , thật đơn giản mà không cần "dd", "tar", ...

Dữ liệu không được lưu trữ trên máy chủ này. Tôi đã phát triển dịch vụ trực tuyến này để giúp xem các bản sao lưu dễ dàng hơn mà không cần thao tác với dd / tar hoặc cài đặt phần mềm bổ sung. Tôi là tác giả www.adb-backup.com


7
Tôi rất cẩn thận về việc tải lên bản sao lưu adb (và cung cấp mật khẩu) cho một trang web ngẫu nhiên ... Dữ liệu trong bản sao lưu adb là riêng tư và bạn không có cách nào biết trang web làm gì với bản sao lưu. Nó có thể vô hại nhưng tôi không khuyên bạn nên làm điều này.
bmdixon

Theo Metasmoke, đây là một url spam . Ngoài ra, tôi hoàn toàn đồng ý với @bmdixon ở đây - đặc biệt là những cách an toàn tồn tại thực hiện nhiệm vụ cục bộ.
Izzy

@Izzy Dù sao tôi cũng gắn cờ là thư rác và báo cáo nó với SmokeDetector.
iBug

Dữ liệu không được lưu trữ trên máy chủ này. Tôi đã phát triển dịch vụ trực tuyến này để giúp xem các bản sao lưu dễ dàng hơn mà không cần thao tác với dd / tar hoặc cài đặt phần mềm bổ sung. Tôi là tác giả www.adb-backup.com
Liszak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.