前言

晚上女友在整理近几个月的加班记录,一边骂骂咧咧一边查我们的聊天记录。至于为什么查我们的聊天记录,主要是因为她之前偷懒,没有记录,每天下班,就给我发个“下班了”。

我一想,这有规律啊,如果能把聊天记录导出来,再稍加分析,那不就能生成加班记录了么!

问题

想法有了,那么问题也来了,就是微信的聊天数据是加密的,如何获取这个 Key 呢?经过一番搜索,看到了一篇相关的技术博客:「导出多年微信聊天记录,我用可视化分析了出自己的口头禅」1 然后顺藤摸瓜找到了一个开源项目 kekeimiku/dumpkey2

下载下来后按照说明,执行对应的命令,但总是失败,结果如下:

./ptrsx-dumper test --pid $(pgrep WeChat |head -1) --path "WeChat+0x4C58BC0->0->8->8->16->32->8->8->64->8->0->0" -n 32
Error: OpenProcess(5)

试了几次还是一样的结果,难道这玩意失效了,于是我又找到了一篇跟底层的技术文档:「打造 macOS 下最强的微信取证工具」3

按照这篇文章中的步骤一步一步执行,不出意外的话是要出意外了,在第一步就出现了错误:

lldb -p $(pgrep WeChat)
(lldb) process attach --pid 24786
error: attach failed: attach failed (Not allowed to attach to process.  Look in the console messages (Console.app), near the debugserver entries, when the attach failed.  The subsystem that denied the attach permission will likely have logged an informative message about why it was denied.)

然后又是一顿搜索,果然让我找到了根本原因,因为我的 macOS SIP 是开启的,所以无法执行这种截取进程内存信息的 debug 操作!

然后就是进入 Recover 模式,将 SIP 关闭,这下果然可以正常获取了!然后我又试了一下 kekeimiku/dumpkey 这个开源工具,发现也可以正常获取聊天数据库的 Key 了!

导出数据

需要下载 DB Browser for SQLite4,下载安装好以后,我怀着忐忑的心情用这个软件打开聊天数据库,程序直接 Crash 了,根本无法打开数据库。试了两台 macOS 都是一样的结果,真是天坑!

后来我就想下个 Windows 版的试试呢,刚好我有一台 Windows 的主机,平时用来跑跑 Kubernetes 集群的,在 Windows 上安装好以后,果不其然聊天数据库正常打开了,但是 macOS 客户端不同的是,Windows 版安装好以后有两个图标,一个是 DB Browser (SQLite) 另一个是 DB Browser (SQLCipher) 用第二个程序才可以正常打开微信的聊天数据库!

好吧,我只能在 Windows 上挨个打开微信的聊天数据库,然后导出为 JSON,以便于用代码进行分析。当然也支持导出 CSV,不过感觉读取可能会有问题,毕竟如果有标点符号啥的,不好处理!

总结

到这一步就好办了,无非是将聊天数据进行过滤,提取聊天中包含下班关键词的,然后提取发送时间和消息内容为下一次精准过滤做准备。

提取只包含下班关键词的对话后,再按发送时间过滤,只提取发送时间大于正常下班时间加 1 小时 后的聊天记录,因为她们是下班后一小时内加班,不算加班!

然后再将这些发送时间减去正常下班时间,得出加班时长,最后导出数据表,搞定!

又可以跟女朋友提一个无理的要求了…

I hope this is helpful, Happy hacking…