SecurityRonin/whatsapp-desktop-forensic
GitHub: SecurityRonin/whatsapp-desktop-forensic
用于解析 WhatsApp 桌面客户端 IndexedDB 存储的 Rust 取证库,可恢复聊天记录、联系人和已删除消息,且对加密消息体如实报告而不伪造明文。
Stars: 0 | Forks: 0
# whatsapp-desktop-forensic
[](https://crates.io/crates/whatsapp-desktop-core)
[](https://crates.io/crates/whatsapp-desktop-forensic)
[](https://docs.rs/whatsapp-desktop-core)
[](https://www.rust-lang.org)
[](LICENSE)
[](https://github.com/sponsors/h4x0r)
[](https://github.com/SecurityRonin/whatsapp-desktop-forensic/actions/workflows/ci.yml)
[](https://github.com/rust-secure-code/safety-dance/)
[](fuzz/)
[](deny.toml)
**读取 WhatsApp Desktop (Electron) 在 Chromium IndexedDB 存储中的聊天记录 —
包括带有类型的消息、聊天、联系人、媒体和时间线 — 并展示加密的消息体,
绝不伪造。**
WhatsApp 的 Electron/PWA 桌面客户端将其聊天数据保存在 Chromium 的基于 LevelDB 的 IndexedDB 数据库(`model-storage`)中,其值是 Blink/V8 的 structured-clone blob。这个 crate 将该存储解析为带类型的取证记录,并对其进行审计。
## 核心摘要
```
use whatsapp_desktop_forensic::audit_path;
// Point at the app's `…model-storage` IndexedDB LevelDB directory.
let findings = audit_path("Default/IndexedDB/…indexeddb.leveldb".as_ref())?;
for f in &findings {
println!("[{:?}] {} — {}", f.severity, f.code, f.note);
}
// [Some(Medium)] WA-MSG-DELETED-RECOVERED — Deleted message … recovered from a tombstone …
// [Some(Info)] WA-MSG-ENCRYPTED-BODY — Message … has an AES-CBC-encrypted body …
# Ok::<(), whatsapp_desktop_forensic::WaError>(())
```
只需要记录,不需要分析结果?使用 reader:
```
use whatsapp_desktop_core::open;
let store = open("…indexeddb.leveldb".as_ref())?;
println!("{} messages, {} chats, {} contacts", store.messages.len(), store.chats.len(), store.contacts.len());
for e in &store.timeline {
println!("{} {} {}", e.rfc3339, if e.deleted { "[deleted]" } else { "" }, e.message_id);
}
# Ok::<(), whatsapp_desktop_core::WaError>(())
```
## 两个 crate
| Crate | 角色 |
|---|---|
| `whatsapp-desktop-core` | **Reader** — 带类型的 `Message`/`Chat`/`Contact`/`MediaMeta` + 时间线,以及经过审计的 AES-CBC 消息体解密原语。不产生分析结果。 |
| `whatsapp-desktop-forensic` | **Analyzer** — 通过 `impl Observation` 生成标准化的 `forensicnomicon::report::Finding`。 |
它建立在fleet的 Chromium 存储 reader(`chromium-storage-indexeddb`
→ `blob-decoder`)之上,并复用了 forensicnomicon 的 IndexedDB key-coding;它绝不会
重新实现 LevelDB 或 V8 解码。
## 它所展示的内容
| 代码 | 严重程度 | 含义 |
|---|---|---|
| `WA-MSG-DELETED-RECOVERED` | 中 | 从 LevelDB 墓碑记录中恢复的已删除消息(符合 `T1070`)。 |
| `WA-MSG-ENCRYPTED-BODY` | 信息 | 消息体经过 AES-CBC 加密(`msgRowOpaqueData`);明文需要派生密钥。 |
| `WA-MSG-MEDIA-REF` | 信息 | 引用非本地存储(CDN)blob 的媒体消息。 |
## 消息体是加密的 —— 且绝不伪造
WhatsApp Web 使用 AES-CBC 将文本消息体加密到 `msgRowOpaqueData:{_keyId, iv,
_data}` 中。此 crate 原封不动地将该加密信封报告为
`MessageBody::Encrypted{ key_id, iv, ciphertext }`。`decrypt_body`(经过审计的
RustCrypto AES-CBC)**仅当您提供派生密钥时**才会对其解密;错误或缺失的密钥会返回带类型的 `Wa Error`,它绝不会凭空捏造明文。派生密钥本身超出了本文档的范围 —— 请参阅 [`docs/validation.md`](docs/validation.md)。
## 信任,但要验证
- **模糊测试** — 本地对 `cargo-fuzz` 的 `parse_store`(64.6万次执行)和 `decrypt_body`(177万次执行)进行了测试,零崩溃;每周在 CI 中运行。
- **通过 lint 确保不发生 panic** — `#![forbid(unsafe_code)]`,生产代码中拒绝使用 `unwrap_used`/`expect_used`;对已解码的 V8 图进行全量访问器检查。
- **根据真实的 Chromium 输出进行验证** — 在真实的铸造 `model-storage` 存储上进行提取(tier-2),基于独立的 openssl KAT 向量进行 AES-CBC 解密(tier-1),针对 Python `datetime` 进行的 epoch 到 RFC 3339 的转换(tier-1)。
完整的证据及诚实的边界(目前还没有真实的消息语料库)详见
[`docs/validation.md`](docs/validation.md)。
[隐私政策](https://securityronin.github.io/whatsapp-desktop-forensic/privacy/) · [服务条款](https://securityronin.github.io/whatsapp-desktop-forensic/terms/) · © 2026 Security Ronin Ltd
标签:HTTP工具, IndexedDB, LevelDB, Rust, WhatsApp, 可视化界面, 数字取证, 数据解析, 网络流量审计, 自动化脚本, 通知系统