这是一个 macOS 微信数据库密钥提取工具,从微信进程内存中提取数据库密钥,并返回数据库文件路径。
- 自动检测微信进程 PID
- 从进程内存提取数据库密钥(支持 V3 加密)
- 查找并分类所有数据库文件
- 生成环境变量配置文件(.env)
- 版本适配器架构(易于扩展新版本)
wechat-watch/
├── src/
│ ├── main.rs # 主程序入口
│ ├── version/ # 版本适配模块(核心)
│ │ ├── mod.rs # 版本枚举和定义
│ │ ├── key_extractor.rs # 密钥提取器 Trait
│ │ ├── factory.rs # 工厂模式创建提取器
│ │ ├── v384.rs # 3.8.4 版本实现
│ │ └── v4xx.rs # 4.x 版本实现(待完成)
│ ├── db_key_scanner.rs # 数据库密钥扫描器
│ ├── db_validator.rs # 数据库验证器
│ ├── lldb_reader.rs # lldb 内存读取
│ ├── macos.rs # macOS 平台功能
│ └── memory.rs # 内存操作
├── Cargo.toml # Rust 项目配置
├── wechat.env # 生成的环境变量文件
└── README.md # 本文档
┌─────────────────────────────────────────────┐
│ ExtractorFactory │
│ (根据版本号创建对应的 KeyExtractor) │
└────────────────┬────────────────────────────┘
│
┌────────┴────────┐
│ │
┌───────▼────────┐ ┌──────▼─────────┐
│ V384Extractor │ │ V4xxExtractor │
│ (3.8.4 版本) │ │ (4.x 版本) │
└────────────────┘ └────────────────┘
│ │
└────────┬────────┘
│
┌────────▼────────┐
│ KeyExtractor │
│ Trait │
└─────────────────┘
│
┌────────▼────────┐
│ ExtractResult │
│ - db_key │
│ - data_dir │
│ - db_files │
└─────────────────┘
pub trait KeyExtractor: Send + Sync {
fn name(&self) -> &str;
fn version(&self) -> WechatVersion;
fn extract(&self, pid: u32, data_dir: Option<PathBuf>) -> Result<ExtractResult>;
fn verify_pid(&self, pid: u32) -> Result<bool>;
fn find_data_dir(&self, pid: u32) -> Result<PathBuf>;
fn find_db_files(&self, data_dir: &PathBuf) -> Result<Vec<PathBuf>>;
}- macOS (Darwin 20+)
- ARM64 或 x86_64 架构
- Rust 1.70+
- lldb (系统自带)
- Xcode Command Line Tools
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/envcd /path/to/wechat-watch
# 开发版本
cargo build
# 发布版本(推荐)
cargo build --release可执行文件位于:./target/release/wechat-decrypt
如果 lldb 无法附加到微信进程,需要禁用 SIP:
# 重启进入恢复模式,执行:
csrutil disable
# 重启后验证:
csrutil status# 使用默认版本 3.8.4
./target/release/wechat-decrypt
# 指定版本
./target/release/wechat-decrypt --version 3.9.x
# 查看帮助
./target/release/wechat-decrypt --help| 参数 | 说明 | 默认值 |
|---|---|---|
-v, --version |
微信版本 (3.8.4, 3.9.x, 4.0.x, auto) | 3.8.4 |
-h, --help |
显示帮助信息 | - |
========================================
微信数据库密钥提取工具
========================================
[*] 使用提取器: WeChat 3.8.4 Key Extractor
[*] 目标版本: 3.8.4
[*] 自动检测微信进程...
[+] 找到微信进程 PID: 12887
[+] 找到验证数据库: msg_0.db
[+] 版本: V3
[+] 将扫描全部 2086 个内存区域...
[*] 等待 lldb 附加到进程...
[*] lldb 附加完成,开始扫描...
[扫描进度...]
========================================
提取结果
========================================
[+] 数据库密钥:
c4f3153c730749d1905807f2512c2bd0694b2b2c1e0249e09bce778366453438
[+] 数据目录:
/Users/xxx/.../c26d233f1feeefd55aabdb0dc77d5962
[+] 加密版本:
V3
[+] 数据库文件 (共 34 个):
【聊天记录数据库】
/path/to/msg_0.db
/path/to/msg_1.db
...
【其他数据库】
/path/to/wccontact_new2.db
/path/to/session_new.db
...
========================================
[+] 环境变量已保存到: wechat.env
[*] 使用方法: source wechat.env
程序成功运行后会生成 wechat.env 文件:
# 微信数据库配置
# 生成时间: 2026-01-13 14:00:04
WECHAT_DB_KEY=c4f3153c730749d1905807f2512c2bd0694b2b2c1e0249e09bce778366453438
WECHAT_DATA_DIR=/Users/xxx/.../c26d233f1feeefd55aabdb0dc77d5962
WECHAT_CRYPTO_VERSION=V3
# 主要数据库文件
WECHAT_DB_MSG_0_DB=/path/to/msg_0.db
WECHAT_DB_MSG_1_DB=/path/to/msg_1.db
...# 加载环境变量
source wechat.env
# 使用变量
echo $WECHAT_DB_KEY
echo $WECHAT_DATA_DIR| 数据库类型 | 文件名示例 | 用途 |
|---|---|---|
| MSG0.db ~ MSG9.db | msg_0.db, msg_1.db... | 聊天记录数据库(分片存储) |
| MicroMsg.db | WCContactNew2.db | 联系人/群组信息 |
| Session.db | session_new.db | 会话列表 |
| FTS.db | ftsmessage.db | 全文搜索索引 |
- 性能优化:单文件过大时查询变慢
- 并发读写:减少锁竞争
- 归档管理:便于按时间归档历史消息
当微信升级时,添加新版本支持只需 3 步:
// src/version/v410.rs
pub struct V410Extractor;
impl KeyExtractor for V410Extractor {
fn name(&self) -> &str {
"WeChat 4.1.0 Key Extractor"
}
fn version(&self) -> WechatVersion {
WechatVersion::V410
}
fn extract(&self, pid: u32, data_dir: Option<PathBuf>) -> Result<ExtractResult> {
// 实现具体的提取逻辑
}
// ... 其他方法
}// src/version/factory.rs
impl ExtractorFactory {
pub fn create(version: WechatVersion) -> Result<Box<dyn KeyExtractor>> {
match version {
WechatVersion::V384 => Ok(Box::new(V384Extractor::new())),
WechatVersion::V410 => Ok(Box::new(V410Extractor::new())), // 新增
// ...
}
}
}// src/version/mod.rs
pub enum WechatVersion {
V384,
V410, // 新增
Auto,
}1. 获取微信进程 PID
└─> ps 命令查找 WeChat 进程
2. 读取进程内存
└─> lldb 附加到进程
└─> 读取内存区域 (vmmap)
3. 搜索密钥
└─> 扫描内存中的 "rtree_i32" 模式
└─> 偏移 24 字节提取 32 字节密钥
4. 验证密钥
└─> 尝试用密钥打开数据库
└─> 验证成功则返回
5. 查找数据库文件
└─> 遍历数据目录下的 .db 文件
└─> 分类整理
6. 生成环境文件
└─> 保存密钥和路径到 wechat.env
| 版本 | 页大小 | HMAC 算法 | 密钥派生 |
|---|---|---|---|
| V3 | 1024 | SHA-1 (20字节) | 无 |
| V4 | 4096 | SHA-512 (64字节) | PBKDF2-SHA512 |
解决方法:
- 检查 SIP 状态:
csrutil status- 如果显示
System Integrity Protection is enabled,需要禁用:
# 重启进入恢复模式,执行:
csrutil disable
# 重启后生效可能原因:
- 微信未登录
- 微信版本不支持(目前仅支持 3.8.4)
- 内存中密钥位置变化
解决方法:
- 确保微信已登录
- 尝试重启微信后再运行
- 查看支持的版本列表
说明:
- 扫描 2000+ 个内存区域需要 6-7 分钟
- 每个区域约 0.2 秒
- 这是正常速度,请耐心等待
- 本工具仅供个人数据备份使用
- 严禁用于窃取他人隐私数据
- 获取的密钥请妥善保管
- 建议在使用后删除环境变量文件
本项目仅供学习和研究使用。使用本工具需遵守相关法律法规。
文档更新日期: 2026-01-13 项目版本: v0.1.0