Whatsapp nuovamente ha cambiato l’algoritmo per crittografare la cronologia dei messaggi salvati sullo smartphone.
Questo nuovo metodo crittografico è denotato dall’estensione .crypt7.

Per decrittare i file crypt7, servono due chiavi – La chiave crittografica, K, e un vettore d’inizializzazione chiamato IV. Whatsapp salva queste chiavi in una locazione “sicura”.

/data/data/com.whatsapp/files/key

Presentiamo qui di seguito, una guida pratica su come ottenere le chiavi e passare al decrypt delle conversazioni. La guida prevede l’uso da parte dell’utente di un sistema basato su Linux, se volete effettuare lo stesso procedimento su windows, si consiglia l’installazione di Cygwin.

[UPDATE] Versione aggiornata: Script Automatico

Se volete risparmiare tempo e avete lo smartphone con una versione di Android 4.0 o superiore, potete usare uno script che automatizza l’intera operazione!

Altrimenti proseguite con la guida…

Ottenere la Chiave dallo Smartphone

Ci sono due modi per estrarre la chiave. Il primo metodo è possibile se il dispositivo è rootato. Usando la shell ADB, passate ai permessi root e copiate la chiave sulla scheda SD:


$ adb shell
android$ su
android# cp /data/data/com.whatsapp/files/key /sdcard
android# exit
android$ exit

Una volta che il file è stato copiato sulla scheda SD, usate nuovamente ADB per copiarlo sul vostro computer.

$ adb pull /sdcard/key

Il secondo metodo invece, per estrarre la chiave prevede l’uso del ADB Backup. Questo richiede una versione di Android 4 o superiore. (Usare ADB Backup richiede l’installazione dell’intero SDK Android, sul forum di XDA si trova una pratica versione mobile di ADB, leggera e perfetta allo scopo)
Per effettuare il backup lanciate il comando:

$ adb backup -f whatsapp.ab -noapk com.whatsapp

Questo aprirà un prompt sul vostro cellulare. Cliccate sul pulsante “Back up my data” senza fornire una password.

adb-backup-prompt

Una volta che il backup è completato, vedrete un file chiamato whatsapp.ab sul vostro computer. L’estensione .ab sta per Android Backup. Per estrarre i file contenuti al suo interno, dobbiamo convertirlo innanzitutto in un archivio tar.

$ dd if=whatsapp.ab ibs=24 skip=1 | openssl zlib -d > whatsapp.tar

Determiniamo la posizione della chiave all’interno dell’archivio:

$ tar tvf whatsapp.tar | grep key
-rw------- 10188/10188 158 2014-05-06 12:47 apps/com.whatsapp/f/key

La chiave sarà al percorso “apps/com.whatapp/f/key”. Estraiamo la chiave e spostiamola nella directory di lavoro corrente:

$ tar xf whatsapp.tar apps/com.whatsapp/f/key
$ mv apps/com.whatsapp/f/key .

Verifichiamo che la chiave estratta sia esattamente 158 bytes. Se corrisponde la dimensione, passiamo allo step successivo.

Estrazione del database di messaggi crittografato in crypt7

Usando ADB possiamo estrarre il database dei messaggi:

$ adb pull /sdcard/WhatsApp/Databases/msgstore.db.crypt7

Estrarre la chiave

Il metodo crittografico usato per crittografare la password è AES con una lunghezza di 256 bit e un vettore d’inizializzazione di 128 bit.
La chiave AES da 256-bit è salvata nel file “key” dall’offset 0x7E fino a 0x9D. Partendo da 0x00.
Possiamo estrarre la chiave usando hexdump:

$ hexdump -e '2/1 "%02x"' key | cut -b 253-316

Otterremo così un valore esadecimale a 64 cifre, di lunghezza 256 bit.

Procediamo ora estraendo il vettore d’inizializzazione IV:

$ hexdump -e '2/1 "%02x"' key | cut -b 221-252

Questo ci darà un valore esadecimale da 32 cifre, di lunghezza 128 bit.

Ricaviamo gli header dal file crypt7

Prima di iniziare il processo di decrypt, abbiamo bisogno dell’header di 67 byte del file crypt7.

$ dd if=msgstore.db.crypt7 of=msgstore.db.crypt7.nohdr ibs=67 skip=1

Il comando estrarrà ciò che ci serve e lo salverà nel file crypt7.nohdr.
Nota bene, il file di header dev’essere divisibile per 128 bit o 16 bytes, se così non è, probabilmente è corrotto.

$ ls -l msgstore.db.crypt7.nohdr
-rw-r--r--+ 1 ibrahim users 12660752 May 24 17:53 msgstore.db.crypt7.nohdr

Decrypt delle conversazioni

Arrivati qui, avremo tutti i parametri necessari per decrittare le conversazioni.

$ openssl enc -aes-256-cbc -d -nosalt -nopad -bufsize 16384 -in msgstore.db.crypt7.nohdr -K $k -iv $iv > msgstore.db

Sostituite $k e $iv con la chiave AES e il vettore IV trovati usando hexdump negli step sopra.
Il risultato del comando sarà un database SQLite non crittato salvato nel file msgstore.db.

FINE!
Per qualsiasi dubbio non esitate a commentare.

Si ringrazia digitalinternals per le referenze.