QQNT Windows 客户端版本 9.9.18-32869 可用
使用工具:
反编译工具:IDA Pro 8.3 绿色版
加密数据库读取工具:DB Browser for SQLCipher
获取聊天信息数据库密码
- 使用 IDA Pro 新建项目,导入
{QQNT安装路径}\versions\{版本号}\resources\app\wrapper.node
文件,导入选项默认,如果有弹出 symbol 文件相关提示框点击 "No",等待文件加载完成。 - 按快捷键
Shift+F12
` 打开Strings
标签,等待页面加载完成。切换到Strings
标签使用鼠标单击内部区域,按快捷键Ctrl+F
打开搜索框,输入nt_sqlite3_key_v2
。
- 双击
nt_sqlite3_key_v2: db=%p zDb=%s
一行,跳转到IDA View-A
标签的对应行。 - 点击顶部导航栏
Options
中的General...
菜单项,打开IDA Options
窗口。在Disassembly
标签页中,将Display assembly lines
中的Source line numbers
勾选上,点击 "OK" 按钮。
- 在
IDA View-A
标签中,单击nt_sqlite3_key_v2
的名称aNtSqlite3KeyV2
,按快捷键X
打开交叉引用窗口。
- 双击第一条结果,转到引用位置。
- 按快捷键
F5
进行反编译,如果有弹出窗口点击 "Yes"。等待反编译完成。
- 单击引用语句的左侧蓝色圆点添加断点。
- 修改
Debugger
下拉框的值为Local Windows Debugger
。
- 如果有正在运行的 QQNT 客户端,先全部退出。打开一个新的 QQNT 客户端,进入登录界面并暂停操作。
- 在 IDA 中点击顶部导航栏
Debugger
中的Attach to process...
菜单项,打开Attach to process
窗口。拉到最下方,找到从上往下数第一个QQ.exe
进程,双击打开。
- 等待加载完成后按快捷键 F9 继续运行。登录 QQNT,触发断点。
- 在 IDA 中点击顶部导航栏
Debugger
中的Debugger windows
菜单项,打开Locals
选项卡。
- 右击
Locals
选项卡的a3
,点击Jump to...
菜单项。
- 记录对应地址从 0 到 F 的 16 个字节对应的字符串,即为数据库密码。
导出聊天记录
聊天记录数据库默认在 {文档}\Tencent Files\{QQ号}\nt_qq\nt_db\nt_msg.db
,前 1024 个字节中有 HMAC 加密方式,去掉前 1024 个字节后是加密数据库本体,下称前 1024 个字节为 nt_msg.head.db
,本体为 nt_msg.body.db
。注意复制后操作,不要影响原数据库。
- 打开
DB Browser for SQLCipher.exe
,打开nt_msg.body.db
文件。输入上文获取的数据库密码,将加密设置改为自定义,KDF 迭代改为 4000,HMAC 算法改为nt_msg.head.db
中出现的算法。
group_msg_table
表存有所有群聊聊天记录,40021
列为群号。可直接在文件
下拉菜单中导出表,或执行 SQL 命令过滤出自己想要的群聊后保存为新表(保存为视图)后再导出:SELECT * FROM `group_msg_table` WHERE `40021` = {群号}
参考文献: