以下环境配置任选一种即可。注意,每种方法都要求您拥有手机的 root 权限。
首先,安装 Termux,换源并执行pkg up
、termux-setup-storage
然后依次执行以下命令:
安装基础依赖:
pkg in python wget tsu root-repo
pkg in frida frida-python
关闭 SELinux:
su -c setenforce 0
接着,手动下载主版本相同的frida-server
,解压到/data/local/tmp
下,并重命名为friendly
(不一定要完全一致,仅是建议文件名不包含frida
以略微避免检测);
赋予friendly
可执行权限后,新开一个终端以root
权限运行friendly
下载 hook 脚本:
wget https://github.com/Young-Lord/qq-win-db-key/raw/master/android_get_key.py
你也可以在电脑端使用adb
等来避免在手机端配置Termux
。具体过程略。
这几条并不需要按顺序执行,建议直接执行“导出数据库”
打开 QQ 并完成登录,进入主界面。将 QQ 切换到后台后继续下一步。
在一个没有获得 root 权限的 Termux 终端 / 电脑的终端 中运行:
python android_get_key.py
也可手动指定版本号,但目前所有支持的版本号使用的脚本均相同。
python android_get_key.py 8.9.58
此时应当输出Frida script injected.
,若没有,请检查:
- 是否以
root
权限运行frida-server
- 是否以关闭 SELinux (即设置为宽容模式)
- 是否已经关闭
Magisk Hide
与Shamiko
,并且重启手机 frida-server
与 Termux 中的frida
版本号第一个点号前的数字是否相同- QQ 版本是否一致
接下来,可以确认命令行是否给出数据库密钥。
请参考 基础教程 - NTQQ 解密数据库。
该部分内容来源于Android QQ NT 版数据库解密,由@yllhwa贡献。
关闭Magisk Hide
与Shamiko
,并且重启手机
可能需要关闭SELinux
(也就是设为Permissive
)
需要授予手机QQ读写存储权限
下载https://github.com/Young-Lord/qq-win-db-key/raw/master/android_dump.js
如果先前已经运行过,则先删除上一次运行生成的/sdcard/Download/plaintext.db
终端中运行frida -U -f com.tencent.mobileqq -l android_dump.js
(如果用的有线连接adb就直接写-U
,如果是Termux或无线连接就把-U
改成-R
)
如果一切顺利,已解密的plaintext.db
将会在至少10秒后导出至/sdcard/Download/plaintext.db
。
根据字符串依次找到 sqlite3CodecQueryParameters,xref 找到 attachFunc,另外一个 xref 就是 openDatabase
"ATTACH DATABASE '%s' as migrate;" 之类的找到 sqlcipher_codec_ctx_migrate,然后找到 sqlite3_exec,执行:ATTACH DATABASE 'plaintext.db' AS plaintext KEY '';SELECT sqlcipher_export('plaintext');DETACH DATABASE plaintext;
…然后你就能被附加数据库数量限制拦了。
VACUUM?不行
别的什么方法也失败了(详见代码