dsh-plugin-qqchat:只读提取 QQ NT 本地聊天记录

前言

在 DSH 里做审计、备份或本地知识整理时,往往需要把 IM 的本地库变成 Agent 可读的结构化数据。常见做法是手工拷贝数据库、自行研究加密格式,或依赖闭源导出工具,边界不清晰且容易误写原库。DeepSeek Harness 的插件机制允许把「识别环境 → 解密 → 解析媒体 → 摘录」收成一组可调工具;下面介绍维护者 jcy0chenyuan0 发布的 dsh-plugin-qqchat(分类 admin-security,v1.0.0),它面向 Windows + QQ NT,在拷贝快照上只读处理本地聊天数据。

这是什么

dsh-plugin-qqchat 是挂在 DSH GUI 里使用的 只读 QQ 本地聊天记录获取插件:解密 NT 容器、导出与摘录、会话隔离(部分能力仍在规划中)。仓库:GitHub - jcy0chenyuan0/dsh-plugin-qqchat;目录页:SkillHub 插件页。

插件自述的红线如下,与「能发消息、能 hook QQ」类工具不同:

  • 不发消息、不注入 QQ 进程、不 hook、不改 QQ 安装包、不碰网络协议、不调用云端模型。
  • 所有读取都在 拷贝出来的快照 上进行,原库零写入。

运行环境以 README 为准:Windows 10/11(x64)、QQ NT 本地库与媒体路径、PowerShell 5.1+ 解密链路;macOS / Linux 未适配。安装 QQ 后仍需手动登录,插件只读已登录账号的本地库。

核心功能与当前进度

README 用阶段表说明实现状态;下面只列与使用者相关的已核实能力。

已完成(README 标记 ✅)

能力 说明
骨架 + 环境体检 qq_doctor:QQ 版本/进程、账号目录、库形态、容器格式、密钥状态、媒体目录与下一步提示
容器解密 剥 1024 字节头 + 非标准 SQLCipher 解密;qq_decrypt 拷贝 → 剥头 → 解密 → SQLite 头部自校验 → sqlite3 实开验证
密钥获取 qq_find_key:缺密钥时才从运行中的 QQ 进程 只读 扫描内存取每库 raw key,按 salt 配对;默认不回显明文
消息与媒体 40800 protobuf 解析;qq_media 定位图片/视频/表情/语音/文件在本机磁盘上的路径

真机战绩(README 记载,QQ NT 9.9.35.52892,账号 3960766092):约 7 秒扫完进程内存,18/18 个非空库密钥配对;nt_msg.db 8290 页约 3 秒解密,33 张表,群消息 33,233 条 + 私聊 165 条;媒体扫描定位 308 个元素到本机文件。

进行中(⏳)

  • P4:归一化库、会话隔离、增量摘录(qq_sync / qq_conversations / qq_messages)
  • P5b:导出 jsonl/csv/md + 脱敏(qq_export)
  • P6:mock 后端;P7:打包与端到端验收

技术要点(便于理解工具行为)

QQ NT 本地库在文件开头带 1024 字节明文容器头,其后为页大小 4096 的 SQLCipher 加密区。README 说明:本机实测 每库一把 32 字节 raw key,enc_key 直接使用该 key,不走 调研文档里提到的「16 字节 ASCII 口令 + PBKDF2」那条路径。解密器会对每个库用 SQLite 头部自校验探测 crypto reserve(例如多数库 48,个别库 80),校验不过则拒绝采信。

消息体字段与媒体落盘规则(如 Pic\<月>\Ori\<md5>.<ext> 等)在 README 中有表格与路径模板,供 qq_media 按 MD5 索引查找,不套用安卓 Cache 命名。

工具清单

在 DSH 中通过插件暴露的 qq_* 工具(JS 桥接 + Python 引擎,stdout 仅输出一个 JSON 对象):

工具 作用
qq_doctor 环境体检与下一步指引
qq_find_key 先检查是否已有密钥,缺失时只读内存扫描并配对
qq_decrypt 快照解密并 sqlite3 验证
qq_media 解析消息内媒体并定位本机文件(无文件则如实返回)

依赖策略:零额外 npm/crypto 库——JS 仅用 Node 内置模块;Python 仅用标准库;对称解密走 PowerShell 5.1 的 .NET(AES 等)。

安装与启用

先做仓库侧准备,再在 DSH 里挂载 bundle。安装命令以 README 原文为准,不要 凭插件名拼接 dsh plugin add github:...。

1. 生成 patch 与依赖(首次)

在插件目录执行(Windows):

powershell -ExecutionPolicy Bypass -File .\install.ps1

仅检查环境、不自动安装时:

powershell -ExecutionPolicy Bypass -File .\install.ps1 -CheckOnly

macOS/Linux 上可用 node install.mjs 生成 cordis.patch.yml(但该插件运行仍依赖 Windows QQ 环境)。脚本会按当前目录生成 cordis.patch.yml(已 .gitignore),不写死盘符。

install.ps1 默认静默安装缺失环境(Python 优先 DSH 自带运行时,否则 winget install Python.Python.3.12 --scope user;QQ NT 可用 winget install --id Tencent.QQ.NT -e)。插件加载时还会在后台运行 bootstrap.ps1 -AutoInstall -Quiet(6 小时内不重复)。关闭自动安装:patch 的 config 里设 autoInstall: false,或环境变量 DSH_BOOTSTRAP=0。

2. 安装到 DSH

任选其一:

  1. GUI:「设置 → 插件 → 安装 → 本地路径」填本目录绝对路径(例如 %USERPROFILE%\.dsh\plugins\qqchat)。
  2. CLI:
plugin_manager install_bundle  file:<本目录的绝对路径>

装完后在 GUI「插件」页整体启用/停用。改 JS 代码需 重启 DSH(ESM 按 URL 缓存);仅改 cordis.patch.yml 时需重新 install_bundle。

换机器时 README 建议:clone 仓库 → 运行 install.ps1 或 install.mjs → install_bundle → 运行 qq_doctor 并按提示配置 config.json(可参考 config.example.json)。产物目录 data/ 与 config.json 不入库。

典型用法

经过上面的安装步骤后,建议按 README 顺序自检:

  1. 在 DSH 中调用 qq_doctor,确认 QQ 进程、账号目录、21 个库形态与密钥状态。
  2. 若 doctor 提示缺密钥,在 QQ 已登录前提下调用 qq_find_key(只读内存,不注入)。
  3. 调用 qq_decrypt 对快照解密;依赖 SQLite 头自校验,失败则不应继续采信该库。
  4. 需要媒体路径时调用 qq_media,在已解密消息上解析 40800 并映射到本机 Pic / Video / Ptt 等目录。

会话归一化、增量同步与 jsonl/csv/md 导出在路线图中尚未标记完成,使用前以仓库 README「当前进度」表为准。

适用场景与注意

适合:在 本机 Windows 上、对已登录 QQ NT 账号做 合规范围内的只读备份/分析;希望把解密与媒体定位封装成 DSH 工具、供 Agent 在明确边界下调用的开发者。

务必注意:

  • 插件以 当前 DSH 进程权限 运行;qq_find_key 会读取 QQ 进程内存,属于高敏感操作。安装前应阅读源码与 MIT 许可证,仅在信任维护者与用途的前提下启用。
  • 只读指 不改 QQ 原库、不发消息;解密后的快照与 data/ 摘录仍可能含隐私,导出与脱敏能力(qq_export)尚未完成,需自行管控产物。
  • 页面 HMAC 的 mac_key 派生 README 标注为未完全弄清;当前以 sqlite3 可读性与头字段一致性作为解密判据。
  • SkillHub 等为社区目录,与 DeepSeek / 幻方无官方从属关系;星标与版本以仓库为准(当前 README 为 v1.0.0)。

结尾

dsh-plugin-qqchat 把 QQ NT 本地库的容器格式、内存密钥配对、解密校验和媒体路径查找收成 DSH 侧一组只读工具,适合需要在 Harness 里本地化处理聊天数据、又希望边界清晰的场景。完整细节与实测数据见仓库 README。

  • 目录页:https://www.skillhub.cn/plugins/jcy0chenyuan0/dsh-plugin-qqchat
  • GitHub:https://github.com/jcy0chenyuan0/dsh-plugin-qqchat
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜