標籤:lan 輸入 github col sqlcipher 程式 過程 使用者 規則
本文轉自:zz_zigzag
擷取資料庫檔案
藉助Google,已經有人逆向APP,拿到本機資料庫。
詳情參照知乎的回答
https://www.zhihu.com/question/19924224
這裡簡述一下,需要root的手機,拿到/data/data/com.tencent.mm/MicroMsg/一個長串/EnMicroMsg.db,檔案為加密的,密鑰為md5(IMEI+UIN)的前7位,手機序號IMEI通常可在設定->關於中獲得,或鍵盤*#06#。我這裡為IMEI1,UIN為使用者資訊號,可在/data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml中獲得,檔案中default_uid的value即是。
解密sqlite database
使用了sqlcipher做得加密,看來sqlcipher常用於安卓端sqlite資料庫加密。
最初原本想在PC端引入sqlcipher的包串連db檔案,後來發現sqlcipher主要是用於安卓應用,沒找到普通java項目可用的庫,於是作罷。
又瞭解到sqlcipher用了AES256做得加密,剛要手寫AES解密,發現JDK內建AES為128位的,如若想用,還得下載額外的包,期間還去看過sqlcipher的加密部分的源碼,後來想到AES還分不同類型,這樣成功的幾率不高呀,於是也作罷。
解鈴還須繫鈴人,還是用sqlchipher來解密吧,安裝和命令參照了這篇和這篇,多謝分享。
安裝sqlcipher
| 1 |
apt-get install sqlcipher |
或者
| 123456 |
unzip -q sqlcipher-master.zipcd sqlcipher-mastersudo apt install openssl libssl-dev tcl tk sqlite3./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto"make./sqlcipher |
解密
使用上一步得到的密鑰,如key = ‘1234567’。
| 1234567 |
./sqlcipher EnMicroMsg.dbsqlite> PRAGMA key = ‘1234567‘;sqlite> PRAGMA cipher_use_hmac = off;sqlite> PRAGMA kdf_iter = 4000;sqlite> ATTACH DATABASE ‘wechat.db‘ AS wechat KEY ‘‘;sqlite> SELECT sqlcipher_export(‘wechat‘);sqlite> DETACH DATABASE wechat; |
或者一句話直接執行
| 1 |
sqlcipher EnMicroMsg.db ‘PRAGMA key = "1234567"; PRAGMA cipher_use_hmac = off; PRAGMA kdf_iter = 4000; ATTACH DATABASE "wechat.db" AS wechat KEY "";SELECT sqlcipher_export("wechat");DETACH DATABASE wechat;‘ |
即可得到普通未加密的wechat.db。
其中PRAGMA cipher_use_hmac = off; PRAGMA kdf_iter = 4000;可用PRAGMA cipher_migrate;代替。使用後者,會改變原檔案,如sqlcipher EnMicroMsg.db ‘PRAGMA key = "1234567"; PRAGMA cipher_migrate; ‘,執行完後可使用DB Browser for SQLite輸入密鑰開啟,然後功能表列->檔案->設定加密,密碼為空白即可清除密碼。
瞭解資料庫結構
使用Browser開啟資料庫檔案,大致瀏覽了一下表結構和資料,這裡主要使用三個表:
- rcontact,通訊錄表
- chatroom,群聊表
- message,聊天記錄表
message中每條記錄即為一條聊天訊息,包含著聊天對象talker,如果為群聊,message.talker=chatroom.chatroomname,message.content中儲存形式為:”群成員wxid:\n內容”。
編碼
編碼過程比較容易,統計聊天記錄會按照Regex匹配,這裡要求群成員,飯費訊息為單獨一個數值。
具體代碼見
https://github.com/zz-zigzag/wechat-db-parser
由於程式較小,為實現方便捨棄了一些編碼規則,比如函數的可重新進入性等,這裡僅供參考。
---恢複內容結束---
wechat sqlite decryption