我们知道,微信的聊天记录是加密的,因而我们不能从文件中直接查看、导出。本文主要介绍如何把聊天记录解密、导出成SQL或csv文件。
手机微信数据库导出
方法1——某些手机无需root即可备份
某些手机(比如某米、某为)通过官方的APP(无需root)即可把微信手机端的应用数据备份到电脑或者SD卡上。
但是我在实际操作的时候碰到了困难,我用的是某为手机,在电脑端和手机端均安装了官方提供的手机助手软件以后,正准备备份微信这个应用的数据,竟然一定要我输入密码进行加密,备份数据加密后就无法进行后续的操作了。我只好放弃了这个办法。
方法2——root
如果你的手机已经root,那么你可以直接使用adb
将/data/data/com.tencent.mm
复制即可。
/data/data/<package_name>
目录是app的私有目录,本身可以访问,外部程序没有访问权限,一些不想让用户看到的文件可以放在这里。此目录在程序卸载后将被删除,对应的是设置中的“数据”一项,如果清空数据,这个目录将会被清空。app自身对此目录的读写不需要额外的权限。注意:没root过的手机是看不到这个目录的。
考虑到安全因素,我没有选择这种方法。
方法3——安卓模拟器
我们可以在电脑上安装一款安卓模拟器,然后里面下载手机微信并登录,然后将手机端聊天记录备份到电脑端微信,再将电脑端聊天记录恢复到安卓虚拟器里的微信。现在对安卓虚拟器进行root,然后我就可以进入/data/data/<package_name>
目录,从而把数据库复制到电脑上了。
下面我简单讲一下整个步骤:
- 我选择了蓝叠这个安卓模拟器。首先在模拟器上下载了微信APP,然后我把自己手机微信上的聊天数据备份到电脑微信中,然后退出手机微信,在模拟器上登录微信,再把数据恢复到模拟器上的微信中。
- 在模拟器右上角的设置中打开root权限。
- 打开文件浏览器,找到数据库文件,它在
/data/data/com.tencent.mm/MicroMsg/[weixin_name]/EnMicroMsg.db
。其中文件夹[weixin_name]
的名字为32位的md5值,如85794836981744a4472f69d89aeb2152
,一个微信号对应一个文件夹。如果有多个[weixin_name]
,那么此微信肯定登录过多个微信号。 - 把数据库文件拷贝到
/sdcard/windows/BstSharedFolder
这个共享文件夹中,这个文件夹在Windows上就是BluestacksCN/Engine/ProgramData/Engine/UserData/SharedFolder
,当我们在模拟器中拷贝完数据后,在Windows上就能看到了。注意:数据是互通的。
破解数据库密码
根据前人的分析,微信数据库 EnMicroMsg.db
的密码是由 MD5(IMEI + uin).substring(0, 7)
生成的。因此,我们需要找到IMEI
和uin
值。
IMEI
方法1
我通过在模拟器上安装这个工具:Find IMEI来查看IMEI
。
下载apk,然后把apk放入到BluestacksCN/Engine/ProgramData/Engine/UserData/SharedFolder
这个文件夹中,我们就可以在模拟器的/sdcard/windows/BstSharedFolder
文件夹中找到了,然后直接安装,打开就直接显示出IMEI
了。
方法2
我们也可以在/data/data/com.tencent.mm/shared_prefs/DENGTA_META.xml
中查找名为 IMEI_DENGTA
的值。
uin
uin
(unique identifier
)是唯一标识符(整数类型),微信分配每个用户的唯一标识符,它具有不可重复性,也就是说这个世界上没有两个 uin
相同的微信号。
方法1
我们可以在/data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml
找到default_uin
,后面的数字就是我们要找的uin
了。
方法2
我们也可以登录 web 微信,按 F12 打开网页调试工具,然后 ctrl+F
搜索 uin
,可以找到一串长长的 URL,里面的 uin
就是当前登录的微信的 uin
。
计算密码
注意:
IMEI
中的字母必须为大写MD5
中的字母必须为小写
我们可以使用:MD5在线计算来计算MD5值,密码即为32位的前7位(小写)。
查看数据库
微信使用了sqlcipher
加密了数据库,因此,我们也可以使用sqlcipher
进行解密。
SQLCipher是一个在SQLite基础之上进行扩展的开源数据库,它主要是在SQLite的基础之上增加了数据加密功能,如果我们在项目中使用它来存储数据的话,就可以大大提高程序的安全性。
Windows下打开
Windows用户可以直接使用 sqlcipher.exe
打开 com.tencent.mm/MicroMsg/[weixin_name]/EnMicroMsg.db
,在弹出的窗口输入刚刚生成的7位密码。
sqlcipher.exe
其实是SQLite Database Browser软件再嵌套了解密功能。
注意:sqlcipher不同版本使用的加密方式不同,如果解密用sqlcipher
版本和加密用的sqlcipher
版本不一样,会提示file is not a database
,实际错误是解密失败。目前发现2.1
版本的sqlcipher可以正常解密。
然后我们可以在 Browse Data
菜单栏处查看数据中各个数据表。
我们可以点击菜单栏的File-Export-Table as CSV file
,选择message表,导出成csv
文件。如果直接用Excel打开这个表格,可能会显示乱码。所以我们新建一个Excel表格,点击数据-来自文本,然后导入这个.csv
文件。在弹出的第一个下拉框中选择GB2312
,然后载入就不会出现乱码。
Ubuntu下打开
安装sqlicipher:
1 | sudo apt-get update |
解密数据库文件,这里我们要输入前面得到的密码:
1 | sqlcipher EnMicroMsg.db 'PRAGMA key = "yourkey"; 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
,我们可以用自己熟悉的数据库软件打开。
了解数据表
我们主要使用以下三个表:
rcontact
:通讯录表chatroom
:群聊表message
:聊天记录表
微信文字聊天记录在数据表message
中。我们可以根据talker
这个字段来筛选出特定用户的聊天记录。如果为群聊,那么message.talker = chatroom.chatroomname
。message.content
中存储形式为:群成员wxid:\n内容
。
比如,我们可以查询与某人的聊天记录,下面是SQL语句:
1 | select datetime(subStr(cast(m.createTime as text),1,10),'unixepoch', 'localtime') as theTime, |