破解微信 DB, 导出 Mac 微信聊天记录

前头的话

最近由于手机内存告急,打算对手机进行一下瘦身。其中手机微信占用了将近 5G,这个简直太可怕了,于是打算把微信聊天记录备份到电脑上。本来备份就备份了,也没啥好说的,不过突发奇想想知道 Mac Wechat 把聊天记录备份到哪了?或者说平常聊天的数据放在哪里了?能不能把这些聊天记录导出成 txt 文件呢?

于是就有了这篇文章。

导出微信聊天记录为txt

导出微信聊天记录最简单的一种方式应该是使用 itunes 对 iphone 进行不加密备份,然后找到备份文件里面的数据,据说聊天记录是以明文的方式存在 DB 中的。这种方法我没去试过,这里主要讲一下通过破解微信 DB,读取到聊天记录,然后导出聊天记录

微信数据目录

1
2
3
4
# 替换其中的 smaug 为你自己的用户名
cd /Users/smaug/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9

find ./ -name "*.db"

以上目录就是微信数据存储的目录,可以看到有很多 db 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
.//37cc38007838aa28296af491b890575f/ChatSync/ChatSync.db
.//37cc38007838aa28296af491b890575f/Message/msg_1.db
.//37cc38007838aa28296af491b890575f/Message/msg_5.db
.//37cc38007838aa28296af491b890575f/Message/msg_4.db
.//37cc38007838aa28296af491b890575f/Message/msg_0.db
.//37cc38007838aa28296af491b890575f/Message/fts/ftsmessage.db
.//37cc38007838aa28296af491b890575f/Message/msg_7.db
.//37cc38007838aa28296af491b890575f/Message/msg_3.db
.//37cc38007838aa28296af491b890575f/Message/msg_2.db
.//37cc38007838aa28296af491b890575f/Message/msg_6.db
.//37cc38007838aa28296af491b890575f/Message/msg_9.db
.//37cc38007838aa28296af491b890575f/Message/msg_8.db
.//37cc38007838aa28296af491b890575f/Sync/openim_oplog.db

其中类似于 msg_0.db、 msg_1.db 的就是聊天记录的数据文件,只不过是加过密的数据库,没法直接看。不过好在有各路大神,可以参考文末的参考链接。

破解步骤

1.打开 Mac Wechat,但是不要登录

2.打开终端,输入命令

1
lldb -p $(pgrep WeChat)

lldb 是在 mac 上的一个调试工具,上面的意思是使用 lldb attach 到 WeChat 这个进程上,进行调试,回车之后进入 lldb 调试界面

3.在 lldb 调试界面输入命令

1
br set -n sqlite3_key

然后回车。

这时调试屏幕上可能会出现一些 error,可以暂时忽略,不用管

4.输入 c 回车

5.然后正常登录 Mac Wechat,点击登录,手机上点击允许(或者是扫码登录),不用关心此时 Mac Wechat 是否被卡住

6.接着输入命令

1
memory read --size 1 --format x --count 32 $rsi

回车。

读取内存中 寄存器 rsi 存储的值。大致回输出如下的字样:

其中下面的这段是我们关心的:

1
2
3
4
0x604004c346a0: 0xad 0x5c 0xff 0x0a 0x85 0xce 0x4a 0x5e
0x604004c346a8: 0x9f 0x7f 0x8a 0xd3 0xa6 0xc6 0x02 0xf3
0x604004c346b0: 0x25 0x02 0xb1 0x48 0x4c 0x76 0x4c 0x84
0x604004c346b8: 0x82 0x38 0xc3 0x17 0x4d 0x27 0x14 0x33

把前面 0x604004c346b0: 去掉,同时删除后面所有的 0x 和空格,拼接成一个字符串为 (总共 64 个字符):

1
ad5cff0a85ce4a5e9f7f8ad3a6c602f32502b1484c764c848238c3174d271433

前面加上 0x 就是我们用来破解 DB 的 key:

1
0xad5cff0a85ce4a5e9f7f8ad3a6c602f32502b1484c764c848238c3174d271433

到这里基本上就相当于拿到了微信数据库的 key 了,接下来就是用这个 key 打开 DB 文件了。

TODO(smaug)

buy me a cola!

欢迎关注我的其它发布渠道