📚 离职知识库

Mac 微信 4.1 真实聊天记录导出 —— 落地方案

针对你的机器实测:微信 Mac 4.1.0,SIP 开启,聊天库 message_0.db(154MB) 是 SQLCipher4 加密。 目标:导出三个联系人(H2贾博涵 / 鲁丰源-蒙蒙 / 妹妹)→ 按客户分区 → 喂 AI → 接进本地前端。全程本地,不上云。

#一、为什么截图这条路不行

聊天记录动辄上万条,逐屏截图+读图不现实(你已验证)。必须走数据库解密。而 message_0.db 已确认是密文(头部随机字节),要拿到 32 字节密钥才能解——密钥不在磁盘,只在运行中的微信进程内存里。这是整件事唯一的硬门槛。

#二、GitHub 现成仓库(已核实,Mac 4.x 可用)

项目 链接 取 key 方式 需关 SIP 产物 / 接口 说明
ydotdog/wechat-export-macos github.com/ydotdog/wechat-export-macos 重签名微信+扫内存 TXT/CSV/JSON 一键:重签→取key→解密→导出。Intel+ARM。~44★ 较冷门但最省事
Thearas/wechat-db-decrypt-macos github.com/Thearas/wechat-db-decrypt-macos 重签名+扫内存 解密后的 db arm64,实测到 4.1.2.241,纯解密
teest114514/chatlog_alpha github.com/teest114514/chatlog_alpha Frida 注入 (Recovery 里 csrutil disable) HTTP+MCP :5030 chatlog 删库后最活跃继任者,实测 4.1.11,接口最适合对接 pipeline。1.1k★
ycccccccy/wx_key github.com/ycccccccy/wx_key 扫内存 库key+图片key 需要还原图片时用

被腾讯 DMCA 干掉的(别找了):PyWxDump、chatlog 原库、0xlane/wechat-dump-rs(Windows-only 且已 451 封)。

#三、解密技术参数(拿到 key 后,供参考)

微信 4.x = 腾讯 WCDB 封装的 SQLCipher4,每个 .db 一把独立 key:

PRAGMA key = "x'<64位hex密钥>'";
PRAGMA cipher_page_size = 4096;
PRAGMA kdf_iter = 256000;
PRAGMA cipher_hmac_algorithm = HMAC_SHA512;
PRAGMA cipher_kdf_algorithm = PBKDF2_HMAC_SHA512;

解密后:消息在 Msg_<md5(talker)> 分表(列 local_type/create_time/real_sender_id/message_content),发送方靠 Name2Id 表反查,联系人在 contact.dbcontact 表。类型码:1 文本/3 图片/34 语音/49 文件链接/10000 系统/10002 撤回。

#四、推荐路线(两条,按你偏好选)

#路线 A:不关 SIP(推荐,无需重启进恢复模式)

只需给微信 ad-hoc 重签名去掉 hardened runtime,其他进程就能扫它内存取 key:

# 1. 退出微信
osascript -e 'quit app "WeChat"'
# 2. 重签名(去掉签名限制)—— 需要你输 sudo 密码
sudo codesign --force --deep --sign - /Applications/WeChat.app
# 3. 重开微信并登录
# 4. clone 并运行导出工具(它会扫内存取 key + 解密 + 导出 JSON)
git clone https://github.com/ydotdog/wechat-export-macos && cd wechat-export-macos
#   按其 README 运行,导出这三个联系人为 JSON

代价:微信每次自动更新后要重签一次;重签后微信可能提示重新登录。

#路线 B:临时关 SIP + chatlog_alpha(接口最顺,但要重启)

# 1. 重启进恢复模式(开机按住电源)→ 终端执行 csrutil disable → 重启
# 2. 装 chatlog_alpha,取 key 并起服务
git clone https://github.com/teest114514/chatlog_alpha && cd chatlog_alpha
#   按 README:chatlog key(重启微信那几秒 Frida 抓 key)→ chatlog server
#   服务起在 http://127.0.0.1:5030
# 3. 用完把 SIP 关回去:恢复模式 csrutil enable

#五、下游已全部就绪(我这边做完了)

不管你用哪条路线拿到数据,接进 demo 的部分我已经写好并跑通(demo 数据验证过):

  • wechat-ai-pipeline/src/import-from-chatlog.mjs —— 走路线 B 时:从 chatlog 的 5030 接口直接拉这三个联系人 → 转成标准格式。
    CHATLOG_API=http://127.0.0.1:5030 TALKERS="H2贾博涵,鲁丰源-蒙蒙,妹妹" node src/import-from-chatlog.mjs
    走路线 A 时:把导出的 JSON 整理成 input/real-messages.json(格式见 pipeline README),或把样例发我我帮你写映射。
  • src/pipeline.mjs --input input/real-messages.json —— 按客户分区→清洗脱敏→云雾 LLM 生成画像+话术 → output/real-profiles.json已 gitignore,绝不上云)。
  • server.mjs —— 本地后端,只在你机器上把真实画像喂给前端(http://localhost:8787)。
  • 前端「AI 落地」页 —— 本地 dev 设 NEXT_PUBLIC_PROFILES_API 就读真实数据,页面显示绿色「真实数据(本地,未上传云端)」标;线上永远只有假 demo

一条命令串起来(路线 B 拿到数据后):

cd ~/Desktop/FDE/wechat-ai-pipeline
CHATLOG_API=http://127.0.0.1:5030 TALKERS="H2贾博涵,鲁丰源-蒙蒙,妹妹" node src/import-from-chatlog.mjs
YUNWU_API_KEY=<你的key> node src/pipeline.mjs --input input/real-messages.json
node server.mjs &        # 本地后端
cd ../zhixingyuan && NEXT_PUBLIC_PROFILES_API=http://localhost:8787/api/profiles npm run dev

#六、只有你能做的那一步 & 风险

  • 重签名微信 / 关 SIP / sudo:这些是系统级安全操作,我不会偷偷替你执行——需要你亲自敲(上面命令都给了)。
  • 重签名会让微信失去官方签名校验;关 SIP 期间系统安全性下降,取完 key 立刻 csrutil enable 关回去
  • 三个联系人里「鲁丰源-蒙蒙」那条涉及"改文件重打印签名"的对话——我只做如实导出你已有的记录,不参与任何文件的修改/签名/伪造。
  • 全程本地:真实记录、解密库、画像 JSON 都不提交 git、不部署 Vercel(已 gitignore + 架构隔离)。

#附:wechat-export-macos 工具 README

#wechat-export-macos

macOS 微信聊天记录一键解密导出工具。从运行中的微信进程提取数据库密钥,解密本地 SQLite 数据库,导出为可读的 TXT / CSV / JSON 格式。

支持 WeChat 4.x(新版微信),适用于 macOS (Apple Silicon & Intel)

#原理

微信进程内存 ──提取密钥──▶ all_keys.json ──解密──▶ 明文 SQLite ──导出──▶ TXT/CSV/JSON
   (WCDB/SQLCipher 4)       (AES-256-CBC)          (.db files)         (chat history)

微信使用 WCDB(基于 SQLCipher 4)加密本地数据库。每个 .db 文件有独立的 AES-256 密钥,缓存在进程内存中,格式为 x'<64hex_key><32hex_salt>'。本工具通过 Mach VM API 扫描微信进程内存,匹配密钥模式并验证正确性,然后逐页解密数据库。

#快速开始

#前置条件

  • macOS 11+
  • 微信桌面版 4.x(已登录,聊天记录已同步)
  • Python 3.8+
  • Xcode Command Line Tools:xcode-select --install

#第一步:重签微信(去掉 Hardened Runtime)

# 先退出微信,然后执行:
sudo codesign --force --deep --sign - /Applications/WeChat.app

# 重新打开微信并登录

为什么需要重签? macOS 微信默认带有 Hardened Runtime,阻止其他进程通过 task_for_pid 读取其内存。重签为 ad-hoc 签名后移除了这个限制。微信更新后需要重新执行此步骤。

替代方案: 关闭 SIP(csrutil disable),则无需重签,但影响范围更大。

#第二步:编译密钥扫描器

cc -O2 -o find_all_keys_macos find_all_keys_macos.c -framework Foundation

#第三步:提取密钥

# 确保微信正在运行且已登录
sudo ./find_all_keys_macos

输出 all_keys.json,包含所有数据库的解密密钥。

#第四步:安装 Python 依赖 & 解密

pip3 install pycryptodome

# 首次运行会自动检测微信数据目录并生成 config.json
python3 decrypt_db.py

解密后的数据库在 ./decrypted/ 目录下。

#第五步:导出聊天记录

# 列出所有会话(按消息数排序)
python3 export_chat.py --list

# 导出某个联系人的聊天记录(模糊搜索昵称/备注)
python3 export_chat.py --name "张三" --output ~/Downloads/张三

# 直接指定用户名导出
python3 export_chat.py --username wxid_xxxxx --output ~/Downloads/output

# 指定自己的 wxid(可选,通常自动检测)
python3 export_chat.py --name "张三" --my-wxid wxid_xxxxx --output ~/Downloads/张三

导出文件:

  • chat.txt — 纯文本,可直接阅读
  • chat.csv — 表格格式,可用 Excel/Numbers 打开
  • chat.json — 结构化 JSON,适合编程分析

#聊天记录迁移提示

Mac 微信默认只保留在 Mac 上收发的消息。如果需要手机上的历史记录:

  1. 手机微信 → 设置 → 通用 → 聊天记录迁移与备份 → 迁移到电脑
  2. 选择要迁移的聊天和时间范围
  3. Mac 微信扫码接收
  4. 迁移完成后重新执行第三步(提取密钥)和第四步(解密)

#文件说明

文件 说明
find_all_keys_macos.c C 语言密钥扫描器,通过 Mach VM API 读取微信进程内存
decrypt_db.py 数据库解密器,逐页解密 SQLCipher 4 加密的数据库
export_chat.py 聊天记录导出工具,支持按联系人导出为 TXT/CSV/JSON
config.py 配置加载器,自动检测微信数据目录
key_utils.py 密钥工具函数

#数据库结构

解密后的数据库位于 ./decrypted/

decrypted/
├── contact/contact.db          # 联系人(昵称、备注、头像URL等)
├── session/session.db          # 会话列表
├── message/message_0.db        # 聊天记录(按时间分片)
├── message/message_1.db
├── message/message_2.db
├── message/message_fts.db      # 全文搜索索引
├── message/media_0.db          # 语音消息
├── sns/sns.db                  # 朋友圈
├── favorite/favorite.db        # 收藏
├── emoticon/emoticon.db        # 表情包
└── ...

每个联系人/群的消息存在以 Msg_<md5(username)> 命名的表中。

#常见问题

Q: task_for_pid failed 怎么办? 确保:(1) 用 sudo 运行;(2) 微信已重签(见第一步);(3) 微信正在运行。

Q: 微信更新后还能用吗? 微信更新会恢复原始签名,重新执行第一步(重签)即可。

Q: 导出的消息中为什么有 [压缩内容] 微信 WCDB 对部分消息内容使用了 zstd 压缩(WCDB_CT_message_content=4),需要额外解压。大部分文本消息不受影响。

Q: 图片/视频/语音怎么导出? 本工具目前导出文本记录。图片等媒体文件存储在微信的文件目录中(xwechat_files/.../Message/),需要通过 message_resource.db 关联路径提取,后续版本可能支持。

Q: 支持群聊吗? 支持。群聊的表名是 Msg_<md5(chatroom_id)>,导出方式相同。群聊中会显示每个发言者的 wxid(后续可关联到昵称)。

#致谢

#License

WTFPL - Do What The Fuck You Want To Public License.

来源:沉淀/FDE/调研4-Mac真实导出落地方案.md;沉淀/FDE/wechat-export-macos/README.md(整理于 2026-08-18)