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
codesign --force --deep --sign - /Applications/WeChat.app(已完成 ad-hoc 签名)
tccutil reset 清理旧授权(按 README 要求)
killall WeChat && open /Applications/WeChat.app
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>' 模式匹配,改为:
- 在 WeChat Mach-O 二进制中静态分析定位 passphrase 存储位置(参考 wcdb-key-tool 的 ELF 方案)
- 读取 passphrase 后,对每个 DB salt 执行 PBKDF2-SHA512(256K 迭代)派生 enc_key
这可能与 Issue #70(WeChat 4.1.9 兼容性)是同一个根本原因。
Environment
defaults read)Steps
codesign --force --deep --sign - /Applications/WeChat.app(已完成 ad-hoc 签名)tccutil reset清理旧授权(按 README 要求)killall WeChat && open /Applications/WeChat.appsudo wx init --forceOutput
随后
wx sessions报错:无法解密 session.dbExpected
提取到至少 17 个数据库对应的密钥,写入
all_keys.json,后续命令正常解密。Actual
all_keys.json为空{},所有数据库无法解密。Details
数据库文件盐值(前 16 字节 hex),确认均为 SQLCipher 加密格式:
Root Cause Analysis
参考 Issue #30(Linux WeChat 4.1.1.4 的同样问题),TANGandXUE 已定位根因:
macOS 版 4.1.9 与 Linux 版 4.1.1.4 表现完全一致:内存扫描能找到候选模式(25 个),但 salt 无一匹配数据库。
Proposed Fix
需要修改 macOS 密钥提取逻辑,不再仅依赖
x'<96hex>'模式匹配,改为:这可能与 Issue #70(WeChat 4.1.9 兼容性)是同一个根本原因。