一日闲着没事打算备份一下微信的聊天记录,使用微信电脑端备份没什么问题,一共生成了三个文件:Backup.db,BAK_0_MEDIA,BAK_0_TEXT。到这里一切顺利,直到我打算输出excel时出了问题。Backup.db文件是加密的无法打开,上网找了一些方法都是针对安卓的数据库。当然心大的可以使用现成的破解软件,但需要提供iphone的账号密码用于破解iOS的系统备份命名规则。

虽然有一台安卓手机,但是由于无法root看不到对应的存放文件夹,最后使用的Android虚拟器,并使用微信电脑端将数据再次备份到虚拟器中。这里需要注意两点

  1. 新版本的安卓客户端据说可能修改了存储方式,我是先安装旧的版本6.2.5,并发了一条消息创建了数据库。再更新到最新版本,因为只有新的版本才能备份数据。
  2.  安卓虚拟机安装微信客户端之前需要首先设置好IMEI,因为无论是数据库文件夹的命名和密码都跟IMEI有关。

虚拟机里操作自然简单了很多,微信聊天数据导入之后找到 /data/data/com.tencent.mm/MicroMsg 文件夹,底下会有像乱码一样很长名字的文件夹,其中又会有一个数据库文件:EnMicroMsg.db。至此破解需要的数据库文件就已经拿到。

下面开始生成数据库的密码,这个需要刚才设置的IMEI和微信的uid。微信uid在登录微信版网页后使用chrome自带的抓包插件chrome://net-internals/#events即可找出,这里需要注意uid可能是负值,需要做无符号数到符号数的转换,即uint32 -> int32。最后将IMEI和uid进行拼接,并做MD5计算,在计算时使用“32位小写”选项,取计算结果的前7位即是数据库文件密码。(没看明白的先别急,后面有流程图展示)

下一步就是解密EnMicroMsg.db,这里又要注意:sqlcipher新版本(3.x)默认不向下兼容。首先从文章最后下载解压sqlcipher,并用cmd定位到sqlcipher所在目录,同时将EnMicroMsg.db放入目录,输入以下语句(KEY用自己的密码替换):

sqlcipher EnMicroMsg.db
PRAGMA key = “KEY“;
PRAGMA cipher_use_hmac = off;
PRAGMA kdf_iter = 4000;
ATTACH DATABASE “decrypted_database.db” AS decrypted_database KEY “”;
SELECT sqlcipher_export(“decrypted_database”);
DETACH DATABASE decrypted_database;

解密输出的速度会比较慢,需要进度条的朋友可以在文件夹中查看decrypted_database.db 文件的大小,最终大小和EnMicroMsg.db近似。

最后用DB Browser for SQLite打开解密后的文件,在浏览数据页面选择message表就可以看到所有的聊天记录。如果只需要导出与某人的聊天记录,在talker中过滤即可。注意有些好友是后来修改的微信号,talker内容还是保持最开始的默认以 wxid_ 开头的名称,需要与聊天内容对应后再过滤。

下面放上一张流程图作为总结,最开始密码生成没看懂的朋友可以看下图:

 

参考文献:

微信聊天记录分析

https://blog.csdn.net/njweiyukun/article/details/54024442
https://blog.csdn.net/wengpanfeng/article/details/78406172
https://blog.csdn.net/f2006116/article/details/51073202

 

最后给出使用的软件:

安卓虚拟机及IMEI配置文件:
[此处被服务器提供商判断为病毒文件,请自行搜索下载。也可留言邮箱,将通过邮件方式发送]
配置方法见 http://www.droid4x.cn/bbs/forum.php?mod=viewthread&tid=46466

微信6.2.5安卓版:wechat-6-2-5-16-r6928c0f-multi-android

MD5计算:http://tool.chinaz.com/Tools/md5.aspx

sqlcipher工具:sqlcipher_tools-3.0.1

DB.Browser.for.SQLite:DB.Browser.for.SQLite-3.10.1-win64