数据库密钥自动提取
扫描微信进程内存里的 56 字节 codec 上下文,解析 salt / keyspec。针对 4.1.13 起被 32 字节 pad 循环 XOR 混淆的 keyspec,用上下文里的明文盐 现场反推 pad 还原真实密钥;每个密钥都过数据库首页 HMAC 校验,零误报。
针对 微信 Windows 4.1.13.x 的聊天记录导出工具 —— 自动提取数据库密钥 → 解密 SQLCipher 数据库 → 导出会话(含图片、头像、排行榜)。全程本机处理,只读取微信数据,不联网。
自绘标题栏、圆角卡片、柔和阴影与悬浮动效;窗口拖动与缩放交给系统 (startSystemMove / startSystemResize)。启动时按 Qt Quick(QML) → PyQt5 Widgets → tkinter 顺序自动选择可用界面。
0 30px 80px rgba(0,0,0,.6),顺带把外框换成渐变描边↑ 这是界面示意图(基于真实 GUI 结构绘制),点击左侧会话可以切换消息预览。
整条链路都在本机完成:内存扫描取密钥 → 逐页解密数据库 → 解析消息与媒体 → 导出为多种格式。
扫描微信进程内存里的 56 字节 codec 上下文,解析 salt / keyspec。针对 4.1.13 起被 32 字节 pad 循环 XOR 混淆的 keyspec,用上下文里的明文盐 现场反推 pad 还原真实密钥;每个密钥都过数据库首页 HMAC 校验,零误报。
微信 4.x 的 32 字节 raw key 直接就是 AES-256 密钥(不经过 PBKDF2,PBKDF2 只用于派生 HMAC 密钥)。逐页 AES-256-CBC 解密 + 每页 HMAC-SHA512 校验,首页回写魔数与 reserved 字节。
Img/*.dat 是 V2 容器(magic + aes_size + xor_size + flag)。按 PKCS7 对齐做 AES-128-ECB 解密,尾部单字节 XOR 的键值由 JPEG FFD9 / PNG AE426082 尾部标志反推。
从解密后的 head_image.db 直接读取 image_buffer —— 它本身就是 JPEG/PNG 二进制,本机读取不联网。实测库内 2403 个头像,601 个会话命中 578 个;取不到时回退首字母色块。
按消息总数降序展示会话,含消息数、占比、最后聊天时间。顶部类型筛选 全部 / 群聊 / 个人 / 企业微信 / 公众号,占比按该范围重算,可导出 rank.csv 分文件。
指纹只比 stat(大小 + mtime),不读内容,-wal/-shm 不参与。微信来新消息时只有变化的 message_*.db 重新解密,其余直接复用 —— 热启动实测 0.06s。
默认输出到项目根目录的 dist/,GUI 与 CLI 一致,可用 --out 指定任意目录。
dist/ ├── decrypted/ │ ├── .cache/ # 指纹缓存(可删) │ └── *.db # 解密后的数据库 ├── chat_<会话名>.txt # 纯文本 ├── chat_<会话名>.csv # 表格 ├── chat_<会话名>.html # 微信气泡样式 ├── rank.csv / rank.txt # 聊天热度排行榜 ├── avatars/ # 会话头像 └── media/ # 导出的图片
窗口打开后会自动完成「提取密钥 → 解密数据库 → 加载会话」,状态栏显示「就绪 · N 个会话」后即可预览与导出。
dist/。适合批处理、定时任务或服务器侧的脚本化导出;参数与 GUI 行为一致。
参数说明--list列出所有会话(名称 / 类型 / 消息数)--export <名称...>按备注、昵称或 wxid 导出指定会话,可传多个--export-all导出全部会话--out <目录>指定输出目录,默认项目根 dist/--no-media不导出图片,只出文本--image-key <32hex>手动指定 16 字节图片 AES 密钥--rank [--rank-kind <类型>]导出聊天排行榜,可按群聊/个人/企业微信/公众号筛选--avatars导出会话头像到 dist/avatars/每个密钥都用数据库首页 HMAC 校验,每页解密都过 HMAC-SHA512 —— 解错了会被立刻发现,不会静默出错。
在微信进程内存中扫描 56 字节 codec 上下文前缀,解析出 salt_ptr / keyspec_ptr。keyspec 明文形如 x'<64位hex密钥><32位hex盐>',4.1.13 起被 32 字节 pad 循环 XOR 混淆;但 keyspec 尾部就是盐的 hex,而盐在上下文中是明文,因此可现场反推 pad还原真实密钥。
逐页 AES-256-CBC 解密,每页 HMAC-SHA512 校验:首页 [0:16] 盐 · [16:4016] 密文 · [4016:4032] IV · [4032:4096] HMAC,其它页密文为 [0:4016]。首页还需手动写入魔数 SQLite format 3\0,并把页头第 20 字节 回填为 80(reserved)。
每个会话一张表 Msg_<md5(username)>,可能分布在多个 message_N.db 分片,按 server_id 合并去重。local_type = (子类型<<32) | 基类型:1 文本 / 3 图片 / 34 语音 / 43 视频 / 47 表情 / 49 应用消息 / 10000 系统;类型 49 子类型 57 为引用回复,内容常为 zstd 压缩。
类型判定依据(username)本机实测群聊username 以 @chatroom 结尾120 个 / 494,136 条企业微信含 openim(@openim / @kefu.openim,含微信客服)161 个 / 4,245 条公众号username 以 gh_ 开头0 个联系人其它(wxid_ 等)320 个 / 125,253 条16 字节图片 AES 密钥是全局密钥,但只在微信解码过图片之后才驻留内存。请先在微信里点开任意一张聊天图片查看一下, 再重新运行导出即可;也可以用 --image-key <32hex> 手动指定。
不会。全程本机处理、不联网,只读取本机当前已登录账号的微信数据;工具不发任何网络请求, 导出产物完全留在本地磁盘。
已在 微信 4.1.13.65 / Windows x64 验证:27 个数据库全部解密成功(HMAC 零错误), 601 个会话可枚举,「宝宝菲菲」会话 19603 条消息完整导出。
提取数据库密钥需要扫描微信进程(Weixin.exe)的内存空间,普通权限读不到目标进程的地址空间。
默认是项目根目录下的 dist/,GUI 与 CLI 规则一致,可用 --out 改。 解密后的数据库在 dist/decrypted/。
磁盘缓存位于 dist/decrypted/.cache/:decrypt.json 按源库的 大小 + mtime 指纹判定,sessions.json 按解密库指纹判定。指纹未变就跳过密钥提取与解密, 实测热启动 0.06s(原先约 1–2 分钟)。想强制刷新就删掉 .cache/ 目录。