Получить все сообщения от WhatsApp - PullRequest
35 голосов
/ 14 января 2012

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

Ответы [ 8 ]

27 голосов
/ 15 марта 2013

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

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

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

17 голосов
/ 30 апреля 2014

рабочий код 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");
9 голосов
/ 01 июня 2014

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

Поскольку WhatsApp приложил некоторые усилия для улучшения своей системы шифрования, получение данных уже не так просто.В более новых версиях WhatsApp больше невозможно использовать adb backup.Приложения могут запрещать резервное копирование, и клиент WhatsApp делает это.Если у вас есть рутированный телефон, вы можете использовать оболочку root для получения незашифрованного файла базы данных.

Если у вас нет root, вы все равно можете расшифровать данные, если у вас старый APK 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, либо просто получить простую версию базы данных с помощью резервного копирования 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 to whatsapp_backup.tar
Теперь мы можем разархивировать файл:

tar xf whatsapp_backup.tar

Архив теперь распакован в ваш текущий рабочий каталог, и вы можете найти базы данных (msgstore.db и wa.db) вприложения / com.whatsapp / дб /

6 голосов
/ 20 февраля 2012

Вы можете получить доступ к базе данных WhatsApp, расположенной на SD-карте, только как пользователь root, я думаю.если вы откроете «\ data \ data \ com.whatsapp», то увидите, что «базы данных» связаны с «\ firstboot \ sqlite \ com.whatsapp \»

3 голосов
/ 28 мая 2014

Если вы действительно хотите что-то простое и знаете, как написать / запустить 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
3 голосов
/ 04 января 2014

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

2 голосов
/ 15 февраля 2017

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

1 голос
/ 19 февраля 2012

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

...