出發點是想找回微信被撤回的信息。
根據《PC版QQ微信防撤回補丁》文章,攔截PC端的撤回函數,新的撤回消息將不會被撤回。但是打補丁前撤回的消息,依然無法查看。
之前發現,手機端的微信,圖片、視頻信息撤回后,可以在本地找到相應的記錄。由此猜測,文本信息是否本地依然有記錄。查詢資料得知,文本的聊天記錄,存放在Sqlite數據庫中。本來想破解PC端的數據庫,但是收集到的資料都是手機端的。
根據《手把手教你破解微信本地數據庫(利用Sqlcipher查看)》和《Android動態破解微信本地數據庫(EnMicroMsg.db)》,得知微信聊天記錄的數據庫存放在/data/data/com.tencent.mm/MicroMsg/<user-md5>路徑下的EnMicroMsg.db數據庫中。
進一步研究發現,以上兩個教程的源頭都來着《Android逆向之旅---靜態方式破解微信獲取聊天記錄和通訊錄信息》(目前有新更新《微信數據庫最新的解密方式,使用C++代碼解密微信加密數據庫信息!》)。
實踐過程中如下:
1、獲取EnMicroMsg.db文件
訪問該文件需要root權限,一開始打算在已經Root的虛擬機中獲取,嘗試多款虛擬機后,發現新版本的微信無法正常安裝。最后Genymotion + Android 4.2.2 + Genymotion-ARM-Translation_v1.1 + Wechat 5.3組合,在虛擬機中正常啟動微信。
但是微信版本過低,無法登陸。最后選擇在MI 5上獲取該文件。MI 5雖然是開發版系統,但是還沒Root,在http://www.miui.com/unlock/index.html下載解鎖工具后,可以在 安全中心的權限管理中獲取Root權限。
解鎖過程中發現,Fastboot模式下無法連接電腦,猜測是驅動問題,在http://www.miui.com/shuaji-393.html下載小米線刷工具,安裝驅動后解決無法連接問題。
Root后,安裝微信登陸,生成數據庫,通過adb命令(cp res des)拷貝目標文件到/sdcard/Download路徑下。通過USB文件傳輸模式拷貝到電腦。
2、獲取IMEI與uin(uin是個整型,微信分配個用戶的唯一ID)
IMEI獲取比較簡單,撥號界面輸入*#06#獲取,MI 5支持雙卡,有兩個IMEI號,都記錄下來。
| 862033030*****2 862033030*****6 |
uin存儲在/data/data/com.tencent.mm/shared_prefs/auth_info_key_prefs.xml文件中,用同樣的方法拷貝到電腦,查看uin值:

3、計算密碼
密碼為MD5(IMEI+uin)的前7位,計算過程中,所有字母均為小寫。
在https://md5jiami.51240.com/計算,或者直接將拼接后的字符串存放在txt中,通過Md5checker工具計算。

4、通過SQLite管理軟件查看數據
根據文章的截圖,選用SQLiteDatabaseBrowser,但是兩組密碼均無效。
根據《手工解密微信聊天數據庫的四個大坑》,發現是工具的問題,最新版的SQLiteDatabaseBrowser無法兼容微信的數據庫(應該是微信為了兼容性,一直沒升級)。應該選用V2.1版的工具,百度sqlcipher 2.1,可以下載到合適的版本。
成功解密數據庫:

發現,撤回的文本消息直接被覆蓋了,並沒有保留在本地。
后續:
以上破解的手機端的數據庫。后續發現PC端的微信,也是使用Sqlite數據庫,但使用同樣的密碼,無法打開。查詢后發現,PC端的密碼和手機端不一樣,為32位密碼。目前網上沒有詳細的獲取資料。
進一步發現,《安卓微信數據庫解密》中,對微信數據庫有了進一步的研究。
收獲:
- 小米手機的Root流程
- 了解Sqlite數據庫的管理工具:SQLiteExpert、SQLiteDatabaseBrowser
- MD5Checker的另類用法
- 了解sqlcipher庫可以用於加密sqlite數據庫
