Article

项目研究:wechat-local-vault

项目研究:wechat-local-vault

蓝色像素虾守着本地聊天数据库保险柜
图 1:wechat-local-vault 是把本机聊天数据变成只读、可检索的私人档案柜。

> 一个让 Agent 把 Mac 微信本地数据库解密成"私人可检索档案柜"的 Skill。

「这是什么」一句话定性

一个让 Agent 能把 Mac 微信本地数据库解密成自己的资产库、再用 CLI 当数据库一样查的 Skill——本质是把微信变成"私人可检索的本地档案柜"。

仓库位置

项目 信息
仓库 github.com/mcncarl/yichen-skills
路径 wechat-local-vault/
定位 个人 Agent Skill,假定单机单微信,不分叉、不商业化、不处理第二微信容器

关键文件

文件 作用
SKILL.md Agent 触发词和工作流定义
scripts/extract_keys.py Frida hook 抓 SQLCipher 派生 key
scripts/decrypt_all_dbs.py 全量/增量解密 11 个 .db 库
scripts/vault_cli.py 统一查询 CLI(19 个子命令)
scripts/export_chat.py 按联系人/会话 ID 单会话导出

「它怎么转」逻辑全景图

wechat-local-vault 从 key、解密库到只读 CLI 和摘要素材包的流程图
图 2:这条链路的关键是本机取钥匙、本机解库、本机只读查询。
├─ 触发层
│  ├─ 你说"全量/首次/换设备/key 没了" → 走全量
│  ├─ 你说"增量/今天/新消息/从上次继续" → 走增量
│  ├─ 你说"分析我和某某"/指定会话 ID → 单会话导出
│  ├─ 你说"朋友圈/收藏夹" → 单库解析
│  └─ 你说"群聊精华/日报/复盘" → 摘要素材包
│
├─ 核心层(链路)
│  1. extract_keys.py — 用 Frida hook CCKeyDerivationPBKDF,抓 SQLCipher 的派生 key
│     └─ 注意:它要你在桌面放一个 ad-hoc 重签名的微信副本,attach 这个副本而不是原版
│  2. decrypt_all_dbs.py — 用 key + salt 解密 message/contact/session/sns/favorite 等 11 个 .db
│     └─ 支持 full / incremental(跳过未变化的库)
│  3. vault_cli.py — 统一只读入口
│     └─ 子命令:status / sessions / contacts / history / search / stats / favorites / moments / digest-source
│  4. export_chat.py — 按联系人/chat-id/时间范围导出 Markdown
│  5. digest-source — 把大群聊"先落文件再分析":sources + profiles(普通版+毒舌版) + imgs/
│
├─ 输出层
│  ├─ 解密库:~/Library/Application Support/wechat-local-vault/decrypted/current
│  ├─ 增量状态:vault/state/
│  ├─ 摘要素材:~/Documents/wechat-digests/{group_id}-{name}/
│  └─ 导出报告:~/Documents/wechat-local-vault/exports/
│
└─ 卡点层(新手最容易翻车的地方)
   ├─ 重签名微信副本——这是整个方案的物理前提。原版微信有签名校验,直接 attach Frida 会被 Gatekeeper 拦
   ├─ 触发 PBKDF2——key 不是登录就能拿到,必须在微信里手动点开收藏夹 + 朋友圈滚动一次
   ├─ SQLCipher 版本对齐——不同微信版本的 rounds、HMAC 算法、reserved 字节数不一样,4.x 硬编码
   ├─ 增量鉴权漂移——账号切换、密码修改、设备迁移都可能让 key 失效
   └─ 隐私与项目混放——明文库绝不进项目目录、绝不进聊天回复、绝不进网盘

「怎么升级」三段位路线图

├─ 入门段(能用)
│  └─ 把 vault_cli.py 当 "我的微信的 sqlite CLI" 用:
│     - 每天增量刷新一次
│     - 用 sessions / history / search 取代翻微信找消息
│     - 30 天就能多一个"私人搜索引擎"
│
├─ 进阶段(用好)
│  └─ 把"私域数据"接入 Agent 工作流:
│     - 给联系人/群聊建画像:digest-source 跑普通版+毒舌版,定期对比
│     - 把朋友圈和收藏夹当 RSS:定期抓感兴趣的关键词
│     - 学 SQLCipher 协议和 Frida hook 原理,能自己 debug
│
└─ 高手段(用活)
    └─ 把 vault 变成 Agent 的"上下文来源":
       - 在大模型对话前先把相关历史喂进去,让 Agent 真的"记得"你
       - 自己写增量调度(cron + 定时 + 报告)
       - 把"哪些数据能进 vault / 哪些绝不能出 vault"做成一阶规则
       - 高级玩家和别人最大的差距:他们对"明文库 = 自己的全部隐私"这件事有敬畏心

「能用在哪」场景迁移

wechat-local-vault 明文库和本机隐私边界风险图
图 3:明文库一旦生成,权限、目录和导出边界就比功能本身更重要。
├─ 场景 1:任何 SQLCipher/SQLite 本地数据库的解锁-查询-导出闭环
│  ├─ 微信、QQ、企业微信、钉钉本地缓存、Notion 缓存、Obsidian vault、Telegram Desktop
│  └─ 迁移变量:app 是否启用了加密、key 是否能从内存抓到、数据库 schema 是否稳定
│
├─ 场景 2:Frida hook + 本机资产数字化的通用范式
│  ├─ 任何"客户端加密但 key 留在内存"的桌面应用都可以套这个模板
│  └─ 三步模板:① 重签名副本绕过校验 ② hook 加密函数拿 key ③ 落库 + CLI 查询
│
└─ 部署建议(如果装这个 skill)
   ├─ 好处:把微信变成可编程的"个人数据库",客户跟进、关系复盘、内容沉淀全打通
   ├─ 必要配置
   │  - key 文件权限 600
   │  - 明文库放 Application Support 目录,不要放桌面/网盘/项目目录
   │  - 摘要素材包和导出报告分开目录,便于审计
   ├─ 风险
   │  - 重签名微信可能触发腾讯风控(双开检测、二次验证)
   │  - PBKDF2 key 落到磁盘后,整库就是裸文本
   │  - 微信升级一次,rounds/HMAC 算法可能变,脚本要跟着改
   └─ 不适用:双开微信、企业微信、Linux 微信、Windows 微信

一句话灵魂

"在你电脑上偷偷给微信做个只读的影子数据库,让 Agent 拿你的钥匙开自己的柜子。"——能力上限很高,隐私下限也很低,敬畏心和工程能力一样重要。


本系列持续更新各类开源项目的解构研究,欢迎关注。