關于微信數據庫的解密以及取證
前言
之前研究過一段時間的wx聊天記錄解密,以及小程序解密,但是在晚上陸續搜了幾篇文章后發現解密教程要么下載Visual Studio,不然就是對web安全人員不友好的od調試,而且根據系統的不同,解密方法也不同,于是作者用為數不多的編程知識寫出了這篇教程- -在這里記錄一下解密的原理以及一些方法分享給大家。
1.原理
SQLite 是一個輕量級的、開源的關系型數據庫,是目前移動平臺(如 iOS、Android)數據庫的最佳選擇。然而免費版的 SQLite 是不支持加密的(官網下的默認就是免費版的) ,這就導致了存儲在 SQLite 中的數據很容易被人查看到,不法分子可能會利用數據庫表結構及內容字段分析我們的應用,進而發起攻擊。出于安全的考慮,我們當然要對數據庫文件進行加密。
微信數據庫的類型是sqlite,不管是ios還是mac還是win或者安卓,區別在于每個數據庫都加密了但是加密的密鑰不同,這里win和mac主要采用從遠程服務器獲取一些信息加上本地的某些信息通過一系列算法生成的密鑰通過AES加密的,AES的密鑰是32位,而且所有數據庫文件共用一個密鑰,我們需要找到那個AES密鑰才能進行解密,然后才能對數據庫文件進行操作。但是安卓和ios不同,通過翻閱一些文章發現,手機端的數據庫生成的密鑰是通過本地已有數據進行生成的密鑰,僅有7位,我們可以通過暴力破解的方式獲取密鑰。
解密PC數據庫 一般都是通過od附加微信進行動態調試 https://bbs.pediy.com/thread-251303.htm還有一種辦法就是通過尋找微信模塊的地址然后加上偏移量就能獲取密鑰以及一些用戶信息,但是這也有個問題就是當每次微信版本更新時偏移量也會隨之改變,我看到解決方法是作者需要每個版本獲取偏移量,然后更新工具這樣也很麻煩。
于是根據別人的文章分析了一下,如果說每次偏移量都會變但是相關信息的數據結構的相對便宜量不會變,這種方式可以全版本通用,通俗一點來講就是,每次私鑰和wxid的字符串地址雖然會變但是相對位置不變,我可以通過wxid的字符串加減多少一定能找到私鑰的地址。
2.分析
這里我首先通過往常一樣的動調發現,在密鑰出現的上下地址中存在另一種公鑰和私鑰的字符串-----BEGIN PUBLIC KEY-----\n...這不就是一個很好的特征嗎于是我們首先通過python中的pymem模塊來操作內存,至于為什么要用這個模塊的,因為他對初學者比較友好里面封裝了很多函數,很方便調用適合我這種對win系統不了解的人,按照這個思路我們先找到-----BEGIN PUBLIC KEY-----字符串的地址,再去反向搜索這個地址的地址,根據測試這個地址一般是大于WeChatWin.dll 但也不是絕對有些情況會導致搜不到這個字符串地址。
但是這里出現了一個問題,我在學習pymem的過程中通過翻閱文檔發現有一個全局搜索函數pattern_scan_all,但是通過實際下載pymem模塊時候卻沒有了這個函數,于是我這里只好自己把這個函數再重新寫一遍。```def pattern_scan_all(handle, pattern, *, return_multiple=False):
brew install sqlcipher
這里我們寫好了相關解密腳本結果mac數據庫和win數據庫采用的加密方式不同,于是我又去了解了一下。
傳入密鑰
通過Rand_bytes算法生成16個字節的salt,并存儲在數據庫第一頁的頭部(SQLite3的db文件,頭部前16個字節固定為SQLite 3 format,所以可以利用文件頭來存儲一些數據)。
通過PKCS5_PBKDF2_HMAC_SHA1算法將密鑰和salt一起加密并多次迭代,生成AES加密所用的key;此處是對key的加密,即使原始的密碼泄露,也無法解密數據。
通過AES對稱加密算法對每一頁的文件內容(有效的內容,不包含文件頭和reserved字段)進行加密。
加密時,文件執行過AES加密后,對文件內容,通過Hmac算法,獲取文件校驗碼,填充在page尾部(SQLite3提供了reserved字段,自動在page尾部預留一段空間)。
解密時,先調用Hmac算法獲取文件標識碼,與page尾部的數據進行對比,如果數據一致,則證明文件沒有被篡改過,不然證明文件已經被篡改,則拋出異常。
PS:以上為默認的算法,sqlCipher沒有固定算法,用戶可以自己設置。
經測試windows系統的wx數據庫就是用上述加密方式,首先會通過讀取文件頭生成16個字節的salt,再使用PBKDF2_HMAC_SHA1算法設置迭代次數為64000次生成的密鑰這樣的話解密就很簡單了
這里也遇到了坑 key可以有兩種表現方式,一種是單純字符串口令,另一種就是原始密鑰,我們從內存中獲取的是原始密鑰所以要輸入的是PRAGMA key = "x'密鑰'"我們回到mac密鑰的獲取,因為mac的權限管理做的很死,我們首先需要關閉SIP(系統完整性保護)
系統完整性保護(SIP)是 OS X El Capitan 及更高版本所采用的一項安全技術,旨在幫助防止潛在惡意軟件修改 Mac 上受保護的文件和文件夾,但這也造成了安裝某些特殊版本軟件的或者做特殊修改的時候權限不足。在這里就體現在使用 LLDB 調試時候,所有的調試語句都會被系統拒絕,因此在正式進行調試之前,一個重要的準備工作就是檢查系統完整性保護(SIP)的開啟狀態,如果開啟的話,要把它關閉。
檢查 SIP 的開啟狀態
在終端里輸入 csrutil status 回車,如果看到:
這說明的 SIP 已經開啟,如果要繼續調試的話,需要關閉。如果是 System Integrity Protection status: disabled. 則說明 SIP 已經處于關閉狀態,可以直接進行調試。
- 重啟,并在開機的時候長按 Command 和 R
- 進入系統恢復狀態
- 點擊屏幕頂部工具欄上的 實用工具,選擇終端
- 在終端中輸入 csrutil disable 回車,會出現下述字符串,再次重啟生效
然后我們就可以開始調試微信了
1. 打開電腦端微信(不要登陸)
2. 在Terminal輸入命令lldb -p $(pgrep WeChat)
3. 輸入br set -n sqlite3_key,回車
4. 輸入c,回車
5. 手機掃碼登陸電腦端微信
6. 這時候電腦端微信是會卡在登陸界面的,不需要擔心,回到Terminal
7. 輸入memory read --size 1 --format x --count 32 $rsi,回車就可以獲取到了密鑰
這里我們可以直接PRAGMA cipher_compatibility = 3就可以設置好解密參數了 ,這是一個標準
解密效果如下
3.一些其它功能
微信在2022.06月之后更改了傳輸文件存儲位置,和每個人聊天所傳輸的文件會被放在不同的文件夾下,大大提升了我們尋找歷史文件的難度,于是我寫了個整合文件名輸出的功能
還有就是壓縮功能可以分別壓縮數據庫,圖片,歷史傳輸文件
4.碎碎念
原先想繼續完善安卓和ios的解密腳本來著,但是作者馬上要開始準備秋招了沒時間寫,等過段時間再更新下,寫這篇文章的目的是想讓大家接觸下電子取證這個方向的知識,不僅僅是微信還有一些社交軟件都可以嘗試去分析下,例如soul,陌陌,qq等。不限于app甚至是阿里云鏡像取證,這個方向也有很多知識值得學習。