我的步骤
- 我的nt_msg.db数据库是从手机qq导出的用小米手机的备份功能导出tar.gz(包含 apk 本体和数据文件)
不知道是不是有一些数据存在本地的其他文件夹,设置里看是56GB的qq内存占用,备份出来只有23GB 左右(在 mt 管理器以及其他的文件管理器里面),即使在备份软件里显示56GB 已备份,(值得一提的是,电脑上有一个小米助手,通过电脑端的小米助手备份出来的文件是30GB多。不过该方式备份出来的文件被分成了100多个小文件,不知道怎么操作)
- 通过查百度,用Hex删除头文件,变成可以正确解压的 tar.gz 文件
- 在里面搜索
nt_msg.db,可以查到我所有3个 QQ 的 db 文件,一个5GB,一个1GB,一个100MB(大约)
- 正确获取 key
- 通过nt_qq_android文档的方法,下载 sqlite,配置sqlite环境,下载SQLiteStudio(这步应该不必要),下载DB Browser (SQLCipher)
- 删除400大小也就是1024字节或者说1KB 的
nt_msg.db 头文件
- 通过windows可视化的SQLCipher打开数据库

- 然后就开始遇到问题:
- 3个
nt_msg.db 数据库都不能直接另存为数据库


- 仅大约那个100MB
nt_msg.db可以通过 sqlcipher 删除密码并保存
- 其它两个均会报错
database disk image is malformed

-
对100MB的文件进行PRAGMA integrity_check;时,返回值为ok,在我对报错的两个数据库进行PRAGMA integrity_check;时,返回值都为错误如下

*** in database main ***
Tree 317868 page 317868: unable to get the page. error code=7
Tree 317886 page 317886: unable to get the page. error code=1
...
Tree 45 page 45: unable to get the page. error code=1
Tree 44 page 44: unable to get the page. error code=1
Tree 9 page 9: unable to get the page. error code=1
Tree 13 page 13: unable to get the page. error code=1
-
三个文件均可通过sqlcipher正常导出为.sql文件,1GB的这个db文件可以导出2GB的sql文件,但是只有100MB的sql文件可以正常导入回db文件。其它两个大内存sql文件导入回db文件为空表
-
我看到这个项目里面有写文件损坏的相关信息,和我要清除密码出错时的提示database disk image is malformed一致
最后的结果是 out of memory也就是超内存了
具体的过程是:
尝试的这个项目的方法:Mythologyli/qq-nt-db: QQ NT Windows 数据库解密+图片/文件清理,虽然是 Windows的nt_qq,但是后续的步骤都一样
于是我下载安装打开了MSYS2 MINGW64,安装了mingw-w64-x86_64-sqlcipher和sqlite3,开始用指令的方式尝试,
# cd [清除1024字节的nt_msg_clean.db存在的目录](在msys2里,目录以 / 分隔而不是 \ )
# sqlcipher
- sqlite> .open nt_msg.db
- sqlite> .database(验证已经打开了该数据库)
- sqlite> PRAGMA key = '#8xxxxxxxxxxx@uJ'; PRAGMA kdf_iter = '4000';(key填对应数据库的key,返回值为ok)
- 导出为无加密的数据库
- 开始报错,显示没有解密,sqlcipher 里有一个 sha1 和 sh512解密,我不知道在这里用什么指令实现,用gpt给出的会报错,并且之前100MB的那个db数据库也解密不成功

sqlite> ATTACH DATABASE 'nt_msg.db' AS plaintext KEY ''; SELECT sqlcipher_export('plaintext'); DETACH DATABASE plaintext;
2025-03-21 21:51:48.886: ERROR CORE sqlcipher_page_cipher: hmac check failed for pgno=1
2025-03-21 21:51:48.889: ERROR CORE sqlite3Codec: error decrypting page 1 data: 1
2025-03-21 21:51:48.891: ERROR CORE sqlcipher_codec_ctx_set_error 1
Parse error: file is not a database (26)
sqlite>
- 我直接尝试用
sqlite> .output nt_msg.sql导出即使ok但是实际上没有解密的db为sql文件,但是在windows sqlcipher里解密后能导出2GB的文件时,这里导出的仅为一个0kb的文件
- 前面说到我把 Windows sqlcipher 里面导出的2 GB 文件导入回 sqlcipher 时,表为空
- 于是我尝试把windows sqlcipher里面解密后的2Gb的sql数据库尝试用MSYS2 MINGW64导出为db文件,指令同上文:
$ cat nt_msg.sql | sed -e 's|^ROLLBACK;\( -- due to errors\)*$|COMMIT;|g' | sqlite3 nt_msg.db
- 显示
Parse error near line 65: object name reserved for internal use: sqlite_stat4和out of memory

- 但是我对windows sqlcipher里面解密后的另一个qq的100MB的sql数据库进行
$ cat nt_msg.sql | sed -e 's|^ROLLBACK;\( -- due to errors\)*$|COMMIT;|g' | sqlite3 nt_msg.db,成功导出db文件
- 我用
PRAGMA cache_size = -50000; 把缓存从-2000扩大到-50000还是在59964行内存溢出的
2. 我用gpt修正指令为cat nt_msg.sql | sed -e 's|^ROLLBACK;\( -- due to errors\)*$|COMMIT;|g' -e '/sqlite_stat4/d' | sqlite3 nt_msg.db
1. 返回值依然为 out of memory 此时在59962行内存溢出
我在 Windows 里配置了 sqlite3 的环境变量,也重启了,cmd里面输入sqlite3 --version有版本号反馈,不知道为什么,在 msys2里面提示command not found,又要重新下载一次
我的步骤
不知道是不是有一些数据存在本地的其他文件夹,设置里看是56GB的qq内存占用,备份出来只有23GB 左右(在 mt 管理器以及其他的文件管理器里面),即使在备份软件里显示56GB 已备份,(值得一提的是,电脑上有一个小米助手,通过电脑端的小米助手备份出来的文件是30GB多。不过该方式备份出来的文件被分成了100多个小文件,不知道怎么操作)nt_msg.db,可以查到我所有3个 QQ 的 db 文件,一个5GB,一个1GB,一个100MB(大约)nt_msg.db头文件nt_msg.db数据库都不能直接另存为数据库nt_msg.db可以通过 sqlcipher 删除密码并保存database disk image is malformed对100MB的文件进行

PRAGMA integrity_check;时,返回值为ok,在我对报错的两个数据库进行PRAGMA integrity_check;时,返回值都为错误如下*** in database main ***
Tree 317868 page 317868: unable to get the page. error code=7
Tree 317886 page 317886: unable to get the page. error code=1
...
Tree 45 page 45: unable to get the page. error code=1
Tree 44 page 44: unable to get the page. error code=1
Tree 9 page 9: unable to get the page. error code=1
Tree 13 page 13: unable to get the page. error code=1
三个文件均可通过sqlcipher正常导出为.sql文件,1GB的这个db文件可以导出2GB的sql文件,但是只有100MB的sql文件可以正常导入回db文件。其它两个大内存sql文件导入回db文件为空表
我看到这个项目里面有写文件损坏的相关信息,和我要清除密码出错时的提示
database disk image is malformed一致最后的结果是 out of memory也就是超内存了
具体的过程是:
尝试的这个项目的方法:Mythologyli/qq-nt-db: QQ NT Windows 数据库解密+图片/文件清理,虽然是 Windows的nt_qq,但是后续的步骤都一样
于是我下载安装打开了MSYS2 MINGW64,安装了mingw-w64-x86_64-sqlcipher和sqlite3,开始用指令的方式尝试,
# cd [清除1024字节的nt_msg_clean.db存在的目录](在msys2里,目录以 / 分隔而不是 \ )# sqlciphersqlite> ATTACH DATABASE 'nt_msg.db' AS plaintext KEY ''; SELECT sqlcipher_export('plaintext'); DETACH DATABASE plaintext;
2025-03-21 21:51:48.886: ERROR CORE sqlcipher_page_cipher: hmac check failed for pgno=1
2025-03-21 21:51:48.889: ERROR CORE sqlite3Codec: error decrypting page 1 data: 1
2025-03-21 21:51:48.891: ERROR CORE sqlcipher_codec_ctx_set_error 1
Parse error: file is not a database (26)
sqlite>
sqlite> .output nt_msg.sql导出即使ok但是实际上没有解密的db为sql文件,但是在windows sqlcipher里解密后能导出2GB的文件时,这里导出的仅为一个0kb的文件$ cat nt_msg.sql | sed -e 's|^ROLLBACK;\( -- due to errors\)*$|COMMIT;|g' | sqlite3 nt_msg.dbParse error near line 65: object name reserved for internal use: sqlite_stat4和out of memory$ cat nt_msg.sql | sed -e 's|^ROLLBACK;\( -- due to errors\)*$|COMMIT;|g' | sqlite3 nt_msg.db,成功导出db文件PRAGMA cache_size = -50000;把缓存从-2000扩大到-50000还是在59964行内存溢出的2. 我用gpt修正指令为
cat nt_msg.sql | sed -e 's|^ROLLBACK;\( -- due to errors\)*$|COMMIT;|g' -e '/sqlite_stat4/d' | sqlite3 nt_msg.db1. 返回值依然为 out of memory 此时在59962行内存溢出
我在 Windows 里配置了 sqlite3 的环境变量,也重启了,cmd里面输入sqlite3 --version有版本号反馈,不知道为什么,在 msys2里面提示command not found,又要重新下载一次