7.6 KiB
macOS 密钥支持移植指南
1. 目标与归属
本仓库的 macOS 微信密钥与解密支持,正式归属在 native-dlls/ 与 electron/services/。
native-dlls/是正式原生实现入口。resources/macos/是正式运行时产物目录。WxKey-CC/只保留为上游镜像参考,不作为运行时依赖目录。WeFlow/只用于对照 TS 流程和资源布局,不直接参与当前项目发布。
当前已接入的 mac 产物命名如下:
resources/macos/libwx_key.dylibresources/macos/xkey_helperresources/macos/image_scan_helperresources/macos/libwcdb_api.dylibresources/macos/libwcdb_decrypt.dylib
2. 关键事实
2.1 DbKey 获取不是直接靠 GetDbKey()
WxKey-CC/platform/macos/exports.cpp 中的 GetDbKey() 只负责:
- 定位微信主进程
- 附加进程
- 扫描出目标断点地址
它返回的不是最终 64 位 DbKey,而是目标地址或错误字符串。
真正的 DbKey 由 helper_main.cpp 对应的 helper 进程通过断点捕获得到。当前项目运行时走的是:
- Electron 主进程调用
wxKeyServiceMac.autoGetDbKey() - 检查 SIP
- 用 AppleScript
with administrator privileges拉起xkey_helper xkey_helper <pid> <timeout_ms>附加微信并等待数据库访问- helper 从 stdout 返回 JSON,主进程解析出最终 64 位 DbKey
2.2 helper 协议
xkey_helper 的真实调用方式是:
xkey_helper <pid> [timeout_ms]
stdout 返回 JSON:
{"success":true,"key":"64_hex_key"}
失败时 stdout 仍返回 JSON,但错误内容来自 helper 内部 ERROR:* 结果映射。
2.3 SIP 前置条件
本期接受以下现实限制,并且 UI 与文档都必须明确写出:
- DbKey 抓取要求关闭 SIP
- 图片密钥的内存扫描兜底要求关闭 SIP
kvcomm + wxid验真路径优先,不要求先做内存扫描
检查方式:
csrutil status
如果输出包含 enabled,当前项目会在 mac 上直接拒绝自动抓取 DbKey。
3. 当前仓库实现落点
3.1 Electron 主进程
electron/main.tswxkey:*IPC 已做平台分支imageKey:getImageKeys已做平台分支dbpath:getBestCachePath已做平台分支- 新增
app:getPlatformInfo
3.2 Electron 服务层
electron/services/wxKeyServiceMac.ts- DbKey helper 提权流程
- SIP 检查
- mac 微信进程识别
- kvcomm 优先的图片密钥推导
image_scan_helper/ Mach API 内存扫描兜底
electron/services/dbPathService.ts- 支持旧版
xwechat_files - 支持 4.0.5+ 新路径
~/Library/Application Support/com.tencent.xinWeChat/<version>
- 支持旧版
electron/services/wcdbService.ts- mac 加载
resources/macos/libwcdb_api.dylib
- mac 加载
electron/services/nativeDecryptService.ts- mac 加载
resources/macos/libwcdb_decrypt.dylib
- mac 加载
3.3 前端与引导页
src/pages/WelcomePage.tsxsrc/pages/SettingsPage.tsx
这两处已经需要按平台隐藏或替换:
Weixin.exe- Windows Hook 提示
- 盘符缓存目录提示
- Windows Hello 入口
4. 原生构建入口
正式构建入口是:
native-dlls/build-macos.sh
该脚本只负责构建 native 产物,不负责 Electron 整包构建。
脚本做的事情:
- 使用
native-dlls/sqlcipher_src构建 SQLCipher - 配置
native-dlls/CMakeLists.txt - 构建
wx_key、wcdb_api、wcdb_decrypt - 将产物输出到
resources/macos/ - 为 helper 补
chmod +x - 在本机存在
codesign时做 ad-hoc 签名
5. CMake 真实目标
当前 native-dlls/ 下的 mac 目标如下:
wx_key- 输出
libwx_key.dylib - 源码来自
WxKey-CC/platform/common + platform/macos
- 输出
xkey_helper- 输出
resources/macos/xkey_helper - 源码来自
WxKey-CC/platform/macos/helper_main.cpp
- 输出
image_scan_helper- 输出
resources/macos/image_scan_helper - 是当前项目自己的轻量包装器
- 输出
wcdb_api- 输出
libwcdb_api.dylib - mac 侧链接仓库内构建出的 SQLCipher
- 输出
wcdb_decrypt- 输出
libwcdb_decrypt.dylib - mac 侧使用 CommonCrypto
- 输出
不是文档里旧写法的这些目标:
- 不是
libwx_keytarget - 不是
xkey_helper_macos运行时名称 - 不是直接从
WxKey-CC/目录拿产物进包
6. 资源目录
运行时统一读取:
resources/macos/
libwx_key.dylib
xkey_helper
image_scan_helper
libwcdb_api.dylib
libwcdb_decrypt.dylib
entitlements.mac.plist
image_scan_entitlements.plist
Electron 打包时通过 package.json -> build.extraResources 带入整个 resources/,不需要单独再为 WxKey-CC/ 配额外资源。
7. 数据路径识别
当前项目在 mac 上要识别两类微信数据目录:
7.1 旧路径
~/Library/Containers/com.tencent.xinWeChat/Data/Documents/xwechat_files
~/Documents/xwechat_files
7.2 新路径
~/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/<version>
对外给前端的仍然是“数据库根目录”概念,但后端会继续向下解析:
- 账号目录
db_storagesession.db
8. 图片密钥策略
当前项目在 mac 上使用的顺序是:
kvcomm码收集- 基于
wxid的候选验真 - 如果失败,再调用
image_scan_helper或 Mach API 做内存扫描
对外保持原有返回结构:
{ success, xorKey?, aesKey?, error? }
其中:
xorKey仍然给当前项目直接消费aesKey仍然是 16 位字符串
9. WCDB 与解密
9.1 wcdb_api
当前做法是跨平台 C ABI,不再依赖 Windows 风格导出写法。
- Windows 仍可保留现有
WCDB.dll资源装载 - mac 侧改为链接 SQLCipher
- 统一导出:
wcdb_initwcdb_open_accountwcdb_close_accountwcdb_exec_querywcdb_get_sns_timelinewcdb_test_connection
9.2 wcdb_decrypt
- Windows 保留现有 CNG 版本
- mac 新增 CommonCrypto 版本
- 导出函数名不变:
Wcdb_DecryptDatabaseWcdb_DecryptDatabaseWithProgressWcdb_ValidateKeyWcdb_IsDecryptedWcdb_GetLastErrorMsg
10. 打包配置
package.json 已预留 mac 打包配置:
build.mac.hardenedRuntimebuild.mac.entitlementsbuild.mac.entitlementsInherit
注意:
- 这只是为后续打包接入准备
- 当前计划不包含执行 Electron 整包构建
11. 推荐开发流程
11.1 只开发 native
cd native-dlls
chmod +x build-macos.sh
./build-macos.sh
11.2 只验证产物
验证输出文件是否齐全:
ls -la resources/macos
检查 helper 是否可执行:
file resources/macos/xkey_helper
file resources/macos/image_scan_helper
检查 dylib 符号:
nm -gU resources/macos/libwx_key.dylib | grep GetDbKey
nm -gU resources/macos/libwcdb_api.dylib | grep wcdb_open_account
nm -gU resources/macos/libwcdb_decrypt.dylib | grep Wcdb_DecryptDatabase
11.3 只验证 helper 协议
resources/macos/xkey_helper <pid> 180000
预期 stdout 是 JSON,而不是裸字符串。
12. 本期边界
本期明确不做:
- Touch ID / Keychain 应用锁
- 在 mac 上伪装 Windows Hello
- 直接把
WxKey-CC/当运行时资源目录 - 自动执行 Electron 整包构建
13. 后续同步规则
后续如果 WxKey-CC 上游更新:
- 先对比
WxKey-CC/platform/common与platform/macos - 再手工回灌到
native-dlls/的构建入口和项目包装层 - 不直接改当前项目去依赖
WxKey-CC/目录运行
这份文档以当前仓库事实为准。如果实现与文档再次偏离,优先修正文档和 native-dlls/ 构建入口,不要继续在 Electron 层堆临时兼容逻辑。