本报告旨在详细解析微信 PC 端(Windows)的本地数据存储逻辑、数据库结构及加密机制。所有结论均源自对实际运行机制和数据文件的深度技术分析。
根据文件系统扫描逻辑,核心数据库文件分布如下:
| 数据库类型 | 命名规则 | 典型路径 | 功能描述 |
|---|---|---|---|
| 会话索引 | Session.db |
db_storage/session/ |
存储联系人列表、会话列表及基础元数据。 |
| 消息分库 | message_{N}.db |
db_storage/message/ |
存储实际的聊天消息内容。N 通常为 0-199,实现数据分片存储。 |
| 媒体索引 | media_{N}.db |
db_storage/message/ |
存储语音、视频等附件的索引信息及部分元数据。 |
| 文件映射 | hardlink.db |
db_storage/hardlink/ |
存储加密图片文件(.dat)与实际会话路径的映射关系。 |
聊天记录主要分布在 message_0.db 到 message_199.db 中。系统会根据会话 ID(如 wxid)计算哈希或其他算法,将其路由到特定的分库中。
每个分库中包含多张消息表,表名通常遵循以下规则:
- 格式:
Msg_{MD5} - 说明: 其中
{MD5}是会话 ID(如 ChatID)的 MD5 哈希值。
图片文件存在三种加密版本,由文件头前6字节标识:
| 版本代码 | 文件头特征 (Hex) | 加密算法实现 | 备注 |
|---|---|---|---|
| 0 | (无特定固定头) | decryptDatV3 (纯 XOR) |
利用 JPG/PNG 尾部特征倒推 XOR Key |
| 1 | 07 08 56 31 08 07 |
decryptDatV4 (AES-128-ECB) |
使用内置的静态 AES 密钥 |
| 2 | 07 08 56 32 08 07 |
decryptDatV4 (AES-128-ECB) |
使用运行时获取的用户 AES 密钥 |
V4 解密细节:
- 文件头 15 字节为 Header。
- Header[6-10]: AES数据长度 (
aesSize)。 - Header[10-14]: XOR数据长度 (
xorSize)。 - AES部分: 从第15字节开始,长度为
aesSize(需对齐16字节),使用aes-128-ecb解密并移除 PKCS7 填充。 - XOR部分: 紧接 AES 部分之后,长度为
xorSize,使用 XOR 运算解密。
- 查询: 通过图片的 MD5 在
image_hardlink_info表中查询包含dir1,dir2,file_name的记录。 - 映射:
dir1和dir2仅为整数索引,需关联dir2id表解析为实际的字符串目录名(通常是哈希过的用户名)。 - 还原: 最终还原出类似
msg/attach/{user_hash}/{path_hash}/Img/{filename}的物理路径。
语音数据不与文本消息存储在同一数据库,而是独立存储在 media_{N}.db 中,且采用了复杂的查找策略:
- 存储格式: Silk 编码。
- 表名:
VoiceInfo。 - 字段特征: 数据列为
voice_data,时间列为create_time。 - 精确查找: 优先尝试通过消息的
local_id或svr_id精确匹配。
表情包 CDN 图片链接存储在扩展库的 kNonStoreEmoticonTable 表中,可以通过表情包文件的 MD5 哈希值查询对应的 cdn_url。