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?
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.
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 algum progresso?
@ingorichter Comecei a trabalhar nisso e publiquei várias notas abaixo, em uma resposta "wiki da comunidade". Sinta-se Livre Para Adicionar a Ele.
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:
a versão do formato de backup: atualmente "4"
tanto "0"se o backup é descompactado ou "1"se é
o método de criptografia: atualmente um "none"ou"AES-256"
(se criptografado), o "sal da senha do usuário" codificado em hexadecimal, todas as maiúsculas
(se criptografado), o "sal da soma de verificação da chave mestra" codificado em hexadecimal, todas as maiúsculas
(se criptografado), o "número de rodadas de PBKDF2 usadas" como um número decimal: atualmente "10000"
(se criptografado), o "IV da chave do usuário" codificado em hexadecimal, todas as maiúsculas
(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).
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.
Uma chave mestra 'checksum' é gerada executando a chave mestra por 10000 rodadas de PBKDF2 com um novo sal de 512 bits gerado aleatoriamente.
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.
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:
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).
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.
Desculpe, a chave é realmente derivada com base na senha especificada ao iniciar o backup.
@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.
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
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:
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 ....
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?
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
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.
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 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