从Whatsapp获取所有消息

我试图实现一个应用程序,将显示在所有从WhatsApp收到的消息的文本视图。 有没有办法做到这一点? 是否有可能从Whatsapp中提取所有的消息?

Whatsapp将所有消息存储在一个encryption的数据库(pyCrypt)中,这个数据使用Python很容易解密。

您可以在Android,iPhone,Blackberry上轻松获取该数据库并将其转储到html文件中。 这里有完整的说明: 阅读,提取Android,iPhone,黑莓上的WhatsApp消息备份

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

工作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"); 

编辑

由于WhatsApp花费了一些精力来改进他们的encryption系统,获取数据已经不再那么容易了。 使用更新版本的WhatsApp不再可以使用adb backup 。 应用程序可以拒绝备份,WhatsApp客户端也可以这样做。 如果您碰巧拥有根源电话,则可以使用root shell获取未encryption的数据库文件。

如果你没有root权限,你仍然可以解密数据,如果你有一个旧的WhatsApp APK。 find一个仍然允许备份的版本。 然后,您可以备份应用程序的数据文件夹,该文件夹将包含一个名为well的key

现在你需要encryption的数据库。 使用您select的文件浏览器,或者,如果您更喜欢命令行,请使用adb:

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

使用这两个文件,您现在可以使用https://gitlab.com/digitalinternals/whatsapp-crypt12来获取纯文本数据库。; 使用openssl等Linux板工具已经不再可能了,因为WhatsApp似乎使用了Spongy Castle API的修改版本来encryptionopenssl不理解的东西。

原答复(只适用于老的crypt7)

由于whatsapp现在使用的是crypt7格式,要获取和解密数据库已经不那么容易了。 有一个使用ADB和USBdebugging的工作方法。

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

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

将您的Android手机连接到您的电脑。 现在运行

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

备份WhatsApp在其私人文件夹中创build的所有文件。
你将得到一个zlib压缩文件,使用带有一些ADB头的tar格式。 我们需要首先摆脱这些标题,因为他们混淆了解压缩命令:

 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 /中find数据库(msgstore.db和wa.db)

您只能以root用户身份访问位于SD卡上的WhatsApp数据库。 如果你打开“\ data \ data \ com.whatsapp”,你会看到“databases”被链接到“\ firstboot \ sqlite \ com.whatsapp \”

对于有根的用户:whats应用程序将msgstore.db和wa.db文件中的所有消息和联系人存储为纯文本。这些文件可在/data/data/com.whatsapp/databases/中find。 你可以使用SQLite数据库浏览器等任何SQLite浏览器打开这些文件。

如果你真的想要简单的东西,并知道如何编写/运行Python,看看脚本Bas 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> 

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

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

我不确定WhatsApp是否真的把它存储在私有应用程序空间中存储的sqlite数据库中,但是可能值得一试,就像我在这里所build议的一样。 你将需要root访问权限。

是的,它必须是从WhatsApp获得消息的方法,因为市场上有一些工具可以帮助WhatsApp用户将WhatsApp聊天logging备份到他们的计算机上,我从这里知道这一点 。 因此,您必须能够实施这样的应用程序。 也许你可以在市场上find这些工具,看看它们是如何工作的。