Получить все сообщения от Whatsapp

Я пытаюсь реализовать приложение, которое покажет в текстовом виде все сообщения, полученные от Whatsapp. Есть ли способ сделать это? Можно ли извлечь все сообщения из Whatsapp?

Solutions Collecting From Web of "Получить все сообщения от Whatsapp"

Whatsapp хранит все сообщения в зашифрованной базе данных (pyCrypt), которые очень легко расшифровывать с помощью Python.

Вы можете легко загружать эту базу данных на Android, iPhone, Blackberry и выгружать ее в html-файл. Вот полные инструкции: Чтение, извлечение резервных копий WhatsApp Messages на Android, iPhone, Blackberry

Отказ от ответственности: я исследовал и написал это обширное руководство.

Рабочий код Android: (не требуется root)

Когда у вас есть доступ к файлу dbcrypt5, вот код андроида для его расшифровки:

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, расположенной на SD-карте, только как пользователь root. Если вы откроете «\ data \ data \ com.whatsapp», вы увидите, что «базы данных» связаны с «\ firstboot \ sqlite \ com.whatsapp»

редактировать

Поскольку 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, такие как openssl потому что WhatsApp, похоже, использует модифицированную версию API Spongy Castle для криптографии, которая openssl не понимает.

Оригинальный ответ (только для старого crypt7)

Поскольку whatsapp теперь использует формат crypt7, получить и расшифровать базу данных не так просто. Существует рабочий подход с использованием ADB и USB-отладки.

Вы можете получить ключи шифрования через АБР и расшифровать базу данных сообщений, хранящуюся на / 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 /

Для корневых пользователей: whats app хранит все сообщения и контакты в файлах msgstore.db и wa.db в текстовом формате. Эти файлы доступны в /data/data/com.whatsapp/databases/. Вы можете открыть эти файлы с помощью любого SQL-браузера, такого как SQLite Database Browser.

Если вы действительно хотите что-то простое и знаете, как писать / запускать Python, посмотрите на скрипт 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())) 

Полный запуск:

 (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 

Я не уверен, действительно ли WhatsApp хранит его в базе данных sqlite, хранящейся в закрытом пространстве приложения, но, возможно, стоит попытаться сделать то же самое, что я предложил здесь . Для этого вам понадобится root-доступ.

Да, это должны быть способы получить msgs из WhatsApp, так как есть некоторые доступные на рынке инструменты, помогающие пользователям WhatsApp резервировать историю чатов WhatsApp на своем компьютере, я знаю это отсюда . Поэтому вы должны иметь возможность реализовать такое приложение. Возможно, вы можете найти этот инструмент на рынке, чтобы посмотреть, как они работают.