Skip to content

小米未root_个人步骤_5GB的db大文件无法完整导出为未加密数据库_指定行导致的内存溢出_小米未升级hyperos #57

Description

@kuyunjian

我的步骤

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









    Image








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










Image
Image








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









Image









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









    Image









    *** 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

  2. 三个文件均可通过sqlcipher正常导出为.sql文件,1GB的这个db文件可以导出2GB的sql文件,但是只有100MB的sql文件可以正常导入回db文件。其它两个大内存sql文件导入回db文件为空表

  3. 我看到这个项目里面有写文件损坏的相关信息,和我要清除密码出错时的提示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,开始用指令的方式尝试,

  1. # cd [清除1024字节的nt_msg_clean.db存在的目录](在msys2里,目录以 / 分隔而不是 \ )
  2. # sqlcipher
  3. sqlite> .open nt_msg.db
  4. sqlite> .database(验证已经打开了该数据库)
  5. sqlite> PRAGMA key = '#8xxxxxxxxxxx@uJ'; PRAGMA kdf_iter = '4000';(key填对应数据库的key,返回值为ok)
  6. 导出为无加密的数据库
    1. 开始报错,显示没有解密,sqlcipher 里有一个 sha1 和 sh512解密,我不知道在这里用什么指令实现,用gpt给出的会报错,并且之前100MB的那个db数据库也解密不成功









      Image










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>

  1. 我直接尝试用sqlite> .output nt_msg.sql导出即使ok但是实际上没有解密的db为sql文件,但是在windows sqlcipher里解密后能导出2GB的文件时,这里导出的仅为一个0kb的文件
  2. 前面说到我把 Windows sqlcipher 里面导出的2 GB 文件导入回 sqlcipher 时,表为空
    1. 于是我尝试把windows sqlcipher里面解密后的2Gb的sql数据库尝试用MSYS2 MINGW64导出为db文件,指令同上文:$ cat nt_msg.sql | sed -e 's|^ROLLBACK;\( -- due to errors\)*$|COMMIT;|g' | sqlite3 nt_msg.db
      1. 显示Parse error near line 65: object name reserved for internal use: sqlite_stat4和out of memory









        Image








  3. 但是我对windows sqlcipher里面解密后的另一个qq的100MB的sql数据库进行$ cat nt_msg.sql | sed -e 's|^ROLLBACK;\( -- due to errors\)*$|COMMIT;|g' | sqlite3 nt_msg.db,成功导出db文件
  4. 我用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,又要重新下载一次

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions