web-dev-qa-db-ja.com

Whatsappからすべてのメッセージを取得する

Whatsappから受信したすべてのメッセージをテキストビューで表示するアプリを実装しようとしています。それを行う方法はありますか? Whatsappからすべてのメッセージを抽出することは可能ですか?

35
user1141833

Whatsappは、すべてのメッセージを暗号化されたデータベース(pyCrypt)に保存します。これは、Pythonを使用して非常に簡単に解読できます。

このデータベースは、Android、iPhone、Blackberryで簡単に取得し、htmlファイルにダンプできます。完全な手順は次のとおりです。 Android、iPhone、BlackberryでWhatsAppメッセージのバックアップを読み取り、抽出

免責事項:私はこの広範なガイドを調査し、書きました。

27
Taranfx

Working Android Code:(ルートは不要)

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");
17
amalBit

編集

WhatsAppが暗号化システムの改善に努力したため、データを取得することは容易ではなくなりました。 WhatsAppの新しいバージョンでは、adb backup。アプリはバックアップを拒否でき、WhatsAppクライアントはそれを行います。ルート化された電話がある場合は、ルートシェルを使用して、暗号化されていないデータベースファイルを取得できます。

ルートがない場合でも、古いWhatsApp APKがあればデータを復号化できます。バックアップを引き続き許可するバージョンを見つけます。次に、アプリのデータフォルダーのバックアップを作成します。これには、keyという名前の暗号化キーが含まれます。

これで、暗号化されたデータベースが必要になります。任意のファイルエクスプローラーを使用するか、コマンドラインをさらに使いたい場合は、adbを使用します。

adb pull /sdcard/WhatsApp/Databases/msgstore.db.crypt12

2つのファイルを使用すると、 https://gitlab.com/digitalinternals/whatsapp-crypt12 を使用してプレーンテキストデータベースを取得できます。 WhatsAppはopensslが理解できない暗号化に Spongy Castle API の修正バージョンを使用しているように見えるため、opensslなどのLinuxボードツールを使用することはできなくなりました。

元の回答(古いcrypt7のみ)

Whatsappは現在crypt7形式を使用しているため、データベースの取得と復号化はそれほど簡単ではありません。 ADBとUSBデバッグを使用した実用的なアプローチがあります。

ADBを介して暗号化キーを取得し、/ sdcardに保存されているメッセージデータベースを復号化するか、ADBバックアップを介してデータベースのプレーンバージョンを取得することができます。

データベースを取得するには、次の手順を実行します。

Android電話をコンピューターに接続します。

adb backup -f whatsapp_backup.ab -noapk com.whatsapp

whatsAppがプライベートフォルダに作成したすべてのファイルをバックアップします。
ADBヘッダーを含むtar形式を使用してzlib圧縮ファイルを取得します。圧縮解除コマンドを混乱させるため、最初にこれらのヘッダーを削除する必要があります。

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を解除できます。

tar xf whatsapp_backup.tar

アーカイブは現在の作業ディレクトリに抽出され、apps/com.whatsapp/db /でデータベース(msgstore.dbおよびwa.db)を見つけることができます。

9
RenWal

私が思うに、rootユーザーとしてのみ、SDカードにあるWhatsAppデータベースにアクセスできます。 「\ data\data\com.whatsapp」を開くと、「databases」が「\ firstboot\sqlite\com.whatsapp \」にリンクされていることがわかります。

6
Pedro Teran

本当にシンプルなものが必要で、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>

Pritam Baralはさらに簡単な方法に言及しています。

openssl aes-192-ecb -d -in msgstore.db.crypt -out msgstore.db -K 346a23652a46392b4d73257c67317e352e3372482177652c
3

根ざしユーザーの場合:whatsアプリはすべてのメッセージと連絡先をmsgstore.dbおよびwa.dbファイルにプレーンテキストで保存します。これらのファイルは/data/data/com.whatsapp/databases/にあります。 SQLite Database Browserなどのsqliteブラウザーを使用してこれらのファイルを開くことができます。

3
user3160429

はい、WhatsAppからWhatsAppのチャット履歴をバックアップするためのWhatsAppユーザーを支援するいくつかのツールが利用可能であるため、WhatsAppからメッセージを取得する方法でなければなりません、私はこれを here 。したがって、このような種類のアプリを実装できる必要があります。たぶん、あなたはそれらがどのように働くか見るために市場でこれらのツールを見つけることができます。

2
Willa Foster

WhatsAppがプライベートアプリ領域に保存されているsqliteデータベースに実際に保存するかどうかはわかりませんが、私が提案したのと同じことを試してみる価値があるかもしれません here 。これにはルートアクセスが必要です。

1
Luminger