在Nexus 5(Android 4.4)+WeChat 5.4,和Nexus 5(Android 5.0)+Wechat 6.0上测试可用。
获取加密的sqlite3数据库EnMicroMsg.db
如果已经root过,可以下载/data/data/com.tencent.mm/MicroMsg/*/EnMicroMsg.db
。
若没有root,则/data/data/com.tencent.mm
下多数目录都不可读,可以使用下面的方法:
- 开启“开发人员选项”,选上“USB侦错”
- 电脑上执行
adb backup -noapk com.tencent.mm
- 在手机上弹出对话框提示是否允许备份
- 不要设置密码,点备份,电脑会收到
backup.ab
- 解压
backup.ab
:dd if=backup.ab bs=24 skip=1 | openssl zlib -d > backup.tar
- 解压
backup.tar
得到数据库apps/com.tencent.mm/r/MicroMsg/*/EnMicroMsg.db
获取用于生成密钥的信息
- uin:访问
/data/data/com.tencent.mm/MicroMsg/*/system_config_prefs.xml
,获取其中name="default_uin" value="([0-9]+)"
的value
字段值uin
。也可以打开wx.qq.com网页版,查找.wx.qq.com
域的cookie,其中wxuin
字段的值就是uin
。也可以用backup.tar
里的apps/com.tencent.mm/sp/system_config_prefs.xml
。 - IMEI:在拨号盘输入
*#06#
获取IMEI,或者开启“USB侦错”后使用adb shell dumpsys iphonesubinfo
得到15个十进制数字组成的imei
。网上查到有些机型可能使用不同于IMEI的其他字段用于生成密钥。
使用sqlcipher解密
把上面两步得到的imei
和uin
拼接起来计算MD5。执行echo -n "$imei$uin" | md5sum | cut -c -7
获取sqlcipher使用的加密密钥,下面用abcdefg
指代。
执行sqlcipher EnMicroMsg.db
,输入:
1 | PRAGMA key='abcdefg'; |
解密得到可用sqlite3打开的decrypted_database.db
。
注意,sqlcipher不同版本使用的加密方式不同,我尝试使用3.8.4.3版本打开数据库文件,得到如下错误信息:
1 | sqlite> PRAGMA key='abcdefg'; |
目前发现2.1.1版本的sqlcipher可以解密。可以下载https://github.com/CovenantEyes/sqlcipher-windows/releases提供的2.1.1的Windows用exe,用wine运行,或者在https://launchpad.net/ubuntu/+source/sqlcipher/2.1.1-2/+build/4642377上下载libsqlcipher0_2.1.1-2_amd64.deb
和sqlcipher_2.1.1-2_amd64.deb
,执行:
1 | # /tmp/sqlcipher_2.1.1-2_amd64.deb |
解压后执行:
1 | cd /tmp/usr && LD_LIBRARY_PATH=lib/x86_64-linux-gnu bin/sqlcipher /tmp/EnMicroMsg.db |
解析message
表并导出消息
message
表储存消息。目前了解到从fmessage_conversation
、rcontact
和chatroom
表中可以得到一些联系人和聊天室的信息。
暂时使用一个比较粗糙的Ruby脚本导出信息,需要先gem install sqlite3
:
1 | require 'sqlite3' |