吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 14979|回复: 121
收起左侧

[原创] 某聊天工具消息记录数据库文件解密逆向分析

    [复制链接]
ZJevon 发表于 2021-3-9 12:57
本帖最后由 ZJevon 于 2022-12-29 12:44 编辑

0x00 简介

每一个聊天工具账号登入后会在“ \Document\Tencent Files\账号” 的目录下Msg3.0.db 文件里写入加密后的聊天记录信息。
image-20210308211235793

查看QQ的Bin目录下的Dll文件可以知道QQ用的是sqlite的数据库,sqlite默认是没有实现加密的函数只是提供了接口,网络上有一些开源的加密库比如wxsqlite3,sqlcipher等。

0x01 前期准备

先再IDA中分析sqlite.dll,查找含有version字符串的函数然后交叉引用,找到上一个函数就可以发现当前QQ使用的sqlite的版本号,可以从网上Down下来源码方便进一步分析,下载链接在文末。

image-20210308211747510

image-20210308211759694

sqlite的加解密简易流程

image-20210309094748967

0x02 获取加密所需的函数

在sqlite.dll里对这些函数下断点动态调试发现没有断下来,结合网络上前辈的分析,IDA中打开KernelUtil.Dll函数名字都很类似,猜测这个Dll就是tx自己对sqlite的具体实现。

image-20210308215913751

我们可以先在CMultiSQLite3DB::innerOpen等open函数下断点,并打开火绒剑对文件操作进行监控。具体下断点的方法就是附加聊天工具进程然后在模块里找到KernelUtil.Dll,在IDA找到要下断点的函数的偏移,[KernelUtil.Dll + 偏移]就是要下断点的位置。

image-20210308220930031

然后观察堆栈传递的参数结合火绒剑和x96dbg单步步过,就可以找到是哪个函数真正打开db文件。

image-20210308221236907

image-20210308221339573

结合sqlite源码和IDA分析可以还原参数和函数名。

image-20210308221501155

在innerOpen这个函数中我们可以看到CppSQLite3DB::execDML这个函数,我们可以大胆猜测它是封装了sqlite3_exec,结合源码进行重命名。sqlite3_exec的第三参数和第四个参数是回调函数,主要的作用是接收sql语句执行的结果,这个在后续编写Demo有用到,具体用法在文末的链接可以参考。

image-20210309103313016

sqlite3_key的具体实现函数我们可以在IDA中观察CppSQLite3DB::key这个函数并结合sqlite3的源码可以推测真实设置key的函数,不妨在此处下断点,后续抓取Key时有大作用。

image-20210309101320776

image-20210309112638238

至此我们获得了后续抓取解密Key所需要的几个函数地址,在x96dbg的对应偏移位置下上断点。

0x03 抓取解密Key

key是云端生成的理论上没有账号的密码是打不开这个聊天记录文件的,并且在每次重启聊天工具进程后的密钥都是不一样的,所以这里得注意抓到密码后关闭进程后得备份Msg3.0.db这个文件,文件于key是一一对应的。

我们先让它正常登入然后在火绒剑观察它是什么时候对Msg3.0.db进行操作的。可以发现是在比较前面就打开了Msg3.0.db所以大胆猜测是在其进程在刚启动的时候执行解密操作。接下来附加QQ进程开始调试。

image-20210309110939236

在附加它进程的时候得注意,选择上面那个进程,下面那个是登入进程在登入成功后会自动销毁了。

image-20210309105352740

在CreateFileW下断点观察火绒剑和x96dbg堆栈直到发现它打开了Msg3.0.db这个文件

image-20210309111748114

一直F9直到调用sqlite3_open函数的参数有Msg3.0.db(期间可能有多个地方调用了open,真实的是先调用open后调用key,多次尝试可以试到真实获取解密Key的地方),根据上文可知sqlite会先打开对应db文件并在后面在设Key,根据IDA分析结果可以知道原视Key是16位的,扩展之后变成16 * 17位了。

image-20210309112339132

image-20210309114248259

image-20210309114359748

有了扩展Key可以直接调用sqlite3_key_impl这个实现函数,也可以使用原始16位Key直接调用sqlite3_key。备份好Msg3.0.db和Key开始编写demo。

0x04 总结

总的来说主要是要找到sqlite解密的各个函数的偏移地址和解密Key,有个小坑就是Key是动态的而且和Msg3.0.db一一对应的,每次抓到Key得记得备份Msg3.0.db。所以我们可以直接调用tx的KernelUtil.Dll,在Load KernelUtil.Dll的时候要注意放在QQ\Bin 目录下不然会导入失败,因为KernelUtil.Dll还有导入其他的Dll。

image-20210309123844021

image-20210309124340998

0x05 参考链接

sqlite v3.8.8.1下载链接:https://www.sqlite.org/2015/sqlite-amalgamation-3080801.zip

sqlcipher v3.3.1下载链接:https://codeload.github.com/sqlcipher/sqlcipher/zip/v3.3.1

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

sqlite_exec回调函数的使用

本文仅供学习参考,切勿用于违法违规行为

免费评分

参与人数 51威望 +1 吾爱币 +72 热心值 +47 收起 理由
noyhlee + 1 + 1 谢谢@Thanks!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
sifeng + 1 + 1 我很赞同!
亚里士缺大德 + 1 用心讨论,共获提升!
canty胖胖 + 1 + 1 用心讨论,共获提升!
iym + 1 + 1 谢谢@Thanks!
LTLT.wuaipojie + 1 + 1 斯国一,斯巴拉西
如果让他嘎斯 + 1 + 1 用心讨论,共获提升!
BY丶显示 + 2 + 1 谢谢@Thanks!
fuy56go + 1 我很赞同!
po1718 + 2 + 1 谢谢@Thanks!
Anowhere + 1 谢谢@Thanks!
屠刀 + 1 谢谢@Thanks!
晓风☆残月 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wongJzzz + 1 + 1 用心讨论,共获提升!
kosaku + 1 + 1 用心讨论,共获提升!
yzyd110 + 1 + 1 谢谢@Thanks!
youyisi2a + 1 + 1 用心讨论,共获提升!
xifanu + 1 + 1 谢谢@Thanks!
wei_mo + 1 + 1 我很赞同!
抱歉、 + 1 用心讨论,共获提升!
XuHonPhin + 1 + 1 用心讨论,共获提升!
li6893 + 1 谢谢@Thanks!
blindcat + 1 鼓励转贴优秀软件安全工具和文档!
Digimon + 1 热心回复!
再见babay + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
gunxsword + 1 + 1 谢谢@Thanks!
Dom-Lewis + 1 + 1 用心讨论,共获提升!
zxywan + 2 + 1 用心讨论,共获提升!
5omggx + 1 + 1 用心讨论,共获提升!
Lruc + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
zhuceyonghu + 1 我很赞同!
蓝色马蹄莲 + 2 + 1 老早就看Msgx.0.db不爽了,一直见有人破,今天看见天牛了。
schedule + 1 用心讨论,共获提升!
笙若 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
qaz003 + 1 + 1 不错,好久没看到QQ方面了
yan182 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
空若野 + 1 + 1 谢谢@Thanks!
浮尔豪斯 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
guangyunjian + 1 + 1 和微信的类似,有没有加密规则
JuncoJet + 3 + 1 非常的有意思
初亦泽 + 3 + 1 我很赞同!
Kristin_ + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
daivy2009 + 1 + 1 谢谢@Thanks!
Flymeee + 1 + 1 我很赞同!
glau29 + 1 + 1 用心讨论,共获提升!
banhave + 1 + 1 用心讨论,共获提升!
心中的沉默 + 1 + 1 没文化的我只能说两个字,牛皮
lvyiwuhen + 1 + 1 热心回复!
沉默的菜鸟 + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
punnpkin + 1 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

JuncoJet 发表于 2021-3-9 17:07
Image 734.jpg
Image 736.jpg

发现TIM的Key地址是固定的,流弊了!就是个写死的全局变量啊
而且不同QQ号,也是一样的
15555559119 发表于 2021-3-10 07:15
这是大哥,真专业。要是能做个小程序,给小白,小白直接调取这个文件 然后读取本地消息那就更加牛逼了。
 楼主| ZJevon 发表于 2021-3-11 13:52
jack940213 发表于 2021-3-11 13:13
如果我使用旧密码备份了聊天记录文件,然后退出QQ,在更改密码后重新登录是否也能读取这个聊天记录文件呢

这个Key以及Msg3.0.db是一一对应的和修不修改密码是没有关系的,每次重新登陆远程都会下发一个新的Key老的Key对应新Msg3.0.db自然就没用了。
Fxhlt 发表于 2021-3-9 13:03
厉害了  哥   
lvyiwuhen 发表于 2021-3-9 13:07
牛,我曾经也想过研究,奈何水平有限,没想到你替我实现了
壹分叁拾秒 发表于 2021-3-9 13:18
大神就是大神,牛!!
apie 发表于 2021-3-9 13:23
每次key都是动态的,那么是不是意味着Msg3.0.db文件都会在登陆之后有变化?那其他文件呢?如果本地聊天记录有好几g,每次登陆也都会变吗?
glau29 发表于 2021-3-9 13:25
这研究精神,佩服佩服
 楼主| ZJevon 发表于 2021-3-9 13:39
apie 发表于 2021-3-9 13:23
每次key都是动态的,那么是不是意味着Msg3.0.db文件都会在登陆之后有变化?那其他文件呢?如果本地聊天记录 ...

其他文件可以登入QQ-下线后看修改时间来判断是否被修改了,Msg3.0.db我试的几次都是会变化的,我感觉他应该是追加了本次登录到下线期间的修改内容。
断桥隔爱 发表于 2021-3-9 13:45
这个真的是大牛级别
lin326326 发表于 2021-3-9 13:58
POC呢
Flymeee 发表于 2021-3-9 14:09
这个就叫专业。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-23 16:03

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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