某聊天工具消息记录数据库文件解密逆向分析
0x00 簡介
?
每一個聊天工具賬號登入后會在"\Document\Tencent Files\賬號"的目錄下Msg3.0.db文件里寫入加密后的聊天記錄信息。
查看該工具的Bin目錄下的DLL文件可以知道它用的是sqlite的數(shù)據(jù)庫,sqlite默認是沒有實現(xiàn)加密的函數(shù)只是提供了接口,網(wǎng)絡(luò)上有一些開源的加密庫,比如wxsqlite3,sqlcipher等。
0x01 前期準備
?
?
?
先再IDA中分析sqlite.dll,查找含有version字符串的函數(shù)然后交叉引用,找到上一個函數(shù)就可以發(fā)現(xiàn)當前程序使用的sqlite的版本號,可以從網(wǎng)上Down下來源碼方便進一步分析,下載鏈接在文末。
sqlite的加解密簡易流程:
0x02 獲取加密所需的函數(shù)
?
?
?
在sqlite.dll里對這些函數(shù)下斷點動態(tài)調(diào)試發(fā)現(xiàn)沒有斷下來,結(jié)合網(wǎng)絡(luò)上前輩的分析,IDA中打開KernelUtil.Dll函數(shù)名字都很類似,猜測這個Dll就是tx自己對sqlite的具體實現(xiàn)。
我們可以先在CMultiSQLite3DB::innerOpen等open函數(shù)下斷點,并打開火絨劍對文件操作進行監(jiān)控。具體下斷點的方法就是附加進程然后在模塊里找到KernelUtil.DLL,在IDA找到要下斷點的函數(shù)的偏移,[KernelUtil.DLL + 偏移]就是要下斷點的位置。
然后觀察堆棧傳遞的參數(shù)結(jié)合火絨劍和x96dbg單步步過,就可以找到是哪個函數(shù)真正打開db文件。
結(jié)合sqlite源碼和IDA分析可以還原參數(shù)和函數(shù)名。
在innerOpen這個函數(shù)中我們可以看到CppSQLite3DB::execDML這個函數(shù),我們可以大膽猜測它是封裝了sqlite3_exec,結(jié)合源碼進行重命名。sqlite3_exec的第三參數(shù)和第四個參數(shù)是回調(diào)函數(shù),主要的作用是接收sql語句執(zhí)行的結(jié)果,這個在后續(xù)編寫Demo有用到,具體用法在文末的鏈接可以參考。
sqlite3_key的具體實現(xiàn)函數(shù)我們可以在IDA中觀察CppSQLite3DB::key這個函數(shù)并結(jié)合sqlite3的源碼可以推測真實設(shè)置key的函數(shù),不妨在此處下斷點,后續(xù)抓取key時有大作用。
至此我們獲得了后續(xù)抓取解密Key所需要的幾個函數(shù)地址,在x96dbg的對應(yīng)偏移位置下上斷點。
0x03 抓取解密Key
?
?
?
key是云端生成的理論上沒有賬號的密碼是打不開這個聊天記錄文件的,并且在每次打開程序后的密鑰都是不一樣的,所以這里得注意抓到密碼后關(guān)閉程序得備份Msg3.0.db這個文件,文件于key是一一對應(yīng)的。
我們先讓它正常登入然后在火絨劍觀察它是什么時候?qū)sg3.0.db進行操作的。可以發(fā)現(xiàn)是在比較前面就打開了Msg3.0.db所以大膽猜測是在進程在剛啟動的時候執(zhí)行解密操作。接下來附加進程開始調(diào)試。
?
?
在附加進程的時候得注意,選擇上面那個進程,下面那個是登入進程在登入成功后會自動銷毀了。
在CreateFileW下斷點觀察火絨劍和x96dbg堆棧知道發(fā)現(xiàn)它打開了Msg3.0.db這個文件。
一直F9直到調(diào)用sqlite3_open函數(shù)的參數(shù)有Msg3.0.db(期間可能有多個地方調(diào)用了open,真實的是先調(diào)用open后調(diào)用key,多次嘗試可以試到真實獲取解密Key的地方),根據(jù)上文可知sqlite會先打開對應(yīng)db文件并在后面在設(shè)Key,根據(jù)IDA分析結(jié)果可以知道原始key是16位的,擴展之后變成16*17位了。
有了擴展key可以直接調(diào)用sqlite3_key_impl這個實現(xiàn)函數(shù),也可以使用原始16位key直接調(diào)用sqlite3_key.備份好Msg3.0.db和Key開始編寫demo。
0x04 總結(jié)
?
總的來說主要是要找到sqlite解密的各個函數(shù)的偏移地址和解密key,有個小坑就是key是動態(tài)的而且和Msg3.0.db一一對應(yīng)的,每次抓到key的記得備份Msg3.0.db。
所以我們可以直接調(diào)用tx的KernelUtil.Dll,在Load KernelUtil.Dll的時候要注意放在\Bin 目錄下不然會導入失敗,因為KernelUtil.Dll還有導入其他的Dll。
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數(shù)據(jù)庫(適用于Msg3.0.db等):https://www.52pojie.cn/thread-1370802-1-1.html
?
sqlite_exec回調(diào)函數(shù)的使用:https://blog.csdn.net/zscfa/article/details/77119522
總結(jié)
以上是生活随笔為你收集整理的某聊天工具消息记录数据库文件解密逆向分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记录某一天安服仔的漏洞挖掘过程
- 下一篇: 渗透测试中dns log的使用