首页
论坛
课程
招聘
[调试逆向] [原创]某聊天工具消息记录数据库文件解密逆向分析
2021-3-9 12:55 5265

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

2021-3-9 12:55
5265

0x00 简介

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

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

0x01 前期准备

先再IDA中分析sqlite.dll,查找含有version字符串的函数然后交叉引用,找到上一个函数就可以发现当前程序使用的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所以大胆猜测是在进程在刚启动的时候执行解密操作。接下来附加进程开始调试。

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的时候要注意放在\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回调函数的使用


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



第五届安全开发者峰会(SDC 2021)议题征集正式开启!

最后于 2021-3-13 09:35 被Jev0n编辑 ,原因:
收藏
点赞4
打赏
分享
最新回复 (21)
雪    币: 185
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
星雪鸢尾 活跃值 2021-3-9 13:07
2
0
好耶
雪    币: 582
活跃值: 活跃值 (137)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
闲人_ 活跃值 2021-3-9 16:00
3
0
好耶
雪    币: 3973
活跃值: 活跃值 (1218)
能力值: ( LV15,RANK:625 )
在线值:
发帖
回帖
粉丝
无名侠 活跃值 10 2021-3-9 16:12
4
0
qq的sqlite3加密用的貌似是xxtea
雪    币: 103
活跃值: 活跃值 (163)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xtayaitak 活跃值 2021-3-9 19:01
5
0
学习了
雪    币: 1692
活跃值: 活跃值 (296)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
木志本柯 活跃值 2021-3-10 19:45
6
1
深x服是不是就是这样查看qq聊天记录的
雪    币: 547
活跃值: 活跃值 (273)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
guangzisam 活跃值 2021-3-11 14:53
7
0
很实用
雪    币: 10
活跃值: 活跃值 (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
齐德龙 活跃值 2021-3-11 15:31
8
0
16字节扩展到16 * 17字节,最后运算的时候又恢复到原始的16字节,没明白这么整了有啥用
雪    币: 1933
活跃值: 活跃值 (966)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
Jev0n 活跃值 2021-3-11 15:34
9
0
齐德龙 16字节扩展到16 * 17字节,最后运算的时候又恢复到原始的16字节,没明白这么整了有啥用[em_21]
应该是原先是16字节的密钥,然后进行密钥扩展,感觉密钥扩展这个操作在密码学挺常见的
雪    币: 952
活跃值: 活跃值 (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zylrocket 活跃值 2021-3-12 15:18
10
0
企鹅快点报警抓人吧
雪    币: 216
活跃值: 活跃值 (394)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
gtict 活跃值 2021-3-15 17:36
11
0
问下回调函数的里面消息还需要解密么
雪    币: 3957
活跃值: 活跃值 (3165)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
三一米田 活跃值 2 2021-3-24 18:27
12
0
大佬你好~我想问下关于sqlite3库的使用是怎么用的啊?
我是直接编译【sqlite-amalgamation-3080801】文件夹里面的.C文件,生成lib文件,然后链接lib文件,包sqlite3.h文件,但是结果不如意...没有lib文件里面没有sqlite3_key等一些其他这个函数
雪    币: 1933
活跃值: 活跃值 (966)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
Jev0n 活跃值 2021-3-24 21:27
13
0
三一米田 大佬你好~我想问下关于sqlite3库的使用是怎么用的啊? 我是直接编译【sqlite-amalgamation-3080801】文件夹里面的.C文件,生成lib文件,然后链接lib文件,包sqli ...
因为在原生的sqlite库是没有实现加密(sqlite3_key)这个函数,可以参考其他开源的封装库(比如wxsqlite3),里面有实现
雪    币: 307
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
同志们好啊 活跃值 2021-3-24 21:30
14
0
问题是,聊天内容没多少价值,怎么办?
雪    币: 307
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
同志们好啊 活跃值 2021-3-24 21:30
15
0
其实,只要你挂着账号,到时候一导出,还不是所有数据都有了.
雪    币: 3957
活跃值: 活跃值 (3165)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
三一米田 活跃值 2 2021-3-25 09:55
16
0
Jev0n 因为在原生的sqlite库是没有实现加密(sqlite3_key)这个函数,可以参考其他开源的封装库(比如wxsqlite3),里面有实现
明白了,所以调用tx自己实现的KernelUtil.dll,这里面就有实现sqlite3_key这些个函数,直接调用就可以了,是这个意思吗~
雪    币: 1933
活跃值: 活跃值 (966)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
Jev0n 活跃值 2021-3-25 10:28
17
0
三一米田 明白了,所以调用tx自己实现的KernelUtil.dll,这里面就有实现sqlite3_key这些个函数,直接调用就可以了,是这个意思吗~
对的
雪    币: 3957
活跃值: 活跃值 (3165)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
三一米田 活跃值 2 2021-3-26 08:58
18
0
数据库解密成功之后,里面的数据是编码状态的,这个可咋整啊?大佬有啥思路吗
雪    币: 1933
活跃值: 活跃值 (966)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
Jev0n 活跃值 2021-3-26 10:36
19
0
三一米田 数据库解密成功之后,里面的数据是编码状态的,这个可咋整啊?大佬有啥思路吗
后续没有在研究了,可以看一下参考链接里另一位师傅更深入的研究
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_lmlbjpmx 活跃值 2021-4-3 15:56
20
0
我是电子物证专业人员,受害人报案后我想从受害人手机QQ中迁移与诈骗人员的聊天记录到电脑QQ中,然后将该条迁移备份解密作为证据使用(当然这些各大取证公司已经实现),不知大侠能否提供帮助,微信我已解决,但是QQ不能通过INLINEHOOK方法实现获取密码并解密,我QQ号908132028,希望得到你的帮助。
雪    币: 1933
活跃值: 活跃值 (966)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
Jev0n 活跃值 2021-4-4 09:00
21
0
mb_lmlbjpmx 我是电子物证专业人员,受害人报案后我想从受害人手机QQ中迁移与诈骗人员的聊天记录到电脑QQ中,然后将该条迁移备份解密作为证据使用(当然这些各大取证公司已经实现),不知大侠能否提供帮助,微信我已解决,但 ...
QQ登入后本身就有备份的功能,如果还能登入可以使用官方工具
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_lmlbjpmx 活跃值 6天前
22
0
大侠,你好,用官方工具备份出来,这个备份只有恢复到受害人本人手机中才能阅读,我需要的是将这个备份解密掉作为证据使用,也就是说需要在备份过程中获取解密密钥,然后在PC上用密钥解密已备份出来的数据,不知道有没有研究。
游客
登录 | 注册 方可回帖
返回