前头的话
最近由于手机内存告急,打算对手机进行一下瘦身。其中手机微信占用了将近 5G,这个简直太可怕了,于是打算把微信聊天记录备份到电脑上。本来备份就备份了,也没啥好说的,不过突发奇想想知道 Mac Wechat 把聊天记录备份到哪了?或者说平常聊天的数据放在哪里了?能不能把这些聊天记录导出成 txt 文件呢?
于是就有了这篇文章。
导出微信聊天记录为txt
导出微信聊天记录最简单的一种方式应该是使用 itunes 对 iphone 进行不加密备份,然后找到备份文件里面的数据,据说聊天记录是以明文的方式存在 DB 中的。这种方法我没去试过,这里主要讲一下通过破解微信 DB,读取到聊天记录,然后导出聊天记录。
微信数据目录
1 | # 替换其中的 smaug 为你自己的用户名 |
以上目录就是微信数据存储的目录,可以看到有很多 db 文件:
1 | .//37cc38007838aa28296af491b890575f/ChatSync/ChatSync.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 | 0x604004c346a0: 0xad 0x5c 0xff 0x0a 0x85 0xce 0x4a 0x5e |
把前面 0x604004c346b0: 去掉,同时删除后面所有的 0x 和空格,拼接成一个字符串为 (总共 64 个字符):
1 | ad5cff0a85ce4a5e9f7f8ad3a6c602f32502b1484c764c848238c3174d271433 |
前面加上 0x 就是我们用来破解 DB 的 key:
1 | 0xad5cff0a85ce4a5e9f7f8ad3a6c602f32502b1484c764c848238c3174d271433 |
到这里基本上就相当于拿到了微信数据库的 key 了,接下来就是用这个 key 打开 DB 文件了。
TODO(smaug)