我正在尝试实现一个应用,该应用将在文本视图中显示从Whatsapp收到的所有消息。有什么办法吗?是否可以从Whatsapp中提取所有消息?
Whatsapp将所有消息存储在一个加密的数据库(pyCrypt)中,这很容易使用Python解密。
您可以在Android,iPhone,Blackberry上轻松获取此数据库并将其转储为html文件。以下是完整的说明:Read, Extract WhatsApp Messages backup on Android, iPhone, Blackberry
免责声明:我研究并编写了这份详尽的指南。
一旦您有权访问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为改进其加密系统而付出了一些努力,获取数据已不再那么容易了。对于新版本的WhatsApp,将无法再使用adb backup
。应用程序可以拒绝备份,而WhatsApp客户端可以这样做。如果您碰巧拥有手机,则可以使用root shell获取未加密的数据库文件。
如果您没有root用户,则如果拥有旧的WhatsApp APK,您仍然可以解密数据。查找仍允许备份的版本。然后,您可以备份该应用程序的数据文件夹,其中将包含一个名为key
的加密密钥。
现在您需要加密的数据库。使用您选择的文件浏览器,或者,如果您更喜欢命令行,请使用adb:
adb pull /sdcard/WhatsApp/Databases/msgstore.db.crypt12
使用这两个文件,您现在可以使用https://gitlab.com/digitalinternals/whatsapp-crypt12获取纯文本数据库。无法再使用openssl
之类的Linux电路板工具,因为WhatsApp似乎使用了Spongy Castle API的修改版进行opensl不能理解的加密。
由于whatsapp现在正在使用crypt7格式,因此获取和解密数据库不再那么容易了。有一种使用ADB和USB调试的有效方法。
[您既可以通过ADB获取加密密钥并解密存储在/ sdcard上的消息数据库,也可以通过ADB备份仅获取数据库的普通版本,这似乎是更简单的选择。
要获取数据库,请执行以下操作:
将您的Android手机连接到计算机。现在运行
adb backup -f whatsapp_backup.ab -noapk com.whatsapp
备份WhatsApp在其专用文件夹中创建的所有文件。您将获得使用tar格式和一些ADB标头的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)
我认为您只能以root用户身份访问SD卡上的WhatsApp数据库。如果打开“ \ data \ data \ com.whatsapp”,则会看到“数据库”链接到“ \ firstboot \ sqlite \ com.whatsapp \”
对于root用户:什么应用程序将所有消息和联系人以纯文本格式存储在msgstore.db和wa.db文件中。这些文件位于/data/data/com.whatsapp/databases/中。您可以使用任何sqlite浏览器(例如SQLite数据库浏览器)打开这些文件。
如果您真的想要简单的东西并且知道如何编写/运行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
是的,这一定是从WhatsApp获取消息的方法,因为市场上有一些工具可以帮助WhatsApp用户将WhatsApp聊天记录备份到他们的计算机上,我从here中知道了这一点。因此,您必须能够实现此类应用。也许您可以在市场上找到这些工具,以了解它们的工作原理。
我不确定WhatsApp是否真的将其东西存储在私有应用程序空间中存储的sqlite数据库中,但是尝试执行我建议的相同操作here可能值得。为此,您将需要root访问权限。