日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯網營銷解決方案
關于微信數據庫的解密以及取證

前言

之前研究過一段時間的wx聊天記錄解密,以及小程序解密,但是在晚上陸續(xù)搜了幾篇文章后發(fā)現解密教程要么下載Visual Studio,不然就是對web安全人員不友好的od調試,而且根據系統的不同,解密方法也不同,于是作者用為數不多的編程知識寫出了這篇教程- -在這里記錄一下解密的原理以及一些方法分享給大家。

目前成都創(chuàng)新互聯已為上千多家的企業(yè)提供了網站建設、域名、虛擬空間、成都網站托管、企業(yè)網站設計、大洼網站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協力一起成長,共同發(fā)展。

1.原理

SQLite 是一個輕量級的、開源的關系型數據庫,是目前移動平臺(如 iOS、Android)數據庫的最佳選擇。然而免費版的 SQLite 是不支持加密的(官網下的默認就是免費版的) ,這就導致了存儲在 SQLite 中的數據很容易被人查看到,不法分子可能會利用數據庫表結構及內容字段分析我們的應用,進而發(fā)起攻擊。出于安全的考慮,我們當然要對數據庫文件進行加密。

微信數據庫的類型是sqlite,不管是ios還是mac還是win或者安卓,區(qū)別在于每個數據庫都加密了但是加密的密鑰不同,這里win和mac主要采用從遠程服務器獲取一些信息加上本地的某些信息通過一系列算法生成的密鑰通過AES加密的,AES的密鑰是32位,而且所有數據庫文件共用一個密鑰,我們需要找到那個AES密鑰才能進行解密,然后才能對數據庫文件進行操作。但是安卓和ios不同,通過翻閱一些文章發(fā)現,手機端的數據庫生成的密鑰是通過本地已有數據進行生成的密鑰,僅有7位,我們可以通過暴力破解的方式獲取密鑰。

解密PC數據庫 一般都是通過od附加微信進行動態(tài)調試 https://bbs.pediy.com/thread-251303.htm還有一種辦法就是通過尋找微信模塊的地址然后加上偏移量就能獲取密鑰以及一些用戶信息,但是這也有個問題就是當每次微信版本更新時偏移量也會隨之改變,我看到解決方法是作者需要每個版本獲取偏移量,然后更新工具這樣也很麻煩。

于是根據別人的文章分析了一下,如果說每次偏移量都會變但是相關信息的數據結構的相對便宜量不會變,這種方式可以全版本通用,通俗一點來講就是,每次私鑰和wxid的字符串地址雖然會變但是相對位置不變,我可以通過wxid的字符串加減多少一定能找到私鑰的地址。

2.分析

這里我首先通過往常一樣的動調發(fā)現,在密鑰出現的上下地址中存在另一種公鑰和私鑰的字符串-----BEGIN PUBLIC KEY-----\n...這不就是一個很好的特征嗎于是我們首先通過python中的pymem模塊來操作內存,至于為什么要用這個模塊的,因為他對初學者比較友好里面封裝了很多函數,很方便調用適合我這種對win系統不了解的人,按照這個思路我們先找到-----BEGIN PUBLIC KEY-----字符串的地址,再去反向搜索這個地址的地址,根據測試這個地址一般是大于WeChatWin.dll 但也不是絕對有些情況會導致搜不到這個字符串地址。

但是這里出現了一個問題,我在學習pymem的過程中通過翻閱文檔發(fā)現有一個全局搜索函數pattern_scan_all,但是通過實際下載pymem模塊時候卻沒有了這個函數,于是我這里只好自己把這個函數再重新寫一遍。```def pattern_scan_all(handle, pattern, *, return_multiple=False):

from pymem.pattern import scan_pattern_page
next_region = 0

found = []
user_space_limit = 0x7FFFFFFF0000 if sys.maxsize > 2 ** 32 else 0x7fff0000
while next_region < user_space_limit:
next_region, page_found = scan_pattern_page(
handle,
next_region,
pattern,
return_multiple=return_multiple
)

if not return_multiple and page_found:
return page_found

if page_found:
found += page_found

if not return_multiple:
return None

return found
再根據分析整體數據結構的偏移量就可獲得很多信息了
![img_v2_65fcc1df-bf24-40a9-8eeb-081da6b8608g.jpg](https://storage.tttang.com/media/attachment/2022/07/15/c9c26324-e393-4893-aa6e-663be81a9139.jpg)

# 0x03 解密
上面已經獲取了很多信息,接下來我準備開始解密,但是有一個問題,如果我們通過下載Visual Studio的c++庫編寫解密腳本而且還要自行編譯,本身我也不會c++,而且Visual Studio太過臃腫,我這里在網上搜了好半天,看看有沒有什么python解密sqlite的庫結果發(fā)現[pysqlcipher3](https://pypi.org/project/pysqlcipher3/)可以用來解密,但是在安裝的過程中,發(fā)現安裝失敗,結果去網上論壇搜索還是需要靜態(tài)編譯鏈接,我嘗試了幾次發(fā)現還是要下載Visual Studio,于是這個庫我只好放棄,但是在解密mac的過程中可以使用上述的這個模塊我們只需要在mac系統中安裝相應工具就可以使用該模塊了

brew install sqlcipher

回到windows,我實在找不到結局方案,只好使用比較low的方法,通過subprocess去調用工具,工具還是蠻小的方法可行。
if not db_file:
raise ValueError("db_File is not defined!")

if not secret_key:
raise ValueError("secret_key is not defined!")
salt = open(db_file, 'rb').read(16)
dk = hashlib.pbkdf2_hmac('sha1', secret_key, salt, 64000, dklen=32)
exe_cmd = "%s %s" % (get_exe_file(), db_file)
p2 = Popen(exe_cmd, stdout=PIPE, stdin=PIPE, stderr=PIPE, shell=True)
cmd_sql = '''PRAGMA key = "x'%s'";PRAGMA cipher_page_size=4096; ATTACH DATABASE 'decrypt_%s' AS plaintext KEY ''; SELECT sqlcipher_export('plaintext'); DETACH DATABASE plaintext;''' % (binascii.hexlify(dk).decode(),os.path.basename(db_file))

code, message = p2.communicate(bytes(cmd_sql, encoding='utf-8'))

這里我們寫好了相關解密腳本結果mac數據庫和win數據庫采用的加密方式不同,于是我又去了解了一下。

傳入密鑰

通過Rand_bytes算法生成16個字節(jié)的salt,并存儲在數據庫第一頁的頭部(SQLite3的db文件,頭部前16個字節(jié)固定為SQLite 3 format,所以可以利用文件頭來存儲一些數據)。

通過PKCS5_PBKDF2_HMAC_SHA1算法將密鑰和salt一起加密并多次迭代,生成AES加密所用的key;此處是對key的加密,即使原始的密碼泄露,也無法解密數據。

通過AES對稱加密算法對每一頁的文件內容(有效的內容,不包含文件頭和reserved字段)進行加密。

加密時,文件執(zhí)行過AES加密后,對文件內容,通過Hmac算法,獲取文件校驗碼,填充在page尾部(SQLite3提供了reserved字段,自動在page尾部預留一段空間)。

解密時,先調用Hmac算法獲取文件標識碼,與page尾部的數據進行對比,如果數據一致,則證明文件沒有被篡改過,不然證明文件已經被篡改,則拋出異常。

PS:以上為默認的算法,sqlCipher沒有固定算法,用戶可以自己設置。

經測試windows系統的wx數據庫就是用上述加密方式,首先會通過讀取文件頭生成16個字節(jié)的salt,再使用PBKDF2_HMAC_SHA1算法設置迭代次數為64000次生成的密鑰這樣的話解密就很簡單了

salt = open(db_file, 'rb').read(16)
dk = hashlib.pbkdf2_hmac('sha1', secret_key, salt, 64000, dklen=32)
exe_cmd = "%s %s" % (get_exe_file(), db_file)
p2 = Popen(exe_cmd, stdout=PIPE, stdin=PIPE, stderr=PIPE, shell=True)
cmd_sql = '''PRAGMA key = "x'%s'";PRAGMA cipher_page_size=4096; ATTACH DATABASE 'decrypt_%s' AS plaintext KEY ''; SELECT sqlcipher_export('plaintext'); DETACH DATABASE plaintext;''' % (binascii.hexlify(dk).decode(),os.path.basename(db_file))

這里也遇到了坑 key可以有兩種表現方式,一種是單純字符串口令,另一種就是原始密鑰,我們從內存中獲取的是原始密鑰所以要輸入的是PRAGMA key = "x'密鑰'"我們回到mac密鑰的獲取,因為mac的權限管理做的很死,我們首先需要關閉SIP(系統完整性保護)

系統完整性保護(SIP)是 OS X El Capitan 及更高版本所采用的一項安全技術,旨在幫助防止?jié)撛趷阂廛浖薷?Mac 上受保護的文件和文件夾,但這也造成了安裝某些特殊版本軟件的或者做特殊修改的時候權限不足。在這里就體現在使用 LLDB 調試時候,所有的調試語句都會被系統拒絕,因此在正式進行調試之前,一個重要的準備工作就是檢查系統完整性保護(SIP)的開啟狀態(tài),如果開啟的話,要把它關閉。

檢查 SIP 的開啟狀態(tài)

在終端里輸入 csrutil status 回車,如果看到:

System Integrity Protection status: enabled.

這說明的 SIP 已經開啟,如果要繼續(xù)調試的話,需要關閉。如果是 System Integrity Protection status: disabled. 則說明 SIP 已經處于關閉狀態(tài),可以直接進行調試。

  1. 重啟,并在開機的時候長按 Command 和 R
  2. 進入系統恢復狀態(tài)
  3. 點擊屏幕頂部工具欄上的 實用工具,選擇終端
  4. 在終端中輸入 csrutil disable 回車,會出現下述字符串,再次重啟生效
1. Successfully disabled System Integrity Protection. Please restart the machine for the changes to take effect.

然后我們就可以開始調試微信了
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,回車就可以獲取到了密鑰

0x6000003624e0: 0x54 0x60 0x97 0x05 0xb5 0x09 0x43 0x9f
0x6000003624e8: 0x94 0xe8 0x38 0x09 0xdc 0x5e 0x79 0x53
0x6000003624f0: 0x4f 0xdc 0xa1 0x66 0x8e 0x96 0x4a 0x98
0x6000003624f8: 0x9a 0x72 0xa6 0x17 0xe0 0x17 0x7c 0x56

這里我們可以直接PRAGMA cipher_compatibility = 3就可以設置好解密參數了 ,這是一個標準

解密效果如下

3.一些其它功能

微信在2022.06月之后更改了傳輸文件存儲位置,和每個人聊天所傳輸的文件會被放在不同的文件夾下,大大提升了我們尋找歷史文件的難度,于是我寫了個整合文件名輸出的功能

還有就是壓縮功能可以分別壓縮數據庫,圖片,歷史傳輸文件

4.碎碎念

原先想繼續(xù)完善安卓和ios的解密腳本來著,但是作者馬上要開始準備秋招了沒時間寫,等過段時間再更新下,寫這篇文章的目的是想讓大家接觸下電子取證這個方向的知識,不僅僅是微信還有一些社交軟件都可以嘗試去分析下,例如soul,陌陌,qq等。不限于app甚至是阿里云鏡像取證,這個方向也有很多知識值得學習。


當前名稱:關于微信數據庫的解密以及取證
標題URL:http://www.5511xx.com/article/coodedi.html