wechat-decrypt-toolkit/docs/SYNC_INSTANCES.md

4.3 KiB
Raw Permalink Blame History

sync_instances.py 使用文档

功能WeChat 多实例自动发现 + wxid 解析 + keys 同步 位置wechat-decrypt-toolkit/sync_instances.py


快速开始

# 查看所有实例状态
python3 sync_instances.py

# 自动导出缺失 keys
python3 sync_instances.py --export

# JSON 输出(供脚本调用)
python3 sync_instances.py --json

依赖

  • Python 3.10+
  • 系统工具:pgreplsofmacOSpsmacOS
  • 同一仓库:wechat_db/ 模块
  • 扫描器:bin/find_all_keys_macosC 编译二进制)

无需 frida无需注入无需关闭 SIP。


命令行参数

参数 说明
无参数 扫描所有 WeChat 实例,显示 PID、wxid、keys 状态
--export 为缺失 keys 的实例自动执行导出
-f, --force 强制重新导出(覆盖已有 .keys 文件)
--watch 持续监控模式,新实例出现时自动导出
--interval N watch 模式检测间隔(秒,默认 10
--wxid <id> 只处理指定 wxid 的实例
--json JSON 格式输出,适合脚本集成

输出示例

默认模式(人类可读)

   PID  wxid                             keys  状态
--------------------------------------------------------------
 85121  wxid_0368623686311                 24  ✅ keys 已就绪 (24 个密钥)
--------------------------------------------------------------
共 1 个实例, 1 已就绪, 0 待导出

缺失 keys

   PID  wxid                             keys  状态
--------------------------------------------------------------
 85121  wxid_0368623686311                  0  ❌ keys 缺失
--------------------------------------------------------------
共 1 个实例, 0 已就绪, 1 待导出

watch 模式

🔄 监控模式启动(间隔 10s
    Ctrl+C 退出

[15:32:01] 🆕 新实例发现: {85121}
[85121] → wxid_0368623686311  开始导出密钥...
[85121] ✅ 导出完成,共 24 个密钥
[15:33:45] 🔻 实例退出: {85121}
^C
👋 监控已停止

JSON 模式

[
  {
    "pid": 85121,
    "wxid": "wxid_0368623686311",
    "wxid_raw": "wxid_0368623686311",
    "has_keys": true,
    "key_count": 24,
    "scanner_bin": ".../bin/find_all_keys_macos"
  }
]

工作流程

1. pgrep -x WeChat        → 获取所有 WeChat PID 列表
2. ps -o state            → 过滤 Stopped(T) 状态进程lsof 会阻塞)
3. lsof -c WeChat + grep  → 零开销获取 PID → wxid 映射
   SIGPIPE trickgrep -m1 让 lsof 0.05s 内退出)
4. ~/.wechat-decrypt-toolkit/keys/{wxid}.keys
                        → 检查 keys 缓存是否存在
5. 若缺失 + --export      → 调用 C 扫描器导出密钥

自动导出示例

# 启动时自动检查并导出(一次性)
python3 sync_instances.py --export

# 输出:
# [85121] → wxid_0368623686311  开始导出密钥...
# [85121] ✅ 导出完成,共 24 个密钥

退出码

退出码 含义
0 正常执行(无论是否有实例)
1 指定 --wxid 但未找到对应运行实例

常见问题

Q: lsof 超时/卡住

A: 检查是否有 WeChat 进程处于 TStopped/Traced状态

ps aux | grep WeChat | grep -v grep | awk '{print $2, $8}'

若发现 T 状态,先恢复:

kill -CONT <PID>

get_wechat_pids() 会自动过滤 T 状态进程。

Q: 所有实例都显示 ?(未登录?

A: lsof 在 grep -m1 时可能找到错误的 wxid其他进程的路径。检查实际路径

lsof -c WeChat 2>/dev/null | grep 'wxid_'

Q: 想只刷新某个 wxid 的 keys

python3 sync_instances.py --wxid wxid_0368623686311 --export --force

Python API

from sync_instances import (
    discover_instances,
    export_instance,
    export_all_missing,
    WeChatInstance,
)

# 发现所有实例
instances = discover_instances()
for inst in instances:
    print(f"PID={inst.pid}, wxid={inst.wxid}, has_keys={inst.has_keys}")

# 导出指定实例
inst = instances[0]
export_instance(inst, force=False)

# 导出所有缺失的
results = export_all_missing(force=False)
print(results)
# {'exported': [...], 'skipped': [...], 'failed': [...]}