Android 从Whatsapp获取所有消息

Android 从Whatsapp获取所有消息,android,encryption,message,whatsapp,inbox,Android,Encryption,Message,Whatsapp,Inbox,我正在尝试实现一个应用程序,它将在文本视图中显示从Whatsapp收到的所有消息。有什么办法吗?有可能从Whatsapp中提取所有消息吗?我不确定Whatsapp是否真的将其内容存储在私有应用程序空间中存储的sqlite数据库中,但可能值得尝试一下我建议的方法。您将需要root访问权限。我认为您只能以root用户身份访问SD卡上的WhatsApp数据库。如果打开“\data\data\com.whatsapp”,您将看到“数据库”链接到“\firstboot\sqlite\com.whatsap

我正在尝试实现一个应用程序,它将在文本视图中显示从Whatsapp收到的所有消息。有什么办法吗?有可能从Whatsapp中提取所有消息吗?

我不确定Whatsapp是否真的将其内容存储在私有应用程序空间中存储的sqlite数据库中,但可能值得尝试一下我建议的方法。您将需要root访问权限。

我认为您只能以root用户身份访问SD卡上的WhatsApp数据库。如果打开“\data\data\com.whatsapp”,您将看到“数据库”链接到“\firstboot\sqlite\com.whatsapp\”

whatsapp将所有消息存储在一个加密数据库(pyCrypt)中,使用Python很容易破译

您可以在Android、iPhone、Blackberry上轻松获取此数据库,并将其转储到html文件中。以下是完整的说明:


免责声明:我研究并编写了这本内容广泛的指南。

对于根用户:whats应用程序以纯文本形式存储msgstore.db和wa.db文件中的所有消息和联系人。这些文件位于/data/data/com.whatsapp/databases/。您可以使用任何sqlite浏览器(如sqlite数据库浏览器)打开这些文件。

运行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");
private byte[]key={(字节)141,75,21,92,(字节)201,(字节)255,
(字节)129,(字节)229,(字节)203,(字节)246,(字节)250120,
25,54,106,62,(字节)198,33,(字节)166,86,65,108,
(字节)215,(字节)147};
私有最终字节[]iv={0x1E,0x39,(字节)0xF3,0x69,(字节)0xE9,0xD,
(字节)0xB3,0x3A,(字节)0xA7,0x3B,0x44,0x2B,(字节)0xBB,
(字节)0xB6,(字节)0xB0,(字节)0xB9};
长启动=System.currentTimeMillis();
//创建路径
backupPath=Environment.getExternalStorageDirectory()
.getAbsolutePath()+“/WhatsApp/Databases/msgstore.db.crypt5”;
outputPath=Environment.getExternalStorageDirectory()
.getAbsolutePath()+“/WhatsApp/Databases/msgstore.db.decrypt”;
文件备份=新文件(备份路径);
//检查文件是否存在/是否可访问
如果(!backup.isFile()){
Log.e(标记“找不到备份文件!路径:”+backupPath);
返回;
}
//获取帐户名
AccountManager=AccountManager.get(这个);
Account[]accounts=manager.getAccountsByType(“com.google”);
如果(accounts.length==0){
Log.e(标记“无法获取帐户!”);
返回;
}
字符串account=accounts[0]。名称;
试一试{
//计算帐户名上的md5哈希
MessageDigest message=MessageDigest.getInstance(“MD5”);
message.update(account.getBytes());
字节[]md5=message.digest();
//生成用于解密的密钥
对于(int i=0;i<24;i++)
键[i]^=md5[i&0xF];
//读取加密字节流
字节[]数据=新字节[(int)backup.length()];
DataInputStream读取器=新DataInputStream(新文件InputStream(
备份);
Readery.readFully(数据);
reader.close();
//创建输出编写器
文件输出=新文件(outputPath);
DataOutputStream编写器=新DataOutputStream(
新文件输出流(输出));
//解密文件
Cipher Cipher=Cipher.getInstance(“AES/CBC/PKCS5Padding”);
SecretKeySpec secret=新的SecretKeySpec(密钥,“AES”);
IvParameterSpec向量=新的IvParameterSpec(iv);
cipher.init(cipher.DECRYPT_模式,secret,vector);
writer.write(密码更新(数据));
writer.write(cipher.doFinal());
writer.close();
}捕获(无算法异常){
Log.e(标记“无法获取哈希算法!”,e);
返回;
}捕获(IOE异常){
Log.e(标记“访问文件时出错!”,e);
返回;
}捕获(例外e){
Log.e(标记“加密过程中出错了!”,e);
返回;
}
long end=System.currentTimeMillis();
i(标记为“成功”+(结束-开始)+“毫秒”);

如果您确实想要一些简单的东西,并且知道如何编写/运行Python,请查看脚本Bas Bosschert:

Pritam Baral提到了一种更简单的方法:

openssl aes-192-ecb -d -in msgstore.db.crypt -out msgstore.db -K 346a23652a46392b4d73257c67317e352e3372482177652c
编辑 随着WhatsApp在改进加密系统方面的努力,获取数据不再那么容易了。对于较新版本的WhatsApp,无法再使用
adb备份
。应用程序可以拒绝备份,而WhatsApp客户端会这样做。如果您碰巧有一个根手机,您可以使用根shell获取未加密的数据库文件

如果您没有root,如果您有一个旧的WhatsApp APK,您仍然可以解密数据。查找仍允许备份的版本。然后,您可以备份应用程序的数据文件夹,其中将包含一个名为
key
的加密密钥

现在您需要加密的数据库。使用您选择的文件资源管理器,或者,如果您更喜欢命令行,请使用adb:

adb pull /sdcard/WhatsApp/Databases/msgstore.db.crypt12
使用这两个文件,您现在可以使用获取纯文本数据库。不再可能使用像
openssl
这样的Linux板工具,因为WhatsApp似乎使用了openssl不理解的加密的修改版本

原始答案(仅适用于旧密码7) 由于whatsapp现在使用crypt7格式,获取和解密数据库不再那么容易了。有一种使用ADB和USB调试的工作方法

您可以通过ADB获取加密密钥并解密存储在/sdcard上的消息数据库,也可以通过ADB备份获取数据库的普通版本,这似乎是更简单的选择

要获取数据库,请执行以下操作:

将Android手机连接到计算机。快跑

adb backup -f whatsapp_backup.ab -noapk com.whatsapp
备份WhatsApp在其私人文件夹中创建的所有文件。
您将获得zlib压缩
adb pull /sdcard/WhatsApp/Databases/msgstore.db.crypt12
adb backup -f whatsapp_backup.ab -noapk com.whatsapp
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
tar xf whatsapp_backup.tar
    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");