Я пытаюсь реализовать приложение, которое будет отображать в текстовом виде все сообщения, полученные от WhatsApp. Есть ли способ сделать это? Можно ли извлечь все сообщения из WhatsApp?
Получить все сообщения от WhatsApp
Ответы (9)
Whatsapp хранит все сообщения в зашифрованной базе данных (pyCrypt), которую очень легко расшифровать с помощью Python.
Вы можете легко получить эту базу данных на Android, iPhone, Blackberry и сбросить ее в html-файл. Вот полные инструкции: Чтение, извлечение резервной копии сообщений WhatsApp на Android, iPhone, Blackberry
Отказ от ответственности: я исследовал и написал это подробное руководство.
Рабочий код Android: (рут не требуется)
Если у вас есть доступ к файлу dbcrypt5, вот код Android для его расшифровки:
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");
Редактировать
Поскольку WhatsApp приложил некоторые усилия для улучшения своей системы шифрования, получить данные уже не так просто. В более новых версиях WhatsApp больше нельзя использовать adb backup
. Приложения могут запрещать резервное копирование, и клиент WhatsApp делает это. Если у вас есть рутированный телефон, вы можете использовать корневую оболочку для получения незашифрованного файла базы данных.
Если у вас нет root, вы все равно можете расшифровать данные, если у вас есть старый APK WhatsApp. Найдите версию, которая по-прежнему позволяет создавать резервные копии. Затем вы можете сделать резервную копию папки данных приложения, которая будет содержать ключ шифрования с именем, ну, key
.
Теперь вам понадобится зашифрованная база данных. Используйте файловый менеджер по вашему выбору или, если вам больше нравится командная строка, используйте adb:
adb pull /sdcard/WhatsApp/Databases/msgstore.db.crypt12
Используя два файла, теперь вы можете использовать https://gitlab.com/digitalinternals/whatsapp-crypt12 чтобы получить текстовую базу данных. Больше нельзя использовать инструменты Linux Board, такие как openssl
, потому что WhatsApp использует модифицированную версию API Spongy Castle для криптографии, которую openssl не понимает.
Оригинальный ответ (только для старого crypt7)
Поскольку WhatsApp теперь использует формат crypt7, получить и расшифровать базу данных уже не так просто. Есть рабочий подход с использованием ADB и отладки по USB.
Вы можете либо получить ключи шифрования через ADB и расшифровать базу данных сообщений, хранящуюся на /sdcard, либо просто получить обычную версию базы данных через резервную копию ADB, что кажется более простым вариантом.
Чтобы получить базу данных, выполните следующие действия:
Подключите телефон Android к компьютеру. Теперь беги
adb backup -f whatsapp_backup.ab -noapk com.whatsapp
для резервного копирования всех файлов, созданных WhatsApp в своей личной папке.
Вы получите сжатый файл zlib в формате tar с некоторыми заголовками ADB. Сначала нам нужно избавиться от этих заголовков, поскольку они запутывают команду распаковки:
dd if=whatsapp_backup.ab ibs=1 skip=24 of=whatsapp_backup.ab.nohdr
Теперь файл можно распаковать:
cat whatsapp_backup.ab.nohdr | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" 1> whatsapp_backup.tar
Эта команда запускает Python и распаковывает файл с помощью zlib в whatsapp_backup.tar
Теперь мы можем распаковать файл:
tar xf whatsapp_backup.tar
Теперь архив извлечен в ваш текущий рабочий каталог, и вы можете найти базы данных (msgstore.db и wa.db) в apps/com.whatsapp/db/
Я думаю, что вы можете получить доступ к базе данных WhatsApp, расположенной на SD-карте, только как пользователь root. если вы откроете "\data\data\com.whatsapp", вы увидите, что "базы данных" связаны с "\firstboot\sqlite\com.whatsapp\"
Если вам действительно нужно что-то простое и вы знаете, как писать/запускать Python, взгляните на скрипт Bass Bosschert: источники
#!/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()))
Полный запуск:
(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>
Притам Барал упомянул еще более простой способ:
openssl aes-192-ecb -d -in msgstore.db.crypt -out msgstore.db -K 346a23652a46392b4d73257c67317e352e3372482177652c
Для корневых пользователей: whats app хранит все сообщения и контакты в файлах msgstore.db и wa.db в виде простого текста. Эти файлы доступны в /data/data/com.whatsapp/databases/. вы можете открыть эти файлы с помощью любого браузера sqlite, такого как браузер базы данных SQLite.
Да, это должны быть способы получения сообщений от WhatsApp, так как на рынке доступны некоторые инструменты, помогающие пользователям WhatsApp создавать резервные копии истории чатов WhatsApp на свой компьютер, я знаю об этом из здесь. Следовательно, вы должны быть в состоянии реализовать такое приложение. Может быть, вы можете найти эти инструменты на рынке, чтобы увидеть, как они работают.
Я не уверен, действительно ли WhatsApp хранит свои данные в базе данных sqlite, хранящейся в личном пространстве приложения, но, возможно, стоит попробовать сделать то же самое, что я предложил здесь. Для этого вам понадобится root-доступ.
Если понимать вопрос буквально:
Получить все сообщения от WhatsApp. Можно ли извлечь все сообщения из WhatsApp?
Тогда простой ответ заключается в том, что вы можете экспортировать чаты из WhatsApp (см. Часто задаваемые вопросы).
Теперь вы можете создать приложение, которое прослушивает событие WhatsApp Share и отображает все сообщения. Для простого PWA это может выглядеть так:
workbox.addEventListener("message", (m) => {
if (_this.$route.query.hasOwnProperty("receiving-file-share")) {
let files = m.data.file;
_this.$refs.filehandler.processFileList(files, true);
}
});
workbox.messageSW("SHARE_READY");