警告:此工具只能用於破解您自己的資料庫。請勿在任何非法情況下使用它。
(此工具可以解決 https://github.com/ppwwyyxx/wechat-dump/wiki 中列出的問題, pysqlcipher.dbapi2.DatabaseError: 檔案已加密或不是資料庫)
對於某些設備,當嘗試使用「md5(imei + uin)[:7]」解密 EnMicroMsg.db 時,您可能會收到錯誤訊息:「檔案已加密或不是資料庫」。一個可能的原因是微信使用其他設備ID而不是IMEI來產生密碼。
幸運的是,28 位元密碼(總共 16^7 種組合)的強度不足以抵禦暴力攻擊。
微信使用sqlcipher v2來加密資料庫。部分安全功能列舉如下(取自https://www.zetetic.net/sqlcipher/design/):
所以,我們的策略是:獲得第一頁;從最後一個 16B 獲得 IV,從前 16B 獲得鹽;迭代可能的密碼短語的所有組合;派生出對應的金鑰。解密資料庫。
我們知道sqlite db的原始頭是一個16B的字串:“SQLite format 3 ”,在加密的情況下用salt替換。以下是2B描述頁面大小(0x04 0x00),1B寫入版本( 0x01 0x02)和1B讀取版本( 0x01 0x02)。我們有 4 個相同的位元組來測試是否得到正確的純文字。 (2019-04-12) 從微信7開始,騰訊使用了新的讀寫版本(0x02),這將打破我們先前的偵測。現在我們將使用以下三個固定位元組來測試是否獲得正確的純文字: 1. 最大嵌入負載分數(0x40),偏移量為 5; 2. 最小嵌入有效負載分數 (0x20),偏移量為 6; 3. 葉子有效負載分數(0x20),偏移量為7。 )
執行 4000 次迭代的單一 PBKDF2 大約需要 5 ms。所以最壞的情況下,破解需要16^7 * 0.005 /3600/24 = 15.5天。在 8 核心 PC 上,它減少到 2 天(現在聽起來很合理)。
破解前,如果systemInfo.cfg和CompatibleInfo.cfg可用,請使用extract_key_from_cfg_files.py取得金鑰。
有兩個版本可供選擇:C 版本和 Python 版本。前者應該快一點(核心依賴openssl。計算4000次迭代沒有差別)。
$ sudo apt-get install libssl-dev
$ gcc password_cracker.c -l crypto -o password_cracker.o
修改「crack_enmicromsg_db_(C_version)」中的參數。 process_no:使用的核心總數。注意:如果成功取得通行證但仍無法開啟資料庫,請透過變更「pass_start」從下一個通行證開始。
開始:
$ python2 crack_enmicromsg_db_(C_version).py
演示目的。寫得不好。
使用 Yuxin Wu 編寫的精彩的 wechat-dump 來轉儲整個資料庫。您需要調整“decrypt-db.py”中的幾行才能使用金鑰。玩得開心!
crypto_db_with_password.py:當您已經知道密碼時,使用此腳本取得解密的資料庫,該資料庫可以透過 DB Browser for SQLite 檢視/編輯。
encrypt_db_again.py:再次加密資料庫。註:(2018年2月4日)未測試微信能否正確開啟。
extract_key_from_cfg_files.py :此腳本可以從CompatibleInfo.cfg和systemInfo.cfg中提取金鑰。請注意,它是用Python 3寫的。首先更改 search_path 然後運行腳本
$ python3 extract_key_from_cfg_files.py
sqlcipher-tools/decrypt.c 幫助我理解 sqlcipher 的工作原理。
wechat-dump/decrypt-db.py 提供了微信db的關鍵參數。
sqlcipher 文件:其詳細的安全功能。
修復問題 #4:不會針對 openssl 1.1 進行編譯:感謝 @couling 提供 openssl 1.1 補丁。