Published on

撬开微信的抽屉——macOS 上的聊天数据去哪了

Authors

想让 AI 读懂你的微信,第一步不是写 prompt,是先找到数据、再决定要不要开锁。这篇记录一次实机摸排:微信 4.1.15,macOS 26。全程只看目录名和大小,没碰任何一条聊天内容。

数据放在哪

微信是上架 Mac App Store 的沙盒应用,数据不在你以为的地方,而在系统分给它的专属容器里:

~/Library/Containers/com.tencent.xinWeChat/Data/Documents/xwechat_files/

一台登录过的机器上,这里大概 27GB。摊开看:

xwechat_files/
├── wxid_xxxx_a91a/          # 每个登录过的账号一个目录
│   ├── msg/        24G      # attach 图片 / video 视频 / file 文件,大头在这
│   ├── db_storage/ 2.1G     # 所有数据库都在这
│   │   ├── message/         # 聊天记录
│   │   ├── contact/         # 联系人、群成员
│   │   ├── session/         # 会话列表
│   │   ├── sns/             # 朋友圈
│   │   ├── favorite/        # 收藏
│   │   ├── hardlink/        # 消息到 msg/ 文件的索引
│   │   └── MMKV/            # 腾讯自家的 KV 存储,不是 SQLite
│   ├── cache/      982M     # 按月分目录,可清
│   └── business/   86M
├── all_users/               # 跨账号共享:登录态、头像、全局配置
└── Backup/                  # 空的,说明没用过官方「迁移与备份」

两个容器要分清楚:

  • Containers/com.tencent.xinWeChat/ 是单个 App 私有的,只有微信主程序能进。
  • Group Containers/5A4RE8SF68.com.tencent.xinWeChat/ 是同一开发者多个进程共享的。5A4RE8SF68 是腾讯的 Team ID,主程序、分享扩展 WeChatMacShare、文件扩展 WeChatFileProviderExtension 都在这个 App Group 里,靠它交换登录态这类小数据。大数据库在私有容器,共享目录只放配置。

还有一道门:这些目录受 macOS 的 TCC 保护。想用命令行列目录,得给跑命令的那个 App(终端、不是 shell,也跟 sudo 无关)开「完全磁盘访问权限」。root 不好使,TCC 认的是发起访问的程序。

锁是什么

把 message 下的 .db 直接丢给 sqlite3,得到的是:

Error: file is not a database

因为它不是普通 SQLite,是 SQLCipher——SQLite 的加密分支。关键几点:

  • 整库加密,按 page 加解密(默认 4KB 一页),表名、索引一起加密。
  • 每页独立的随机 IV 加一段 HMAC 做校验,所以同样内容两次写出来密文都不同。
  • 文件头 16 字节是明文 salt,口令加 salt 过一遍 PBKDF2(4.x 默认 25 万多次迭代)才派生出真正的密钥。

这也意味着:手里同时有明文和密文也反推不出密钥。AES-256 扛得住已知明文攻击,256 位的空间没法穷举。唯一能被爆破的情形,是密钥来自一个人能记住的弱口令——而微信这把是机器生成的随机值,这条路堵死。

钥匙在哪?只在微信运行时的进程内存里,不落盘。它跟登录密码无关(不然改个密码历史记录就全废了),跟账号在这台设备上建库这件事绑定。

两条路

个人玩法:开锁读原始库

社区里 chatlog 一类的开源工具走的都是同一条思路:从运行中的微信进程内存里把密钥捞出来,再用它解密数据库的拷贝。思路本身是公开的,难点全在权限上——微信开了 hardened runtime,调试器默认附加不上去,所以这类工具普遍要求你临时关掉 SIP。

  • 优点:拿到最底层、最完整的数据。联系人、群、朋友圈、每条消息连带附件索引,想怎么分析怎么分析,全程在本地。
  • 代价:
    • 关 SIP 是降低整机安全等级,不只是微信;读完要记得开回去。
    • 工具以高权限跑,来路不明的二进制别直接信,看得懂源码再上。
    • 密钥大概率绑设备——直接把目录拷到另一台机器,很可能解不开。这也是为什么官方迁移要走它自己那套流程,而不是让你拷文件夹。
    • 库 schema 没有文档,版本一升级表结构就可能变,解析逻辑得跟着改。
    • 纯属灰色地带,自己的号、自己的数据、自己玩,别往外推。

一句话:能跑通,但每次都是跟系统安全设置和微信版本赛跑,不适合交给别人。

产品化:别碰密钥

要做成给客户用的东西,上面那套一步都不能有——你没法要求用户关 SIP,也背不起从别人机器里抠密钥的合规责任。可选的是微信自己开的门:

  • 官方「聊天记录迁移与备份」 导出的数据。

  • 企业微信 / 公众号那边的官方 API。

  • 用户手动授权、主动交出的内容(截图、复制、导出文件)。

  • 优点:合规、稳定、不跟系统设置较劲,用户换机器升级版本都不受影响。

  • 代价:

    • 拿到的数据又少又糙,格式还不一定可解析——Backup/ 是空的,说明很多人压根没用过备份功能。
    • 覆盖不到个人微信的历史全量,能力边界由腾讯说了算。
    • 要用户多走几步,体验上先输一截。

怎么选

个人 hack产品方案
数据完整度全量残缺
合规灰干净
稳定性跟版本赛跑稳
能不能给别人用不能能
要不要动系统安全关 SIP不动

自己折腾,走第一条,图个完整;要做成产品,老老实实走官方门,接受数据的残缺。中间没有既完整又合规的捷径——这恰恰是微信把锁设计成这样的本意。


本文只做存储结构的技术记录。微信聊天记录属于第三方个人信息,任何读取都请限定在你自己的账号和设备上。