1.获取数据库文件
微信采用了sqlite作为数据库,第一步需要把数据库文件拿到手。首先在系统root的前提下,用root explorer(RE浏览器)进入目录 /data/data/com.tencent.mm/MicroMsg/微信号文件夹/,这个微信号文件夹是一长串数字,如果机器登录过多个微信帐号,那么这个文件夹会有多个,进入看一眼照片之类的就可以判断选择哪个,复制出来结尾为.db的文件,聊天记录存在EnMicroMsg.db这里,还有一些其他的db文件可选。

2.解密数据库
微信数据库文件采取了加密,首先需要解密之后,才能用sqlite相关工具和接口进行读取和查询
– 密码规则
这方面介绍很多,目前为止规则也没有变化(对腾讯来说改动加密规则影响太大成本太高),如下:
大写的IMEI + UIN 进行MD5加密 取32位小写 的前7位就是破解数据库的密码
其中IMEI在手机拨号界面按*#06#,弹出的俩IMEI号,记下第一个;我的手机IMEI是纯数字,不存在大小写;UIN一般在/data/data/com.tencent.mm/shared_prefs/aunt_info_key_prefs.xml文件里;需要注意的是手机IMEI码在前,uin在后,中间不要有任何东西
– 操作方式
拿到具体的7位数据库加密密码之后,接下来就是要通过工具进行具体的解密工作了,一般用到sqlcipher这个,有两种方式:
一是下载sqlcipher.exe文件,直接windows下操作,解密完直接就是sqlite图像化的操作界面,这个文件到处不好下载(csdn之类的都要钱),可以从这里下载
二是在Ubuntu下直接用sqlcipher的命令行版本进行解密,也是十分方便快捷:
假定密码为1234567

apt-get install sqlcipher
./sqlcipher EnMicroMsg.db 'PRAGMA key = "1234567"; PRAGMA cipher_use_hmac = off; PRAGMA kdf_iter = 4000; ATTACH DATABASE "wechat.db" AS wechat KEY "";SELECT sqlcipher_export("wechat");DETACH DATABASE wechat;'

就导出了wechat.db这个未加密的sqlite数据库文件

3.进行相关分析
我的需求是分析某群聊天记录,简单查询sql语句如下:

select t1.createTime,t1.content from message t1 inner join rcontact t2 on t2.username=t1.talker where t1.talker='123456789@chatroom' and t1.type='1'

其中123456789@chatroom为群聊的talker id,rcontact为通讯录表,message为聊天记录表,聊天内容位于content字段,格式为“群成员wxid:\n内容”,如果聊天类型type为本人或者系统,则格式为“内容”(不再体现wxid)

参考:1 2 3
另外PC端微信数据库解密还可参考这篇