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

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


person user1141833    schedule 13.01.2012    source источник
comment
Я думаю, что эти сообщения теперь зашифрованы.. поэтому я не думаю, что вы можете легко их получить.. yourdailymac.net/2011/05/   -  person SERPRO    schedule 17.02.2012
comment
Скажите, пожалуйста, как шпионские приложения могут читать отправленные и полученные сообщения Whatsapp даже без рутирования?   -  person Gvtha    schedule 18.02.2018
comment
@Gvtha есть решение?   -  person Deepak    schedule 20.02.2020


Ответы (9)


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

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

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

person Taranfx    schedule 15.03.2013
comment
А теперь это db.crypt5 - person amalBit; 08.03.2014
comment
Согласно forum.xda-developers.com/showthread.php?t=1583021 Blackberry пока не поддерживается. - person Clark Superman; 24.05.2015
comment
Скажите, пожалуйста, как шпионские приложения могут читать отправленные и полученные сообщения Whatsapp даже без рутирования? - person Gvtha; 18.02.2018
comment
@Gvtha, я думаю, читая уведомления WhatsApp. - person Beyondo; 05.11.2018
comment
@XStylish - читая уведомление, мы можем читать полученные сообщения, но не отправленные сообщения. - person Gvtha; 05.11.2018
comment
@Gvtha для отправленных сообщений, я уже думал о технике (методе), но она слишком сложна и не работает для всех пользователей, так как это зависит от настроек WhatsApp пользователя, поэтому я не совсем уверен, и может быть гораздо проще, чем я думал. Я сообщу вам здесь, если обнаружу это. - person Beyondo; 06.11.2018

Рабочий код 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");
person amalBit    schedule 30.04.2014
comment
Превосходно. Я могу успешно читать сообщения. Но это не официальный API. Откуда вы знаете эти значения KEY - person Ramachandra Reddy Avula; 09.05.2014
comment
Это не официально, в тот день, когда люди в приложении WhatsApp изменят db.crypt5, это перестанет работать. - person amalBit; 09.05.2014
comment
@ツFellinLovewithAndroidツ Можете ли вы объяснить, как это работает? - person amalBit; 24.12.2014
comment
@amalBit Можете ли вы объяснить, как вы придумали этот код? Откуда берутся байтовые массивы? - person dazedviper; 04.01.2015
comment
Я получаю сообщение о том, что файл не поддерживается при открытии msgstore.db.decrypt - person ; 30.03.2016
comment
Я попробовал это два года назад. С тех пор Whats app меняли метод шифрования n раз. - person amalBit; 31.03.2016
comment
Есть ли способ программно получить доступ к зашифрованной базе данных WhatsApp, т.е. хранящейся во внутренней памяти? Без рута? - person Muhammad Babar; 04.05.2016
comment
@MuhammadBabar зашифрованная база данных легко доступна во внутренней памяти. Хитрость заключается в расшифровке файла. Приведенное выше решение работало, когда WhatsApp использовал файл dbcrypt5. Теперь у них другой формат шифрования. - person amalBit; 04.05.2016
comment
@amalBit Есть ли способ получить доступ к зашифрованной базе данных без рута? Я считаю, что должен быть какой-то способ расшифровать новое шифрование. - person Muhammad Babar; 04.05.2016
comment
Как я могу использовать его для crypt12 - person Kartikey Kumar Srivastava; 02.11.2016
comment
@KartikeyKumarSrivastava, они так много повторили. Я понятия не имею, как сейчас. Возможно, вам придется перепроектировать приложение, чтобы узнать формат шифрования для его расшифровки (только для образовательных целей). - person amalBit; 02.11.2016
comment
@amalBit, как мы можем получить доступ к файлу dbcrypt12? на нерутированном устройстве. - person Deepak; 20.02.2020
comment
@Deepak Я действительно не знаю. Если вам удастся найти решение, пожалуйста, опубликуйте его здесь. Спасибо - person amalBit; 20.02.2020
comment
любое решение до сих пор? - person Ahmad; 15.10.2020

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

Поскольку 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/

person RenWal    schedule 01.06.2014
comment
@NiravRanpara К сожалению, это не работает для crypt9, потому что WhatsApp теперь использует модифицированную версию Spongy Castle для шифрования, и вы больше не можете получить текстовую версию базы данных с резервной копией adb. См. мое редактирование для получения информации о том, как вы можете сделать это с новым crypt12. - person RenWal; 23.12.2016
comment
@RenWal - Скажите, пожалуйста, как шпионские приложения могут читать отправленные и полученные сообщения Whatsapp даже без рутирования? - person Gvtha; 18.02.2018
comment
Ссылка на репозиторий gitlab больше недоступна - person OJ7; 20.11.2019

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

person Pedro Teran    schedule 20.02.2012
comment
если пользователь root получает доступ к этому файлу базы данных. это зашифровано или нет? - person Akarsh M; 20.11.2013
comment
Да, они все зашифрованы. Вы можете расшифровать их, следуя этому пошаговому руководству: forum.xda-developers. com/showthread.php?p=24603294 - person Farzan; 04.12.2013

Если вам действительно нужно что-то простое и вы знаете, как писать/запускать 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
person Ehtesh Choudhury    schedule 27.05.2014
comment
Скажите, пожалуйста, как шпионские приложения могут читать отправленные и полученные сообщения Whatsapp даже без рута? - person Gvtha; 18.02.2018

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

person user3160429    schedule 04.01.2014

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

person Willa Foster    schedule 15.02.2017

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

person Luminger    schedule 19.02.2012

Если понимать вопрос буквально:

Получить все сообщения от 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");
person PKL    schedule 17.03.2021