J'essaie d'implémenter une application qui affiche dans une vue en texte tous les messages reçus de Whatsapp. Y a-t-il un moyen de le faire? Est-il possible d'extraire tous les messages de Whatsapp?
Whatsapp stocke tous les messages dans une base de données cryptée (pyCrypt) très facile à déchiffrer avec Python.
Vous pouvez récupérer facilement cette base de données sur Android, iPhone, Blackberry et la vider dans un fichier html. Voici des instructions complètes: Lire, extraire la sauvegarde des messages WhatsApp sur Android, iPhone, Blackberry
Déni de responsabilité: J'ai effectué des recherches et rédigé ce guide détaillé.
Une fois que vous avez accès au fichier dbcrypt5, voici le code Android pour le déchiffrer:
private byte[] key = { (byte) 141, 75, 21, 92, (byte) 201, (byte) 255,
(byte) 129, (byte) 229, (byte) 203, (byte) 246, (byte) 250, 120,
25, 54, 106, 62, (byte) 198, 33, (byte) 166, 86, 65, 108,
(byte) 215, (byte) 147 };
private final byte[] iv = { 0x1E, 0x39, (byte) 0xF3, 0x69, (byte) 0xE9, 0xD,
(byte) 0xB3, 0x3A, (byte) 0xA7, 0x3B, 0x44, 0x2B, (byte) 0xBB,
(byte) 0xB6, (byte) 0xB0, (byte) 0xB9 };
long start = System.currentTimeMillis();
// create paths
backupPath = Environment.getExternalStorageDirectory()
.getAbsolutePath() + "/WhatsApp/Databases/msgstore.db.crypt5";
outputPath = Environment.getExternalStorageDirectory()
.getAbsolutePath() + "/WhatsApp/Databases/msgstore.db.decrypt";
File backup = new File(backupPath);
// check if file exists / is accessible
if (!backup.isFile()) {
Log.e(TAG, "Backup file not found! Path: " + backupPath);
return;
}
// acquire account name
AccountManager manager = AccountManager.get(this);
Account[] accounts = manager.getAccountsByType("com.google");
if (accounts.length == 0) {
Log.e(TAG, "Unable to fetch account!");
return;
}
String account = accounts[0].name;
try {
// calculate md5 hash over account name
MessageDigest message = MessageDigest.getInstance("MD5");
message.update(account.getBytes());
byte[] md5 = message.digest();
// generate key for decryption
for (int i = 0; i < 24; i++)
key[i] ^= md5[i & 0xF];
// read encrypted byte stream
byte[] data = new byte[(int) backup.length()];
DataInputStream reader = new DataInputStream(new FileInputStream(
backup));
reader.readFully(data);
reader.close();
// create output writer
File output = new File(outputPath);
DataOutputStream writer = new DataOutputStream(
new FileOutputStream(output));
// decrypt file
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec secret = new SecretKeySpec(key, "AES");
IvParameterSpec vector = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, secret, vector);
writer.write(cipher.update(data));
writer.write(cipher.doFinal());
writer.close();
} catch (NoSuchAlgorithmException e) {
Log.e(TAG, "Could not acquire hash algorithm!", e);
return;
} catch (IOException e) {
Log.e(TAG, "Error accessing file!", e);
return;
} catch (Exception e) {
Log.e(TAG, "Something went wrong during the encryption!", e);
return;
}
long end = System.currentTimeMillis();
Log.i(TAG, "Success! It took " + (end - start) + "ms");
Alors que WhatsApp s’efforçait d’améliorer son système de cryptage, obtenir les données n’était plus aussi facile. Avec les nouvelles versions de WhatsApp, il n’est plus possible d’utiliser adb backup
. Les applications peuvent refuser les sauvegardes et le client WhatsApp le fait. Si vous possédez un téléphone rooté, vous pouvez utiliser un shell root pour obtenir le fichier de base de données non crypté.
Si vous n'avez pas de racine, vous pouvez toujours déchiffrer les données si vous avez un ancien APK de WhatsApp. Recherchez une version qui autorise toujours les sauvegardes. Vous pouvez ensuite effectuer une sauvegarde du dossier de données de l'application, qui contiendra une clé de cryptage nommée, ainsi, key
.
Maintenant, vous aurez besoin de la base de données cryptée. Utilisez un explorateur de fichier de votre choix ou, si vous aimez plus la ligne de commande, utilisez adb:
adb pull /sdcard/WhatsApp/Databases/msgstore.db.crypt12
En utilisant les deux fichiers, vous pouvez maintenant utiliser https://gitlab.com/digitalinternals/whatsapp-crypt12 pour obtenir la base de données en texte brut. Il n’est plus possible d’utiliser des outils de conseil Linux comme openssl
, car WhatsApp semble utiliser une version modifiée de API de Spongy Castle pour une cryptographie que openssl ne comprend pas.
Comme WhatsApp utilise maintenant le format crypt7, il n’est plus aussi simple d’obtenir et de déchiffrer la base de données. Il existe une approche de travail utilisant le débogage ADB et USB.
Vous pouvez obtenir les clés de cryptage via ADB et décrypter la base de données de messages stockée sur/sdcard, ou vous obtenez simplement la version brute de la base de données via la sauvegarde ADB, ce qui semble être l'option la plus simple.
Pour obtenir la base de données, procédez comme suit:
Connectez votre téléphone Android à votre ordinateur. Maintenant, lancez
adb backup -f whatsapp_backup.ab -noapk com.whatsapp
sauvegarder tous les fichiers créés par WhatsApp dans son dossier privé.
Vous obtiendrez un fichier compressé zlib utilisant le format tar avec certains en-têtes ADB. Nous devons d'abord supprimer ces en-têtes car ils confondent la commande de décompression:
dd if=whatsapp_backup.ab ibs=1 skip=24 of=whatsapp_backup.ab.nohdr
Le fichier peut maintenant être décompressé:
cat whatsapp_backup.ab.nohdr | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" 1> whatsapp_backup.tar
Cette commande exécute Python) et décompresse le fichier à l'aide de zlib en whatsapp_backup.tar.
Nous pouvons maintenant décompresser le fichier:
tar xf whatsapp_backup.tar
L’archive est maintenant extraite dans votre répertoire de travail actuel et vous pouvez trouver les bases de données (msgstore.db et wa.db) dans apps/com.whatsapp/db /
Vous pouvez accéder à la base de données WhatsApp située sur la carte SD uniquement en tant qu'utilisateur root, je pense. si vous ouvrez "\ data\data\com.whatsapp", vous verrez que "bases de données" est lié à "\ firstboot\sqlite\com.whatsapp \"
Si vous voulez vraiment quelque chose de simple et que vous savez écrire/exécuter Python, jetez un coup d'œil au script Bas Bosschert: sources
#!/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()))
Course complète:
(scratch)ehtesh@ackee:/tmp/whatsapp$ mkvirtualenv whatsapp_decrypt
New python executable in whatsapp_decrypt/bin/python
Installing setuptools, pip...done.
(whatsapp_decrypt)ehtesh@ackee:/tmp/whatsapp$ pip install pycrypto >/dev/null
(whatsapp_decrypt)ehtesh@ackee:/tmp/whatsapp$ wget https://Gist.githubusercontent.com/shurane/ffa15e959e2d134086c9/raw/bc99a9997123bea0ea0acde185e24c7e89133559/whatsapp_decrypt.py >/dev/null
(whatsapp_decrypt)ehtesh@ackee:/tmp/whatsapp$ ls
msgstore.db.crypt whatsapp_decrypt.py
(whatsapp_decrypt)ehtesh@ackee:/tmp/whatsapp$ python whatsapp_decrypt.py msgstore.db.crypt
(whatsapp_decrypt)ehtesh@ackee:/tmp/whatsapp$ ls
msgstore.db.crypt msgstore.db whatsapp_decrypt.py
(whatsapp_decrypt)ehtesh@ackee:/tmp/whatsapp$ sqlite3 msgstore.db
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> PRAGMA table_info(messages);
0|_id|INTEGER|0||1
1|key_remote_jid|TEXT|1||0
2|key_from_me|INTEGER|0||0
3|key_id|TEXT|1||0
4|status|INTEGER|0||0
5|needs_Push|INTEGER|0||0
6|data|TEXT|0||0
7|timestamp|INTEGER|0||0
8|media_url|TEXT|0||0
9|media_mime_type|TEXT|0||0
10|media_wa_type|TEXT|0||0
11|media_size|INTEGER|0||0
12|media_name|TEXT|0||0
13|media_hash|TEXT|0||0
14|media_duration|INTEGER|0||0
15|Origin|INTEGER|0||0
16|latitude|REAL|0||0
17|longitude|REAL|0||0
18|thumb_image|TEXT|0||0
19|remote_resource|TEXT|0||0
20|received_timestamp|INTEGER|0||0
21|send_timestamp|INTEGER|0||0
22|receipt_server_timestamp|INTEGER|0||0
23|receipt_device_timestamp|INTEGER|0||0
24|raw_data|BLOB|0||0
25|recipient_count|INTEGER|0||0
sqlite>
Pritam Baral a mentionné un moyen encore plus simple:
openssl aes-192-ecb -d -in msgstore.db.crypt -out msgstore.db -K 346a23652a46392b4d73257c67317e352e3372482177652c
Pour les utilisateurs rootés: ce qui est app store tous les messages et contacts dans les fichiers msgstore.db et wa.db en texte brut. Ces fichiers sont disponibles dans /data/data/com.whatsapp/databases/. vous pouvez ouvrir ces fichiers en utilisant n’importe quel navigateur sqlite tel que SQLite Database Browser.
Oui, il doit y avoir des moyens d'obtenir des messages de WhatsApp, car certains outils disponibles sur le marché aident les utilisateurs de WhatsApp à sauvegarder l'historique des discussions WhatsApp sur leur ordinateur. Je le sais depuis ici . Par conséquent, vous devez être capable de mettre en œuvre ce type d'application. Peut-être que vous pouvez trouver ces outils sur le marché pour voir comment ils fonctionnent.
Je ne sais pas si WhatsApp stocke vraiment ces éléments dans une base de données sqlite stockée dans l'espace réservé aux applications privées, mais cela vaut peut-être la peine d'essayer de faire la même chose que j'ai suggérée ici . Vous aurez besoin d'un accès root pour cela.