警告:此工具只能用于破解您自己的数据库。请勿在任何非法情况下使用它。
(此工具可以解决 https://github.com/ppwwyyxx/wechat-dump/wiki 中列出的问题, pysqlcipher.dbapi2.DatabaseError: 文件已加密或不是数据库)
对于某些设备,当尝试使用“md5(imei + uin)[:7]”解密 EnMicroMsg.db 时,您可能会收到错误消息:“文件已加密或不是数据库”。一种可能的原因是微信使用其他设备ID而不是IMEI来生成密码。
幸运的是,28 位密码(总共 16^7 种组合)的强度不足以抵御暴力攻击。
微信使用sqlcipher v2来加密数据库。部分安全功能列举如下(来自https://www.zetetic.net/sqlcipher/design/):
所以,我们的策略是:获得第一页;从最后一个 16B 获得 IV,从前 16B 获得盐;迭代可能的密码短语的所有组合;派生出对应的密钥。解密数据库。
我们知道sqlite db的原始头是一个16B的字符串:“SQLite format 3 ”,在加密的情况下用salt替换。以下是2B描述页面大小(0x04 0x00),1B写入版本( 0x01 0x02)和1B读取版本( 0x01 0x02)。我们有 4 个相同的字节来测试是否得到正确的纯文本。 (2019-04-12) 从微信7开始,腾讯使用了新的读写版本(0x02),这将打破我们之前的检测。现在我们将使用以下三个固定字节来测试是否获得正确的纯文本: 1. 最大嵌入负载分数(0x40),偏移量为 5; 2. 最小嵌入有效负载分数 (0x20),偏移量为 6; 3. 叶子有效负载分数(0x20),偏移量为7。(这里我们可以忽略碰撞。如果你成功获得了pass但仍然无法打开db,只需跳过“错误警报”并从下一个pass开始。)
执行 4000 次迭代的单个 PBKDF2 大约需要 5 ms。所以最坏的情况下,破解需要16^7 * 0.005 /3600/24 = 15.5天。在 8 核 PC 上,它减少到 2 天(现在听起来很合理)。
破解前,如果systemInfo.cfg和CompatibleInfo.cfg可用,请使用extract_key_from_cfg_files.py获取密钥。
有两个版本可供选择:C 版本和 Python 版本。前者应该快一点(核心依赖openssl。计算4000次迭代没有区别)。
$ sudo apt-get install libssl-dev
$ gcc password_cracker.c -l crypto -o password_cracker.o
修改“crack_enmicromsg_db_(C_version)”中的参数。 process_no:使用的核心总数。注意:如果成功获取通行证但仍然无法打开数据库,请通过更改“pass_start”从下一个通行证开始。
开始:
$ python2 crack_enmicromsg_db_(C_version).py
演示目的。写得不好。
使用 Yuxin Wu 编写的精彩的 wechat-dump 来转储整个数据库。您需要调整“decrypt-db.py”中的几行才能使用密钥。玩得开心!
crypto_db_with_password.py:当您已经知道密码时,使用此脚本获取解密的数据库,该数据库可以通过 DB Browser for SQLite 查看/编辑。
encrypt_db_again.py:再次加密数据库。注:(2018年2月4日)未测试微信能否正确打开。
extract_key_from_cfg_files.py :此脚本可以从CompatibleInfo.cfg和systemInfo.cfg中提取密钥。请注意,它是用Python 3编写的。首先更改 search_path 然后运行脚本
$ python3 extract_key_from_cfg_files.py
sqlcipher-tools/decrypt.c 帮助我理解 sqlcipher 的工作原理。
wechat-dump/decrypt-db.py 提供了微信db的关键参数。
sqlcipher 文档:其详细的安全功能。
修复问题 #4:不会针对 openssl 1.1 进行编译:感谢 @couling 提供 openssl 1.1 补丁。