45

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

4

8 に答える 8

31

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

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

免責事項: 私はこの詳細なガイドを調査して作成しました。

于 2013-03-15T07:37:30.520 に答える
19

動作する 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");
于 2014-04-30T05:16:46.277 に答える
12

編集

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

root を持っていなくても、古い WhatsApp APK があればデータを復号化できます。まだバックアップが可能なバージョンを見つけてください。次に、アプリのデータ フォルダーのバックアップを作成できます。このフォルダーには、まあ、という名前の暗号化キーが含まれますkey

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

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

2 つのファイルを使用して、https://gitlab.com/digitalinternals/whatsapp-crypt12を使用してプレーン テキスト データベースを取得できるようになりました。WhatsApp は、openssl が理解できない暗号化のためにSpongy Castle APIopensslの修正版を使用しているように見えるため、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 xf whatsapp_backup.tar

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

于 2014-06-01T19:22:31.077 に答える
8

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

于 2012-02-20T04:53:02.777 に答える
3

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

于 2014-01-04T14:05:49.567 に答える