12558网页游戏私服论坛

 找回密码
 立即注册
游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
攻城掠地-仿官 全新玩法,觉醒武将,觉醒技能 每周新区 经典复古版本,长久稳定 进入游戏
巅峰新版攻 攻城掠地公益服 攻城掠地SF 新兵种、新武将(兵种) 进入游戏
攻城掠地公 散人玩家的天堂 新开 进入游戏
改版攻城掠 上线即可国战PK 稳定新区 全新改版,功能强大 进入游戏
少年江山 高福利高爆率 刚开一秒 江湖水落潜蛟龙 进入游戏
太古封魔录 开服送10亿钻石 福利多多 不用充钱也可升级 进入游戏
神魔之道 签到送元宝 稳定开新区 送豪华签到奖励 进入游戏
神奇三国 统帅三军,招揽名将 免费玩新区 激情国战,征战四方 进入游戏
龙符 三日豪礼领到爽 天天开新区 助你征战无双 进入游戏
王者之师 免费领豪华奖励 免费玩新区 6元送6888元宝 进入游戏
三国霸业 战车-珍宝-觉醒-攻城掠地SF-全新玩法 免费玩新区 攻城掠地私服 进入游戏
手游私服盒子 各类免费游戏 0.1折送海量资源 各类手游私服 进入游戏
皇家MU2 《奇迹 2:传奇》韩国网禅公司《奇迹》正统续作。 3D锁视角Mmrpg 暗黑3+传奇+流放之路+奇迹 进入游戏
查看: 463|回复: 0

撬开PC QQ的本地SQLite数据库(适用于Msg3.0.db等)

[复制链接]
发表于 2021-2-19 20:33:43 | 显示全部楼层 |阅读模式
*注意 本文于2月14日(1050z)发布于52pojie.cn;不允许转载。如果发现,追究侵权责任
检测到违规转载:https://www .y4f .net/375349.html 请立即删除


客岁年底我发了一篇撬开MacQQ的本地SQLite数据库(适用于Msg3.0.db+)。有部分读者在下面询问相同的方法能不能在PC(Windows上使用)——答案当然是不行的。本日正好需要解开一个Windows下的QQ数据库文件,所以研究了一下,写了这篇文章。

在文章开始前,先做一下Q&A:
1. 打开本地QQ SQLite数据库的意义是什么?
重要是方便备份谈天记录,以及在极端环境下,如果QQ被封,只要先前备份过数据的key,那谈天记录依然可以提取,减少信息丢失带来的损失。
2. 这个方法会不会被不法分子使用窃取隐私?是不是可以用来偷取别人的谈天记录?
该DB文件密码由线上下发而来(详细原理是读取db的SQLite Header,然后发送sso_cryptsvr.0x12c包,从服务器上得到)。发包要求使用密码进行开端认证(wtlogin),因此没有该QQ号的密码,是不可能打开数据库文件的。(这里不考虑对于QQ程序的攻击引发的数据库密码泄露)

-------ZCZC 正文开始----------
本次分析过程使用的是新版的PC版QQ,谈天记录文件存放于Msg3.0.db。用hex工具打开文件一看,就发现有SQLIte3的头。说明和MacQQ一样,也是SQLite3。加密环境暂时不明,料想应该是一样的(最终证明简直是一样的。)

既然是sqlite3,那么总体思绪不变,找到调用key的函数。首先看的是sqlite.dll,里面有sqlite3_open都没有发现sqlite3_key为名的函数。接下来继续探求……
发如今KernelUtil.dll里,找到了一些和SQLite3有关的函数,此中的CppSQLite3DB::key似乎就是我们要找的函数。



x32dbg下了一个断点,发现没有掷中。于是disassem一下,看看这个函数里面在干嘛。



此中sub_5D2477A0这个函数长得还挺可疑的。其他的函数看起来都人畜无害。跟进去看看:




发现了关键数字“16”,MacQQ上的Msg3.0.db的keysize就是16。所以怀疑这个函数肯定和设置key有关系,暂名为sqlite3_key_。
查看交叉引用,发现了在CppSQLite3DB::open里也被使用了,于是也在这里下个断点。



(趁便还把其他有“key”的地方都打上了断点)




一次性掷中,啪得一下,很快啊。x86,参数栈传。可以注意到call这个函数的时间,参数范例sqlite3_key的定义很像。
FYI,定义是 int sqlite3_key(sqlite3 *db, const void *pKey, int nKey);



那么第二个参数就是数据库密码,第三个参数指示长度为16位。key大部分为可见字符。
尝试使用上一篇文章提到的方式,对该数据库进行解密。



发现大成功,说明加密算法和Mac版QQ的加密算法一致。





兴冲冲地用工具打开解密后的db,发现并打不开。
难道解密失败?
继续使用hex工具。可以看到,内容已经全部是明文了。不过前面有400字节的extheader,这就是导致SQLite工具打不开文件的原因。



手动删除400字节的头,Msg3.0.db 打开成功。



数据库可以打开了,但是谈天记录以及谈天记录metadata是编码状态,需要解码后才能使用。

这里简单地讲一下解码方式。相干函数的解码函数在KernelUtil.dll内。

Content字段:前8个字节是头部(MSG),之后分别是4字节的时间戳、4字节的随机数、4字节的颜色码(只有低24位有用)、1字节字号、1字节结果、1字节CharSet、一字节FontFamily。
从第24个字节开始,是字体信息。内部是[T]LV,前两位指示字体名称长度,小端序。之后紧跟着字体名称,大端序。
接下来跳过2个字节。进入多段[T]LV,每一段TLV中,第一字节指示负载范例,0x01是文本消息、0x03是图片消息等等;之后的两个字节指示负载长度,小端序。然后是大端序的负载内容。

Info字段(应该是JCE的Map?):跳过前6位(TD开始)。TLV范例来回摆动,第一次遇到的是0x06开头的[T]LV,后面紧跟着2字节的负载长度,再之后是负载内容。负载内容是key。下面一个TLV以4字节的负载长度开头,之后是负载内容,内容是上面key对应的value。再之后的一个[T]LV又是0x06开头……以此类推

---NNNN--

PS. PC版的QQ是有QQProtect这种地痞功能的,QQProtect以内核态驱动情势载入,还窜改了SSDT。所以直接调试被QQProtect保护的QQ主程序非常困难。这里面有一些小trick,不属于本文讨论的内容。有爱好的可以自己研究。
PS2. 在打开PC QQ登录的时间,会出现多个历程。大抵是启动历程、登录UI历程和服务历程(负责实际工作)。启动历程在唤起UI历程之后会立即被烧毁。登录完成后,登录UI历程也会被烧毁,断点必须打在服务历程上。

来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
楼主热帖
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图

GMT+8, 2024-11-24 22:21 , Processed in 0.078125 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表