成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關于微信數據庫的解密以及取證

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

前言

之前研究過一段時間的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):

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的庫結果發現[pysqlcipher3](https://pypi.org/project/pysqlcipher3/)可以用來解密,但是在安裝的過程中,發現安裝失敗,結果去網上論壇搜索還是需要靜態編譯鏈接,我嘗試了幾次發現還是要下載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個字節的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次生成的密鑰這樣的話解密就很簡單了

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 及更高版本所采用的一項安全技術,旨在幫助防止潛在惡意軟件修改 Mac 上受保護的文件和文件夾,但這也造成了安裝某些特殊版本軟件的或者做特殊修改的時候權限不足。在這里就體現在使用 LLDB 調試時候,所有的調試語句都會被系統拒絕,因此在正式進行調試之前,一個重要的準備工作就是檢查系統完整性保護(SIP)的開啟狀態,如果開啟的話,要把它關閉。

檢查 SIP 的開啟狀態

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

System Integrity Protection status: enabled.

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

  1. 重啟,并在開機的時候長按 Command 和 R
  2. 進入系統恢復狀態
  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.碎碎念

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

責任編輯:華軒 來源: 今日頭條
相關推薦

2017-05-03 13:50:38

2011-08-11 14:47:41

2019-12-26 17:25:22

數據庫設計技術

2018-05-10 17:18:59

數據庫MySQL密碼

2011-04-06 09:25:20

MySQL數據庫

2011-08-23 15:16:54

OracleMySQL

2010-05-10 18:05:09

2018-08-24 13:58:13

數據庫MySQL備份

2013-05-21 10:06:11

數據庫查詢優化

2017-10-18 19:12:24

數據庫Oracle安全管理

2011-03-03 13:13:51

DelphiSQLite加密

2020-06-22 14:19:28

小程序云開發數據庫

2020-11-20 14:49:56

數據庫

2020-07-29 18:43:46

數據庫

2021-01-28 09:34:08

解密密鑰取證分析

2011-04-01 13:46:45

2013-06-24 10:31:38

2023-12-20 16:12:37

數據庫復制延遲

2011-06-30 15:26:28

Update數據庫

2011-04-28 11:17:17

微博數據庫設計
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久九九 | 国产一区二区在线观看视频 | 亚洲久久 | 亚洲嫩草| 一色桃子av一区二区 | 亚洲精品高清视频 | 免费黄色大片 | 成人欧美一区二区三区在线播放 | 亚洲精品一区二区久 | 国产一区二区三区在线看 | 久久久影院 | 精品日韩欧美一区二区 | 搞av.com| 黄色精品 | 亚洲精品电影网在线观看 | 亚洲一区二区在线 | 久久免费香蕉视频 | 久久精品国产亚洲一区二区三区 | 国产高清视频一区 | 中文字幕一区二区三区在线乱码 | av免费网站在线 | 国产三区在线观看视频 | 成人不卡 | 亚洲精色 | 亚洲第一在线视频 | 99精品免费久久久久久久久日本 | 欧美久久久久久久久中文字幕 | 国产粉嫩尤物极品99综合精品 | 成人av观看 | 色性av | 狠狠爱一区二区三区 | 欧美6一10sex性hd | 国产精品成人国产乱一区 | 亚洲天堂影院 | 成人一区二| 久久999 | 91久久精品| 亚洲欧美日韩精品久久亚洲区 | 成年人黄色小视频 | 精品亚洲一区二区 | 国产乱人伦精品一区二区 |