이 작업을 시작했습니다. 지금까지 두 가지 이유로 "커뮤니티 위키 (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/bu
com.android.commands.bu.Backup
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()
4 또는 9 개의 ASCII 행으로 구성된 헤더를 작성합니다.
"ANDROID BACKUP"
- 백업 형식 버전 : 현재
"4"
- 중
"0"
백업이 압축되지 않은 경우, 또는 "1"
이 경우
- 암호화 방법 : 현재
"none"
또는"AES-256"
- (암호화 된 경우), 16 진수로 인코딩 된 "사용자 비밀번호 소금", 모든 대문자
- (암호화 된 경우), 16 진수로 인코딩 된 "마스터 키 체크섬 솔트", 모든 대문자
- (암호화 된 경우) "사용 된 PBKDF2 라운드 수"를 10 진수로 표시 : 현재
"10000"
- (암호화 된 경우), 16 진수로 인코딩 된 "사용자 키의 IV", 모든 대문자
- (암호화 된 경우), 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
암호화 세부 사항
- AES 256 키는 임의로 생성 된 512 비트 솔트와 함께 10000 회의 PBKDF2를 사용하는 백업 암호화 비밀번호에서 파생됩니다.
- AES 256 마스터 키가 임의로 생성됩니다
- 마스터 키 '체크섬'은 10000 라운드의 PBKDF2를 통해 새로운 무작위로 생성 된 512 비트 솔트를 통해 마스터 키를 실행하여 생성됩니다.
- 무작위 백업 암호화 IV가 생성됩니다.
- IV, 마스터 키 및 체크섬은 1에서 파생 된 키로 연결되고 암호화됩니다. 결과 Blob은 헤더에 16 진 문자열로 저장됩니다.
- 실제 백업 데이터는 마스터 키로 암호화되어 파일 끝에 추가됩니다.
샘플 팩 / 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