更新
已将研究成果整合至文档: QQDecrypt:QQ 聊天数据库解密。
前言
不管是出于希望将聊天记录保存到本地,还是需要导出和将聊天记录用于语言模型训练等用途,都需要导出 QQ 聊天记录这一步。
近期发现 QQNT 也存在导出聊天记录的方法,遂进行尝试和记录,感谢各位前辈的探索和作出的贡献。
环境及准备工作
我的环境是 Windows10,QQNT 9.9.11-24568,Python 3.10.6。
需要任意一款反编译软件,以及用于查看数据库的 DB Browser for SQLite(安装包来自网络,可从参考文献第一条中获取链接)。
操作的所有文件建议在操作前进行备份。
逆向获取数据库密码
由于本人不会逆向,是按照参考文献第一条中的记录进行操作,故在此不重复记录。
需要注意的是附加到的进程是从上往下的第一个,与参考博客中的描述并不一致,也许不同设备会有不同。
如果进程选择正确,在附加后需要一定时间加载,且过程中有弹出窗口,并在 F9 继续运行之前无法使用 QQ,并在登录后触发断点。如果进程选择错误则以上会有不同,关掉 QQ 重新附加即可。
从数据库中导出数据
依旧按照参考文献第一条中的记录进行操作,不重复记录。
其中 nt_msg.header.txt
使用文本编辑器打开后可以在文件开头看到 SQLite header 3
以及 QQ_NT DB
、HMAC_SHA1
等字样。亲测使用笔记本打开会显示乱码,而使用 VS Code 打开没有问题。
在 DB Browser for SQLite 中,打开菜单->工具->设置加密,不输入密码直接点击 OK 以解除数据库加密。
以私聊数据表 c2c_msg_table
为例,这里介绍一部分关键数据。
列名 | 类型 | 含义 | 说明 |
---|---|---|---|
40050 | int | 发送时间 | 单位为秒的时间戳 |
40058 | int | 发送时间 | 单位为秒的时间戳,精确到天 |
40030 | int | 私聊对象 | 对方 QQ 号(无论是对方还是自己发送的消息) |
40033 | int | 消息发送者 | 发送者的 QQ 号 |
40093 | str | 消息发送者 | QQ 昵称或是备注名 |
40800 | protobuf | 消息内容 | 格式较为复杂,可使用 CyberChef 工具进行解析 |
关于 40800 的解析,由于较复杂所以不展开。
至此,已可以使用 sql 命令或编写程序导出数据。
附录
参考文献
版权信息
本文原载于 reincarnatey.net,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。