C'è un modo per guardare dentro e modificare un file creato dal backup adb?


40

Ho creato un backup del mio Galaxy Nexus con adb backup. Il file risultante si chiama backup.db ed è in qualche modo crittografato.

Volevo ripristinare il backup, ma si interrompe quando si tratta di ripristinare com.android.providers.contacts. Ho adb logcatscoperto cosa stava succedendo e ho scoperto che si com.android.acorearresta in modo anomalo durante il processo di ripristino.

Vorrei ottenere l'accesso ai dati nel backup e rimuovere il database dei contatti per ripristinare tutto sul mio telefono. Esistono altri modi per ripristinare i dati dal backup?

Risposte:


14

Il file non è crittografato, a meno che non sia specificato dall'utente al momento della creazione del backup. È comunque compresso (usando deflate). Puoi scoprire il formato esatto guardando il codice sorgente Android (com / android / server / BackupManagerService.java) e, tecnicamente, dovrebbe essere in grado di estrarre dati specifici da esso. Tuttavia, IIRC, esistono alcuni controlli di integrità dei file, quindi molto probabilmente non funzionerà se si elimina solo un mucchio di dati da esso. Sfortunatamente il restorecomando non sembra avere un'opzione per ripristinare solo una particolare app / pacchetto o escludere un pacchetto.


Grazie! Questo è almeno un punto di partenza per guardare all'interno del file. Sarebbe stato più semplice se non avessi fornito una password per il backup.
ingorichter,

Se hai fornito una password, è effettivamente crittografata. "BackupManagerService" contiene dettagli sugli algoritmi di crittografia effettivi e i parametri di derivazione delle chiavi (salt, conteggio iterazioni ecc.) Sono scritti nell'intestazione del file. Poiché conosci la password, puoi derivare la chiave e decrittografare i dati. Quindi è ancora fattibile, ma non particolarmente facile ...

Sì, attualmente sto estraendo tutto BackupManagerServiceper leggere il contenuto del file di backup. È un buon lavoro, ma ho bisogno dei miei dati ...
ingorichter,

@ingorichter qualche progresso?
jon

@ingorichter Ho iniziato a lavorare su questo e ho pubblicato un sacco di note di seguito, in una risposta "wiki comunità". Sentiti libero di aggiungere ad esso.
jon

50

Ho iniziato a lavorarci su. Sto pubblicando i miei risultati finora qui come una risposta "wiki della comunità" per due motivi: primo, se qualcun altro vuole partecipare, c'è un posto dove parlare; secondo, se mi stacco da questo progetto, ci saranno suggerimenti per qualcun altro che inizi a lavorare.

 

La logica di backup sull'host è interamente contenuta in https://github.com/android/platform_system_core/blob/master/adb/commandline.cpp , nella funzione denominata backup. La funzione è molto semplice: convalida le opzioni della riga di comando, invia il comando principalmente com'è al demone adb sul telefono e scrive l'output del telefono nel file. Non c'è nemmeno il controllo degli errori: se, ad esempio, si rifiuta il backup sul telefono, adbscrive solo un file vuoto.

Al telefono, la logica di backup inizia service_to_fd()in https://github.com/android/platform_system_core/blob/master/adb/services.cpp . La funzione identifica il comando dall'host "backup"e passa il comando non analizzato a /system/bin/bu, che è un banale script di shell da avviare com.android.commands.bu.Backupcome classe principale di un nuovo processo di app Android. Che chiama ServiceManager.getService("backup")per ottenere il servizio di backup come IBackupManager, e chiama IBackupManager.fullBackup(), passandogli il descrittore di file ancora inutilizzato (molto indirettamente) collegato al backup.abfile sull'host.

Il controllo passa al fullBackup()di com.android.server.backup.BackupManagerService , che si apre la GUI che chiede all'utente di confermare / rifiutare il backup. Quando l'utente lo fa, acknowledgeFullBackupOrRestore()viene chiamato (stesso file). Se l'utente approva la richiesta, acknowledgeFullBackupOrRestore()scopre se il backup è crittografato e passa un messaggio a BackupHandler(stesso file.) BackupHandlerQuindi crea un'istanza e dà il via a uno PerformAdbBackupTask( stesso file, riga 4004 al momento della scrittura)

Iniziamo finalmente a generare output lì, inPerformAdbBackupTask.run() , tra la linea 4151 e la linea 4330 .

Innanzitutto, run()scrive un'intestazione, che consiste in 4 o 9 righe ASCII:

  1. "ANDROID BACKUP"
  2. la versione del formato di backup: attualmente "4"
  3. o "0"se il backup non è compresso o "1"se si tratta di
  4. il metodo di crittografia: attualmente "none"o"AES-256"
  5. (se crittografato), la "password utente salt" codificata in esadecimale, tutto maiuscolo
  6. (se crittografato), il "sale di checksum della chiave master" codificato in esadecimale, tutto maiuscolo
  7. (se crittografato), il "numero di round PBKDF2 utilizzati" come numero decimale: attualmente "10000"
  8. (se crittografato), il "IV della chiave utente" codificato in esadecimale, tutto maiuscolo
  9. (se crittografato), il "BLOB chiave IV + master, crittografato dalla chiave utente" codificato in esadecimale, maiuscolo

I dati di backup effettivo segue, sia in (a seconda della compressione e cifratura) tar, deflate(tar), encrypt(tar), o encrypt(deflate(tar)).

 

TODO : scrivi il percorso del codice che genera l'output tar - puoi semplicemente usare tar fintanto che le voci sono nell'ordine corretto (vedi sotto).

Formato archivio tar

I dati dell'app vengono archiviati nella directory app /, iniziando con un file _manifest, l'APK (se richiesto) in a /, i file app in f /, i database in db / e le preferenze condivise in sp /. Se hai richiesto il backup della memoria esterna (usando l'opzione -shared), ci sarà anche una directory condivisa / nell'archivio che contiene i file della memoria esterna.

$ 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

Dettagli di crittografia

  1. Una chiave AES 256 viene derivata dalla password di crittografia di backup utilizzando 10000 round di PBKDF2 con un salt a 512 bit generato casualmente.
  2. Una chiave master AES 256 viene generata casualmente
  3. Una "somma di controllo" della chiave principale viene generata eseguendo la chiave principale attraverso 10000 round di PBKDF2 con un nuovo sale a 512 bit generato casualmente.
  4. Viene generata una crittografia di backup casuale IV.
  5. IV, chiave master e checksum vengono concatenati e crittografati con la chiave derivata in 1. Il BLOB risultante viene salvato nell'intestazione come stringa esadecimale.
  6. I dati di backup effettivi vengono crittografati con la chiave principale e aggiunti alla fine del file.

Esempio di implementazione del pacchetto / decompressione del codice (produce / utilizza) archivi tar: https://github.com/nelenkov/android-backup-extractor

Alcuni maggiori dettagli qui: http://nelenkov.blogspot.com/2012/06/unpacking-android-backups.html

Script Perl per l'imballaggio / disimballaggio e il fissaggio di archivi rotti:

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


Se metti il ​​codice da qualche parte, potrei unirmi. L'OP (@ngorichter) probabilmente ha anche un po 'di codice funzionante ormai :) Un'utilità che decomprime ed estrae i file effettivi potrebbe essere utile, in modo che sia possibile ripristinare solo parti (se ovviamente si ha root).
Nikolay Elenkov

1
Per quanto riguarda la parte di crittografia, devo cercarla per i dettagli, ma la chiave viene derivata usando PBKDF2 dal PIN, password o sequenza di sblocco salt e dispositivo (convertiti in stringa). La chiave master viene generata in modo casuale e crittografata con la chiave derivata dalla password. Fallo funzionare prima per gli archivi non crittografati. Posso implementare la parte di decodifica in caso di problemi.
Nikolay Elenkov

Spiacenti, la chiave viene effettivamente derivata in base alla password specificata all'avvio del backup.
Nikolay Elenkov

@NikolayElenkov Non ho ancora alcun codice, ma ho intenzione di scrivere un'utilità per manipolare i file ab. Crittografia scritta, non penso che sarà difficile; è solo che ho dato un'occhiata a quella parte del codice. Allo stesso modo, ho tracciato il percorso del codice (non ancora scritto sopra) che genera il flusso tar, ma non ho ancora verificato che il formato effettivo sia tar GNU.
jon

Wow, sono impressionato dalla tua analisi. Ho estratto del codice da BackupManagerService in un semplice script groovy, ma quando eseguo il programma il risultato è sempre lo stesso: immessa password errata! Ho creato un nuovo backup con una semplice password, ma la verifica della password non è riuscita nuovamente. Attualmente provo a seguire il programma come descritto sopra per trovare il mio errore.
ingorichter,

7

Grande e dettagliata risposta di Nikolay Elenkov . Tuttavia, dovrei aggiungere che qualcuno già sviluppa un software che fa proprio questo e lo impacchetta qui: http://sourceforge.net/projects/adbextractor/

Il pacchetto contiene sia lo strumento Java che Perl. Io stesso preferisco Perl su Java ogni giorno, quindi ho estratto i codici Perl, assicurandomi che siano eseguibili, installato la libreria Perl richiesta ed eseguito il backupdecrypt.plcontro un file di backup adb, e lo converte in un file tar o tar tar senza alcun problema.

Ho persino formato un solo liner in Bash 3 che mi permette di fare il backup adb direttamente nel file tar gzip:

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

Spero che sia d'aiuto.


6
Sì, hanno impacchettato lo strumento (quello Java) che ho scritto :) Ho anche aiutato a portarlo su Perl. Se non hai letto i README, potrebbe non essere immediatamente evidente che la scrittura è arrivata prima, quindi gli strumenti ....
Nikolay Elenkov,

Ho eseguito il backup ma non ha creato il file .ab, ma ha creato il file .backup. Voglio sapere come estrarlo. Inoltre non sono sicuro se ha preso tutte le foto e i video come backup?
hajirazin,

-4

Per esplorare il file di backup esistente, provare la pagina http://www.adb-backup.com , è semplice senza "dd", "tar", ...

I dati non sono memorizzati su questo server. Ho sviluppato questo servizio online per semplificare la visualizzazione dei backup senza manipolare con dd / tar o l'installazione di software aggiuntivo. Sono l'autore www.adb-backup.com


7
Starei molto attento a caricare un backup adb (e fornire la password) su un sito Web casuale ... I dati inclusi nel backup adb sono privati ​​e non hai modo di sapere cosa fa il sito con il backup. Potrebbe essere innocuo, ma non consiglierei di farlo.
bmdixon,

Secondo Metasmoke, questo è un URL di spam . A parte questo, sono pienamente d'accordo con @bmdixon qui - specialmente perché esistono modi sicuri per eseguire l'attività localmente.
Izzy

@Izzy Comunque ho segnalato come spam e segnalato a SmokeDetector.
iBug

I dati non sono memorizzati su questo server. Ho sviluppato questo servizio online per semplificare la visualizzazione dei backup senza manipolare con dd / tar o l'installazione di software aggiuntivo. Sono l'autore www.adb-backup.com
Liszak il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.