Existe uma maneira de olhar para dentro e modificar um arquivo criado por backup adb?

40

Criei um backup do meu Galaxy Nexus com adb backup. O arquivo resultante é chamado backup.db e, de alguma forma, é criptografado.

Eu queria restaurar o backup, mas ele para quando se trata de restauração com.android.providers.contacts. Eu costumava adb logcatdescobrir o que estava acontecendo e descobri que com.android.acorefalhas durante o processo de restauração.

Gostaria de obter acesso aos dados no backup e remover o banco de dados de contatos para restaurar tudo de volta ao meu telefone. Existem outras maneiras de restaurar os dados do backup?

ingorichter
fonte

Respostas:

14

O arquivo não é criptografado, a menos que você o especifique ao criar o backup. No entanto, é compactado (usando deflate). Você pode descobrir o formato exato olhando o código-fonte do Android (com / android / server / BackupManagerService.java) e, tecnicamente, deve conseguir extrair dados específicos dele. No entanto, para o IIRC, existem algumas verificações de integridade de arquivos, portanto, provavelmente não funcionará se você excluir apenas um monte de dados. Infelizmente, o restorecomando não parece ter uma opção para restaurar apenas um aplicativo / pacote específico ou excluir um pacote.

Nikolay Elenkov
fonte
Obrigado! Esse é pelo menos um ponto de partida para olhar dentro do arquivo. Teria sido mais fácil se eu não tivesse fornecido uma senha para o backup.
ingorichter 23/05
Se você forneceu uma senha, ela é realmente criptografada. O `BackupManagerService 'possui detalhes sobre os algoritmos de criptografia reais, e os parâmetros de derivação de chave (salt, contagem de iterações etc.) são escritos no cabeçalho do arquivo. Como você conhece a senha, é possível derivar a chave e descriptografar os dados. Portanto, ainda é factível, mas não particularmente fácil ...
Sim, atualmente estou extraindo tudo BackupManagerServicepara ler o conteúdo do arquivo de backup. É uma boa quantidade de trabalho, mas eu preciso do meu dados de volta ...
ingorichter
@ingorichter algum progresso?
jon
@ingorichter Comecei a trabalhar nisso e publiquei várias notas abaixo, em uma resposta "wiki da comunidade". Sinta-se Livre Para Adicionar a Ele.
jon
50

Comecei a trabalhar nisso. Estou postando meus resultados até agora aqui como uma resposta "wiki da comunidade" por dois motivos: primeiro, se alguém quiser participar, há um lugar para conversar; segundo, se eu me afastar desse projeto, haverá dicas para alguém começar a trabalhar.

 

A lógica de backup no host está totalmente contida em https://github.com/android/platform_system_core/blob/master/adb/commandline.cpp , na função nomeada backup. A função é muito simples: valida as opções da linha de comando, envia o comando principalmente como está para o daemon adb no telefone e grava a saída do telefone no arquivo. Não há nem verificação de erros: se, por exemplo, você recusar o backup no telefone, adbbasta gravar um arquivo vazio.

No telefone, a lógica de backup inicia service_to_fd()em https://github.com/android/platform_system_core/blob/master/adb/services.cpp . A função identifica que o comando do host é "backup"e transmite o comando não analisado para /system/bin/bu, que é um script de shell trivial para iniciar com.android.commands.bu.Backupcomo a classe principal de um novo processo de aplicativo Android. Isso chama ServiceManager.getService("backup")para obter o serviço de backup como IBackupManagere chama IBackupManager.fullBackup(), passando a ele o descritor de arquivo ainda não utilizado (muito indiretamente) conectado ao backup.abarquivo no host.

O controle passa para fullBackup()em com.android.server.backup.BackupManagerService , que exibe a GUI solicitando ao usuário que confirme / rejeite o backup. Quando o usuário faz isso, acknowledgeFullBackupOrRestore()(mesmo arquivo) é chamado. Se o usuário aprovou a solicitação, acknowledgeFullBackupOrRestore()descobre se o backup está criptografado e passa uma mensagem para BackupHandler(mesmo arquivo.), Em BackupHandlerseguida, instancia e inicia um PerformAdbBackupTask( mesmo arquivo, linha 4004 no momento da gravação).

Finalmente começamos a gerar saída láPerformAdbBackupTask.run() , entre as linhas 4151 e 4330 .

Primeiro, run()escreve um cabeçalho, que consiste em 4 ou 9 linhas ASCII:

  1. "ANDROID BACKUP"
  2. a versão do formato de backup: atualmente "4"
  3. tanto "0"se o backup é descompactado ou "1"se é
  4. o método de criptografia: atualmente um "none"ou"AES-256"
  5. (se criptografado), o "sal da senha do usuário" codificado em hexadecimal, todas as maiúsculas
  6. (se criptografado), o "sal da soma de verificação da chave mestra" codificado em hexadecimal, todas as maiúsculas
  7. (se criptografado), o "número de rodadas de PBKDF2 usadas" como um número decimal: atualmente "10000"
  8. (se criptografado), o "IV da chave do usuário" codificado em hexadecimal, todas as maiúsculas
  9. (se criptografado), o "blob principal da chave IV +, criptografado pela chave do usuário" codificado em hexadecimal, todas as maiúsculas

Os dados de backup real segue, quer como (dependendo de compressão e de criptografia) tar, deflate(tar), encrypt(tar), ou encrypt(deflate(tar)).

 

TODO : escreva o caminho do código que gera a saída do tar - você pode simplesmente usar o tar desde que as entradas estejam na ordem correta (veja abaixo).

Formato de arquivo Tar

Os dados do aplicativo são armazenados no diretório app /, começando com um arquivo _manifest, o APK (se solicitado) em /, arquivos de aplicativo em f /, bancos de dados em db / e preferências compartilhadas em sp /. Se você solicitou um backup de armazenamento externo (usando a opção -shared), também haverá um diretório / compartilhado no arquivo que contém arquivos de armazenamento externo.

$ 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

Detalhes de criptografia

  1. Uma chave AES 256 é derivada da senha de criptografia de backup usando 10000 rodadas de PBKDF2 com um sal de 512 bits gerado aleatoriamente.
  2. Uma chave mestra AES 256 é gerada aleatoriamente
  3. Uma chave mestra 'checksum' é gerada executando a chave mestra por 10000 rodadas de PBKDF2 com um novo sal de 512 bits gerado aleatoriamente.
  4. Uma criptografia de backup aleatória IV é gerada.
  5. A IV, chave mestra e soma de verificação são concatenadas e criptografadas com a chave derivada em 1. O blob resultante é salvo no cabeçalho como uma sequência hexadecimal.
  6. Os dados de backup reais são criptografados com a chave mestra e anexados ao final do arquivo.

Exemplo de implementação de código de pacote / descompactação (produz / usa) arquivos tar: https://github.com/nelenkov/android-backup-extractor

Mais alguns detalhes aqui: http://nelenkov.blogspot.com/2012/06/unpacking-android-backups.html

Scripts Perl para empacotar / descompactar e corrigir arquivos quebrados:

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

jon
fonte
Se você colocar o código em algum lugar, eu posso entrar. O OP (@ngorichter) provavelmente também tem algum código de trabalho agora :) Um utilitário que descompacta e extrai os arquivos reais pode ser útil, para que você possa restaurar apenas partes (se tiver raiz, é claro).
Nikolay Elenkov
11
Quanto à parte de criptografia, preciso procurar os detalhes, mas a chave é derivada usando PBKDF2 pelo PIN, senha ou padrão de desbloqueio por sal e dispositivo (convertido em string). A chave mestra é gerada aleatoriamente e criptografada com a chave derivada da senha. Faça com que funcione primeiro para arquivos não criptografados. Posso implementar a parte de descriptografia se você estiver tendo problemas com ela.
Nikolay Elenkov
Desculpe, a chave é realmente derivada com base na senha especificada ao iniciar o backup.
Nikolay Elenkov
@NikolayElenkov Ainda não tenho código, mas pretendo escrever um utilitário para manipular arquivos ab. Criptografia Wrt, não acho que seja difícil; é só que eu só dei uma olhada nessa parte do código. Da mesma forma, eu tracei o caminho do código (ainda não escrito acima) que gera o fluxo tar, mas ainda não verifiquei se o formato real é o tar GNU.
jon
Uau, estou impressionado com a sua análise. Eu extraí algum código do BackupManagerService em um script simples, mas quando executo o programa, o resultado é sempre o mesmo: senha incorreta digitada! Criei um novo backup com uma senha simples, mas a verificação da senha falhou novamente. Atualmente, tento seguir o programa conforme descrito acima para encontrar meu erro.
ingorichter 31/05
7

Resposta ótima e detalhada de Nikolay Elenkov . No entanto, devo acrescentar que alguém já desenvolve um software que faz exatamente isso e o empacota aqui: http://sourceforge.net/projects/adbextractor/

O pacote contém as ferramentas Java e Perl. Eu mesmo prefiro o Perl do que Java a qualquer dia, então extraí os códigos do Perl, verifique se eles são executáveis, instalei a biblioteca Perl necessária e backupdecrypt.plexecutei um arquivo de backup adb e o converti em um arquivo tar ou gzip tar sem nenhum questão.

Até formei um liner no Bash 3 que me permite fazer backup adb diretamente no arquivo tar compactado com gzip:

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

Espero que ajude.

SP Arif Sahari Wibowo
fonte
6
Sim, eles empacotaram a ferramenta (a Java) que eu escrevi :) Eu também ajudei a portar a coisa para o Perl. Se você não leu os READMEs, pode não ser imediatamente aparente que o writeup veio primeiro, depois as ferramentas ....
Nikolay Elenkov
Fiz um backup, mas ele não criou o arquivo .ab, em vez disso, ele criou o arquivo .backup. Eu quero saber como extraí-lo. Também não tenho certeza se ele tirou todas as fotos e vídeos como backup?
precisa saber é o seguinte
-4

Para explorar o arquivo de backup existente, tente a página http://www.adb-backup.com , é simples sem "dd", "tar", ...

Os dados não são armazenados neste servidor. Desenvolvi esse serviço online para facilitar a exibição de backups sem manipular o dd / tar ou instalar software adicional. Sou autor www.adb-backup.com

Liszak
fonte
7
Seria muito cuidadoso ao enviar um backup adb (e fornecer a senha) para um site aleatório ... Os dados incluídos no backup adb são privados e você não tem como saber o que o site faz com o backup. Pode ser inofensivo, mas eu não recomendo fazer isso.
bmdixon
Segundo o Metasmoke, este é um URL de spam . Além disso, concordo plenamente com o @bmdixon aqui - especialmente porque existem maneiras seguras de executar a tarefa localmente.
Izzy
@ Izzy De qualquer forma, eu sinalizei como spam e relatei para SmokeDetector.
iBug 21/01
Os dados não são armazenados neste servidor. Desenvolvi esse serviço online para facilitar a exibição de backups sem manipular com dd / tar ou instalar software adicional. Eu sou autor www.adb-backup.com
Liszak