# 页面连接 Mac 微信(v0.3,实验性) 在安装微信的目标 Mac 上更新代码,重新启动 `python3 run.py`,浏览器打开本机地址,进入“连接 Mac 微信”。此后无需手动运行诊断或逐个导出数据库。 ## 页面操作 1. **扫描本机微信**:发现 `xwechat_files/<账号>/db_storage`,显示消息分片、联系人库与密钥匹配数量。自定义位置点“选择数据文件夹”。旧版 3.x 数据不会自动混入。 2. **检查签名与权限 / 读取本机密钥**:先登录微信并打开目标聊天。权限诊断显示强化运行时、允许调试与系统拒绝码;管理员按钮的结果也会保留这些信息,不再只显示通用失败。已有密钥时可选择本机 JSON 文件。 3. **安装文本解压支持**:需要 Zstandard 压缩正文时点击。通过 pip 从 PyPI 安装固定版本 `zstandard==0.23.0` wheel 到 `data/mac_deps`,不全局安装、不发送聊天;需要网络和可用的 pip。 4. **备份并导入**:先正常退出微信,保持知微运行,再点击。工具将所需数据库、WAL/SHM 复制到 `data/mac_sources/<任务>/backup`,可读库保存在同任务 `readable`。请预留至少约四倍所选数据库大小的磁盘空间。 5. 成功后进入“发现知识需求”,选择时间段、全部会话或指定群聊/私聊。业务消息分片默认不导入,需要时单独勾选。 浏览器与本地服务须运行在安装微信的同一台 Mac;Windows 页面不能读取另一台 Mac 的微信。不需要向开发者上传数据库、聊天或密钥。 ## 管理员授权仍被拒绝时 签名的调试限制和管理员身份是不同的检查。Apple 文档说明,调试工具对第三方应用取得任务端口还取决于目标是否允许调试。管理员按钮并不自动改变目标签名;因此反复输入密码可能一直失败。 页面新增可选的**临时调试副本**流程: 1. 选择账号,点击“预览临时副本方案”,查看原版位置、副本位置、完整备份位置、空间估计与影响。这一步不会修改微信。 2. 阅读影响,正常退出所有微信,勾选同意后点击“同意并备份、创建临时副本”。预览有效 30 分钟,一次性使用,切换账号必须重新预览。API 也会检查同意字段和预览令牌。 3. 工具先完整复制所选账号目录和 `all_users` 登录配置,再创建独立 `WeChat.app` 副本。账号包含图片/附件时备份可能较大。文件清单、大小或源文件状态变化会中止,不签名、不启动。 4. 只对副本添加 `com.apple.security.get-task-allow`,使用本机 `codesign` 重新签名并验证。原版应用不重签,SIP、系统开发者策略和隔离属性不修改。应用符号链接越界、原版变化或签名检查失败会中止。 5. 准备成功后,点击“启动已准备的临时副本”,按 macOS 提示打开并登录。副本保留同一应用标识,可能使用或更新同一账号本地数据,也可能要求重新登录或系统授权,因此必须先备份。不要在副本中发消息、升级或作为日常客户端使用。 6. 在副本中打开目标聊天,再点击读取密钥;必要时由你主动选择管理员读取。取得匹配密钥后,退出副本,点击备份并导入。完成后退出副本、恢复原版使用。 **此路径仍未在你的 Intel Mac 4.1.0.18 上实测,不保证副本启动、登录、原账号数据访问或密钥读取成功。** 系统拦截时不会自动绕过;失败保留备份,不自动恢复、覆盖或删除用户数据。副本具有更宽的调试权限,使用前需在页面明确同意,不会因为普通读取失败就自动创建。 ## 实际边界 **尚未通过 Intel Mac 微信 4.1.0.18 的实机验收。** 开发环境是 Windows;合成数据库与模拟测试无法证明真实微信版本可用。 - 密钥扫描通过 macOS Mach 只读接口,验证目标进程路径为 `WeChat.app/Contents/MacOS/WeChat`。最多扫描 45 秒/2 GiB 的可读可写非执行内存,仅筛选 SQLCipher 格式的 64/96 位十六进制候选,不保存内存转储。 - 默认普通用户读取;只有用户点击管理员按钮才触发系统授权。微信签名与 macOS 保护仍可能拒绝附加。工具不重签原版微信、不注入代码、不关闭 SIP。临时副本仅在页面预览并明确同意后重新签名,不保证取得密钥。 - 密钥只在进程内存,状态 API 只返回匹配数量,不回传密钥;重启后需重新读取/导入。密钥不进入模型请求、日志、Git 或发布包。 - 加密读取仅支持 SQLCipher 4 常见 raw AES-256 key、4096 字节页、80 字节保留区、SHA512 页认证与 little-endian 页编号。其他参数明确失败,不跳过认证。 - 逐页验证 HMAC 后解密;WAL 校验头、salt 与滚动校验和,仅回放到最后一次提交,不回放已校验但未提交的事务。截断、损坏或格式不匹配会停止;可读输出还会通过 SQLite `quick_check`。 - 解析支持 `Msg_` / `Chat_`、`Name2Id`、常见联系人字段,和 `create_time/message_content/local_type/real_sender_id` 结构。支持 UTF-8、可选 Zstandard 与部分 XML 引用,不保证覆盖所有版本变体。 - 无法关联会话或发送人时整次停止。消息先写独立 staging 库,全部解析成功后才用单次事务并入主库,不保留半次导入。副本保留用于本机排查。 - 图片/附件仅保留类型与可读描述,不自动 OCR 或转写。搜索索引、资源库和旧版库不当作消息正文重复导入。 - 本地副本和可读库是敏感文件,保存在受限数据目录并被 Git 忽略。任务状态和密钥均在内存;退出 Python 会中断任务,不自动恢复或重试管理员操作。 ## 实现参考 实现为本项目原创代码,使用本机加密与进程 API,不依赖已下架的微信提取工具。 - [SQLCipher API:raw key 与密钥验证](https://www.zetetic.net/sqlcipher/sqlcipher-api/) - [SQLCipher 页认证与参数实现](https://github.com/sqlcipher/sqlcipher/blob/master/src/sqlcipher.c) - [SQLite WAL 文件格式](https://www.sqlite.org/fileformat2.html#walformat) - [Apple Mach 内存区域结构](https://github.com/apple-oss-distributions/xnu/blob/main/osfmk/mach/vm_region.h) - [Apple 调试权限说明](https://developer.apple.com/documentation/bundleresources/entitlements/com.apple.security.cs.debugger)