项目研究: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 单会话导出 |
「它怎么转」逻辑全景图

├─ 触发层
│ ├─ 你说"全量/首次/换设备/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"做成一阶规则
- 高级玩家和别人最大的差距:他们对"明文库 = 自己的全部隐私"这件事有敬畏心
「能用在哪」场景迁移

├─ 场景 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 拿你的钥匙开自己的柜子。"——能力上限很高,隐私下限也很低,敬畏心和工程能力一样重要。
本系列持续更新各类开源项目的解构研究,欢迎关注。