내부를보고 adb 백업 생성 파일을 수정하는 방법이 있습니까?


40

로 Galaxy Nexus 백업을 만들었습니다 adb backup. 결과 파일의 이름은 backup.db이며 어떻게 든 암호화됩니다.

백업을 복원하고 싶지만 복원 할 때 중지됩니다 com.android.providers.contacts. 나는 adb logcat무슨 일이 일어나고 있는지를 알아 내고 com.android.acore복원 과정에서 충돌하는 것을 알았습니다 .

백업의 데이터에 액세스하고 연락처 데이터베이스를 제거하여 모든 것을 내 전화로 복원하고 싶습니다. 백업에서 데이터를 복원하는 다른 방법이 있습니까?

답변:


14

백업을 만들 때 지정하지 않으면 파일이 암호화되지 않습니다. 그러나 압축됩니다 (deflate 사용). Android 소스 (com / android / server / BackupManagerService.java) 코드를 보면 정확한 형식을 찾을 수 있으며 기술적으로 특정 데이터를 추출 할 수 있어야합니다. 그러나 IIRC에는 일부 파일 무결성 검사가 있으므로 많은 데이터를 삭제하면 작동하지 않을 가능성이 큽니다. 불행히도 restore명령에는 특정 앱 / 패키지 만 복원하거나 패키지를 제외시키는 옵션이없는 것 같습니다.


감사! 그것은 파일 내부를 살펴보기위한 최소한 시작점입니다. 백업용 비밀번호를 제공하지 않았다면 더 쉬웠을 것입니다.
ingorichter

비밀번호를 제공 한 경우 실제로 암호화됩니다. `BackupManagerService '는 실제 암호화 알고리즘에 대한 세부 정보를 가지고 있으며 키 파생 매개 변수 (소금, 반복 횟수 등)가 파일 헤더에 기록됩니다. 비밀번호를 알고 있으므로 키를 파생시키고 데이터를 해독 할 수 있습니다. 그래서 그것은 여전히 ​​가능하지만 특히 쉽지는 않습니다 ...

예, 현재 BackupManagerService백업 파일의 내용을 읽기 위해 모든 것을 추출 하고 있습니다. 작업량이 많지만 데이터를 다시
가져와야합니다

@ingorichter 어떤 진행?
jon

@ingorichter이 작업을 시작하고 아래의 "커뮤니티 위키"답변에 많은 메모를 게시했습니다. 자유롭게 추가하십시오.
jon

50

이 작업을 시작했습니다. 지금까지 두 가지 이유로 "커뮤니티 위키 (wiki)"답변으로 결과를 게시하고 있습니다. 둘째,이 프로젝트에서 벗어나면 다른 누군가가 일을 시작할 수있는 힌트가 있습니다.

 

호스트의 백업 논리는 라는 함수의 https://github.com/android/platform_system_core/blob/master/adb/commandline.cpp에 완전히 포함되어 있습니다backup . 이 기능은 매우 간단합니다. 명령 줄 옵션의 유효성을 검사하고 명령을 대부분 그대로 전화의 adb 데몬으로 보내고 전화의 출력을 파일에 씁니다. 예를 들어 휴대 전화에서 백업을 거부 adb하면 빈 파일 만 작성됩니다.

전화에서 백업 논리는 https://github.com/android/platform_system_core/blob/master/adb/services.cppservice_to_fd() 에서 시작합니다 . 이 함수는 호스트의 명령이임을 식별 하고 구문 분석되지 않은 명령을에 전달합니다.이 명령 은 새로운 Android 앱 프로세스의 기본 클래스 로 시작 하는 간단한 쉘 스크립트 입니다. 백업 서비스를로 호출 하기 위해 호출 하고 호출 하여 여전히 사용하지 않는 파일 설명자를 호스트 의 파일에 (매우 간접적으로) 연결 합니다."backup"/system/bin/bucom.android.commands.bu.BackupServiceManager.getService("backup")IBackupManagerIBackupManager.fullBackup()backup.ab

컨트롤로 전달 fullBackup()com.android.server.backup.BackupManagerService 확인을 사용자에게 요청하는 GUI / 백업을 거부 팝업. 사용자가 그렇게하면 acknowledgeFullBackupOrRestore()(동일한 파일)이 호출됩니다. 사용자가 요청을 승인하면 acknowledgeFullBackupOrRestore()백업이 암호화되었는지 확인하고 메시지를 BackupHandler(동일한 파일) BackupHandler로 전달한 다음 PerformAdbBackupTask( 작성 시점과 동일한 파일, 4004 행 ) 을 인스턴스화하고 시작 합니다.

마지막으로 PerformAdbBackupTask.run()라인 4151라인 4330 사이 에서 출력을 생성하기 시작 합니다.

먼저 run()4 또는 9 개의 ASCII 행으로 구성된 헤더를 작성합니다.

  1. "ANDROID BACKUP"
  2. 백업 형식 버전 : 현재 "4"
  3. "0"백업이 압축되지 않은 경우, 또는 "1"이 경우
  4. 암호화 방법 : 현재 "none"또는"AES-256"
  5. (암호화 된 경우), 16 진수로 인코딩 된 "사용자 비밀번호 소금", 모든 대문자
  6. (암호화 된 경우), 16 진수로 인코딩 된 "마스터 키 체크섬 솔트", 모든 대문자
  7. (암호화 된 경우) "사용 된 PBKDF2 라운드 수"를 10 진수로 표시 : 현재 "10000"
  8. (암호화 된 경우), 16 진수로 인코딩 된 "사용자 키의 IV", 모든 대문자
  9. (암호화 된 경우), 16 진수로 인코딩 된 "마스터 IV + 키 블로 브 (사용자 키로 암호화)", 모든 대문자

실제 백업 데이터 (압축 및 암호화)에 따라 하나로서, 다음 tar, deflate(tar), encrypt(tar), 또는 encrypt(deflate(tar)).

 

TODO : tar 출력을 생성하는 코드 경로를 작성하십시오. 항목이 올바른 순서로있는 한 tar를 사용하면됩니다 (아래 참조).

타르 아카이브 형식

앱 데이터는 _manifest 파일, a /의 APK (요청 된 경우), f /의 앱 파일, db /의 데이터베이스 및 sp /의 공유 기본 설정으로 시작하여 app / 디렉토리에 저장됩니다. -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 키는 임의로 생성 된 512 비트 솔트와 함께 10000 회의 PBKDF2를 사용하는 백업 암호화 비밀번호에서 파생됩니다.
  2. AES 256 마스터 키가 임의로 생성됩니다
  3. 마스터 키 '체크섬'은 10000 라운드의 PBKDF2를 통해 새로운 무작위로 생성 된 512 비트 솔트를 통해 마스터 키를 실행하여 생성됩니다.
  4. 무작위 백업 암호화 IV가 생성됩니다.
  5. IV, 마스터 키 및 체크섬은 1에서 파생 된 키로 연결되고 암호화됩니다. 결과 Blob은 헤더에 16 진 문자열로 저장됩니다.
  6. 실제 백업 데이터는 마스터 키로 암호화되어 파일 끝에 추가됩니다.

샘플 팩 / unpack 코드 구현 (생성 / 사용) 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
암호화 부분은 세부 사항을 찾아야하지만 키는 소금과 장치 잠금 해제 PIN, 암호 또는 패턴 (문자열로 변환)에 의해 PBKDF2를 사용하여 파생됩니다. 마스터 키는 임의로 생성되며 암호 파생 키로 암호화됩니다. 먼저 암호화되지 않은 아카이브에서 작동하도록하십시오. 암호 해독에 문제가 있으면 암호 해독 부분을 구현할 수 있습니다.
Nikolay Elenkov

키는 실제로 백업을 시작할 때 지정한 비밀번호를 기반으로 파생됩니다.
Nikolay Elenkov

@NikolayElenkov 아직 코드가 없지만 ab 파일을 조작하는 유틸리티를 작성할 계획입니다. Wrt 암호화, 나는 그것이 어렵다고 생각하지 않습니다; 단지 코드의 해당 부분 만 살펴 보았습니다. 마찬가지로 tar 스트림을 생성하는 코드 경로 (아직 작성되지 않음)를 추적했지만 실제 형식이 GNU tar인지 아직 확인하지 않았습니다.
jon

와우, 나는 당신의 분석에 감동합니다. BackupManagerService에서 간단한 그루비 스크립트로 일부 코드를 추출했지만 프로그램을 실행할 때 결과는 항상 동일합니다. 잘못된 비밀번호를 입력했습니다! 간단한 비밀번호로 새 백업을 만들었지 만 비밀번호 확인에 다시 실패했습니다. 현재 나는 실수를 찾기 위해 위에서 설명한 프로그램을 따르려고합니다.
ingorichter

7

Nikolay Elenkov의 훌륭하고 자세한 답변 . 그러나 누군가가 이미 그 일을하는 소프트웨어를 개발하고 여기에 패키지화했다고 덧붙여 야합니다 : http://sourceforge.net/projects/adbextractor/

패키지에는 Java 및 Perl 도구가 모두 포함되어 있습니다. 나는 하루 종일 Java보다 Perl을 선호하므로 Perl 코드를 추출하고 실행 가능한지 확인하고 필요한 Perl 라이브러리를 설치 한 후 backupdecrypt.pladb 백업 파일에 대해 실행하고 어떤 파일도없이 tar 또는 gzip으로 압축 된 tar 파일로 변환합니다. 발행물.

심지어 Bash 3에서 하나의 라이너를 형성하여 gzip으로 압축 된 tar 파일에 직접 adb 백업을 수행 할 수 있습니다.

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

도움이 되길 바랍니다.


6
예, 그들은 내가 작성한 도구 (Java)를 패키지했습니다 :) 나는 또한 물건을 Perl로 이식하는 것을 도왔습니다. README를 읽지 않았다면, 기록이 먼저 이루어 졌다는 것이 명백하지 않을 수도 있습니다 ....
Nikolay Elenkov

백업을 수행했지만 .ab 파일을 만들지 않고 대신 .backup 파일을 만들었습니다. 그것을 추출하는 방법을 알고 싶습니다. 또한 모든 사진과 비디오를 백업으로 찍은 지 확실하지 않습니까?
hajirazin

-4

기존 백업 파일을 탐색하려면 http://www.adb-backup.com 페이지를 시도 하십시오 . "dd", "tar", ...없이 간단합니다.

이 서버에는 데이터가 저장되지 않습니다. dd / tar를 사용하거나 추가 소프트웨어를 설치하지 않고도 백업을보다 쉽게 ​​볼 수 있도록이 온라인 서비스를 개발했습니다. 나는 저자 www.adb-backup.com


7
나는 것 매우 임의의 웹 사이트에 ADB 백업을 업로드 (및 암호를 제공하는)주의 ... 아시아 개발 은행 백업에 포함 된 데이터는 개인이고 당신은 사이트가 백업으로 무엇을하는지 알 방법이 없습니다. 무해 할 수는 있지만 권장하지는 않습니다.
bmdixon

Metasmoke에 따르면 이것은 스팸 URL 입니다. 그 외에도 저는 여기서 @bmdixon에 전적으로 동의합니다. 특히 안전한 방법이 존재하기 때문에 로컬에서 작업을 수행합니다.
Izzy

@Izzy Anyway 스팸으로 신고하여 SmokeDetector에보고했습니다.
iBug

이 서버에는 데이터가 저장되지 않습니다. dd / tar를 사용하거나 추가 소프트웨어를 설치하지 않고도 백업을보다 쉽게 ​​볼 수 있도록이 온라인 서비스를 개발했습니다. 저는 저자 www.adb-backup.com
Liszak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.