Я пытаюсь реализовать приложение, которое будет отображать в текстовом виде все сообщения, полученные от Whatsapp. Есть ли способ сделать это? Можно ли извлечь все сообщения из Whatsapp?
Получить все сообщения от Whatsapp
Ответ 1
Whatsapp хранит все сообщения в зашифрованной базе данных (pyCrypt), которые очень легко расшифровывать с помощью Python.
Вы можете легко загрузить эту базу данных на Android, iPhone, Blackberry и выгрузить ее в html файл. Ниже приведены полные инструкции: Чтение, извлечение резервных копий WhatsApp Messages на Android, iPhone, Blackberry
Отказ от ответственности: я исследовал и написал это обширное руководство.
Ответ 2
Рабочий код для Android: (не требуется root)
Как только у вас есть доступ к файлу 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");
Ответ 3
Изменить
Как WhatsApp прилагает некоторые усилия для улучшения своей системы шифрования, получение данных не так просто. С более новыми версиями WhatsApp больше нельзя использовать adb backup
. Приложения могут отказать в резервном копировании, и клиент WhatsApp делает это. Если у вас есть корневой телефон, вы можете использовать корневую оболочку для получения файла незашифрованной базы данных.
Если у вас нет root, вы можете расшифровать данные, если у вас старый APC WhatsApp. Найдите версию, которая по-прежнему позволяет создавать резервные копии. Затем вы можете сделать резервную копию папки данных приложения, которая будет содержать ключ шифрования, ну, key
.
Теперь вам понадобится зашифрованная база данных. Используйте проводник файлов по вашему выбору или, если вам больше нравится командная строка, используйте adb:
adb pull /sdcard/WhatsApp/Databases/msgstore.db.crypt12
Используя два файла, вы можете теперь использовать https://gitlab.com/digitalinternals/whatsapp-crypt12, чтобы получить базу данных обычного текста. Больше не возможно использовать инструменты платформы Linux, такие как openssl
, потому что WhatsApp, похоже, использует модифицированную версию Spongy Castle API для криптографии, которая openssl не понимает.
Оригинальный ответ (только для старого crypt7)
Поскольку whatsapp теперь использует формат crypt7, получить и расшифровать базу данных не так просто. Существует рабочий подход с использованием ADB и USB-отладки.
Вы можете получить ключи шифрования через ADB и дешифровать базу данных сообщений, хранящуюся на /sdcard, или просто получить обычную версию базы данных через резервное копирование АБР, что кажется более простым вариантом.
Чтобы получить базу данных, сделайте следующее:
Подключите телефон 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) в приложениях/com.whatsapp/db/
Ответ 4
Вы можете получить доступ к базе данных WhatsApp, расположенной на SD-карте, только как пользователь root. если вы откроете "\ data\data\com.whatsapp", вы увидите, что "базы данных" связаны с "\ firstboot\sqlite\com.whatsapp \"
Ответ 5
Для корневых пользователей: whats app хранит все сообщения и контакты в файлах msgstore.db и wa.db в текстовом формате. Эти файлы доступны в /data/data/com.whatsapp/databases/. вы можете открыть эти файлы с помощью любого SQL-браузера, такого как SQLite Database Browser.
Ответ 6
Если вы действительно хотите что-то простое и знаете, как писать/запускать Python, посмотрите на script Bas 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)[email protected]:/tmp/whatsapp$ mkvirtualenv whatsapp_decrypt
New python executable in whatsapp_decrypt/bin/python
Installing setuptools, pip...done.
(whatsapp_decrypt)[email protected]:/tmp/whatsapp$ pip install pycrypto >/dev/null
(whatsapp_decrypt)[email protected]:/tmp/whatsapp$ wget https://gist.githubusercontent.com/shurane/ffa15e959e2d134086c9/raw/bc99a9997123bea0ea0acde185e24c7e89133559/whatsapp_decrypt.py >/dev/null
(whatsapp_decrypt)[email protected]:/tmp/whatsapp$ ls
msgstore.db.crypt whatsapp_decrypt.py
(whatsapp_decrypt)[email protected]:/tmp/whatsapp$ python whatsapp_decrypt.py msgstore.db.crypt
(whatsapp_decrypt)[email protected]:/tmp/whatsapp$ ls
msgstore.db.crypt msgstore.db whatsapp_decrypt.py
(whatsapp_decrypt)[email protected]:/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
Ответ 7
Я не уверен, действительно ли WhatsApp хранит его в базе данных sqlite, хранящейся в закрытом пространстве приложения, но, возможно, стоит попытаться сделать то же самое, что я предложил здесь. Для этого вам понадобится root-доступ.
Ответ 8
WhatsApp Xtract, см. следующие ссылки:
Ответ 9
Да, это должны быть способы получить msgs из WhatsApp, так как есть некоторые доступные на рынке инструменты, помогающие пользователям WhatsApp создавать резервные копии истории чатов WhatsApp на своем компьютере, я знаю это из здесь. Поэтому вы должны иметь возможность реализовать такое приложение. Возможно, вы можете найти этот инструмент на рынке, чтобы посмотреть, как они работают.