Skip to content

macOS: WeChat 4.1.9 key extraction fails — 0/25 keys matched #73

@kylezhang

Description

@kylezhang

Environment

  • OS: macOS 26.4.1 (Apple Silicon, arm64)
  • WeChat: 4.1.9 (build from defaults read)
  • wx-cli: v0.3.0 (npm global)

Steps

  1. codesign --force --deep --sign - /Applications/WeChat.app(已完成 ad-hoc 签名)
  2. tccutil reset 清理旧授权(按 README 要求)
  3. killall WeChat && open /Applications/WeChat.app
  4. sudo wx init --force

Output

检测微信数据目录...
找到数据目录: ~/Library/Containers/com.tencent.xinWeChat/Data/Documents/xwechat_files/<redacted>/db_storage
扫描加密密钥(需要 root 权限)...
WeChat PID: 82366
Got task port: 6675
扫描数据库文件...
找到 17 个加密数据库
扫描进程内存寻找密钥...
找到 25 个候选密钥
匹配到 0/25 个密钥
成功提取 0 个数据库密钥

随后 wx sessions 报错:无法解密 session.db

Expected

提取到至少 17 个数据库对应的密钥,写入 all_keys.json,后续命令正常解密。

Actual

all_keys.json 为空 {},所有数据库无法解密。

Details

数据库文件盐值(前 16 字节 hex),确认均为 SQLCipher 加密格式:

1a96d281fcdebcfe1f10724f83661389  hardlink.db
a552c89ce1fb99b5ae4e6703c3f1217f  head_image.db
2a4e3ea0968a75ab2acd7cf46c556930  solitaire.db
46ec959b283e9cb411e9930fcb46333e  contact_fts.db
ab46337fa8a47c45a4745181b0852860  contact.db
6723dc822f10c1695cac0f0e73917f04  sns.db
81b2c151f0623902e8edffcc42f09456  general.db
f0d37c399a015c64359ade5a1af37200  message_fts.db
dd2a06d16e9154c4d381c7a112ad6e10  message_0.db
e3a61d83e4b4a958cdc294ee188fa6be  media_0.db
54167094fa75b21a408826dc4ab2f779  message_resource.db
e13af478812296251f2f8a151f0c5a7a  biz_message_0.db
30aa44c08f473a1580fbe47fdfe484e2  favorite.db
8f24463519f5f85db32effc2ba90118e  favorite_fts.db
f5f58e6ceb9050b7ec91d38d03ae397f  emoticon.db
2db8ad1849331cf22b77a3e97e34d1ac  bizchat.db
2238e8ae7eae442d4d8567e0c6dcc82c  session.db

Root Cause Analysis

参考 Issue #30(Linux WeChat 4.1.1.4 的同样问题),TANGandXUE 已定位根因:

微信 4.1+ 不再在进程内存中缓存 raw enc_key。内存中 x'<hex>' 模式对应的 salt 与数据库文件的 salt 不匹配,因为缓存的是其他用途的密钥。

实际的数据库密钥以 passphrase 形式存在,需要经过 PBKDF2-SHA512(256,000 次迭代) 才能派生出真正的 enc_key。

macOS 版 4.1.9 与 Linux 版 4.1.1.4 表现完全一致:内存扫描能找到候选模式(25 个),但 salt 无一匹配数据库。

Proposed Fix

需要修改 macOS 密钥提取逻辑,不再仅依赖 x'<96hex>' 模式匹配,改为:

  1. 在 WeChat Mach-O 二进制中静态分析定位 passphrase 存储位置(参考 wcdb-key-tool 的 ELF 方案)
  2. 读取 passphrase 后,对每个 DB salt 执行 PBKDF2-SHA512(256K 迭代)派生 enc_key

这可能与 Issue #70(WeChat 4.1.9 兼容性)是同一个根本原因。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions