使用C++代碼解密微信加密數據庫信息!

一、知識回顧

最近有人找我弄微信數據庫解密的東西,其實這個現在網上都公開了,我在很早之前就靜態分析過微信數據庫加密算法,不瞭解的同學可以查看這裏:Android中靜態方式破解微信數據庫加密密碼,所以現在有人找我的話我都會告訴他們這個內容,微信數據庫加密的密碼很簡單就是:MD5(IMEI+UIN).Substring(0, 7).toLower;設備的imei和微信登錄賬號後的唯一表示uin值拼接然後計算MD5值,取前7位在變成小寫字母即可。

 

這個我在那篇文章最後也說到了,這個加密算法不會變化的,因爲維繫爲了兼容以前版本,如果數據庫加密算法變動,那麼老版本的用戶升級到新版本,老版本的數據庫解密就會失敗,也就是用戶看不到以前的消息內容了,這個用戶會瘋的,所以微信即使知道了這個算法被破解了,他也是沒辦法升級的,所以現在不會變,以後也不會變的。但是比較奇葩的是他按照我的文章操作計算出來的密碼還是不可以。所以我就讓他把我的數據庫文件傳給我我來解密,中間其實我遇到了問題最後才知道被微信轉碼坑了,因爲他微信把IMEI和UIN傳遞給我了,結果我直接複製計算MD5是錯的,最後才知道微信消息中有轉碼的。加入小編C/C++編程學習羣:825414254獲取c++資料與直播權限!

 

二、獲取解密密碼

所以開始就計算錯誤,他一度懷疑微信的加密算法是不是變化了,但是這一點我還是堅信微信不可能換加密算法的,這個原因我之前也說了,對於微信來說幾乎是不可能操作的。然後他就在網上搜找到一個收費的PC端工具,大致是這樣的:

 

只需要選擇微信的數據庫目錄MicroMsg即可,就可以識別出來用戶,然後點擊指定用戶就可以查看對應的數據了,所以他這麼一說我倒是有點懷疑我的方法了?因爲畢竟他用這個工具解密是沒有問題的。所以我就用這個工具查看了一下的確沒問題,那麼爲什麼這個工具可以解密成功呢?所以我就想探究這個工具的原理,但是我不會PC端的軟件逆向,但是我們可以藉助強大的邏輯排除法定位,你看這個工具是需要選擇微信數據庫目錄的,也就是這樣的格式:

 

我就好奇了,我們在之前的文章中瞭解到用忽的UIN是存儲在xml中的,但是你看這個工具只要導入這個目錄就可以解密,也就是說他能夠拿到設備imei和uin值,所以我就懷疑他讀取這個目錄下的幾個文件獲取的,那麼就一個一個排除,首先通過肉眼判斷哪些文件肯定不是的,最後發現就這幾個cfg文件打開是二進制文件,所以懷疑對象就在這幾個文件了,因爲文件不多,我們可以這麼排除,就是通過逐一修改文件名,然後在用那個工具解密,如果提示錯誤了,那麼就表示這個文件是關鍵的,通過最後排查,有兩個文件不能修改,也就是上圖中文件名後面沒有11的兩個,一個是systemInfo.cfg和CompatibleInfo.cfg了。那麼這個文件是二進制文件,怎麼解密呢?這個就簡單了,直接用Jadx全局搜這兩個文件:

 

運氣很好,正好在第一個dex中就搜到了,點進去查看:

 

繼續點進去查看:

 

到這裏就看明白了,原來不是什麼加密操作,而是序列化對象到文件中,那麼想看這個文件的原始內容就簡單了,我們去寫一個Java程序把文件中的內容讀取出來是Map結果,然後把所有的key和value打印看看結果:

 

運行看看結果:

 

因爲之前他在微信上把他的uin和imei發給我了,所以我一眼就看到了這裏有他的imei和uin值,也就是說那個工具的確是通過這兩個序列化文件來獲取imei值和uin值然後計算密碼的,所以我再一次相信他也是用MD5計算那個密碼的,所以這時候我就不用他發給我的那個信息了,我就從這裏打印的結果直接計算結果,然後在用sqlcipher.exe工具直接查看,竟然解開了:

 

所以再一次確認了微信的數據庫加密算法沒有變化,那爲什麼他還是沒解開呢?因爲最後也確認了他和我計算的密碼是一樣的?那麼我就要懷疑他使用的sqlcipher.exe工具了,最後果然是工具出了問題,我把我發給他的工具就可以用了。所以這個過程我被他微信發給我的信息坑了,他被解密數據的工具坑了。不過不管怎麼樣都成功了。所以以後如果你在操作微信解密失敗問題,一定不要懷疑微信算法變了,不可能變的。如果有錯誤可能這些原因:第一、現在很多設備都有很多個imei值,一般是兩個,所以如果一個失敗了,就嘗試第二個。因爲你不知道微信獲取的是哪個imei值。第二、獲取imei值我們會用簡單的撥號和設置中進行查看,這裏我用小米 4+6.0系統驗證發現這兩種方式查看的值是不一樣的,而撥號的方式是正確的。第三、就是有的同學imei和uin值都獲取對了,但是計算MD5和全是字母小寫這一點弄錯了,也要注意。如果以上都沒有問題,那麼還是解密失敗,就請懷疑你使用給的sqlcipher.exe工具吧,不過沒關係了,從現在開始我要帶你們開發這個工具,以後只要用我的工具就可以了。

三、C++代碼解密數據庫

那麼到這裏本文就算結束了嗎?本來是結束了,因爲幫他搞定了解密,但是我就去看了那個工具,發現他查看消息和其他功能都是收費的,這我就不答應了,這麼簡單的功能還收費,我就喜歡做免費的東西,所以在那一刻之後我決定了自己開發這個工具,功能和他都是差不多,只需要導入MicroMsg目錄就可以預覽信息了。那麼在寫這個工具之前,我們不用C++來編寫界面,因爲我不會,我只會用Java寫界面,但是SQLCipher官網中沒有Java中可以使用的jar功能,但是我們在之前的文章已經在VS中用C++實踐成功了,所以我們可以用Java開發JNI來調用dll文件,把解密工作放到C++中做,數據展示放到Java層做這樣就沒問題了。其實主要還是我不會C++的圖形化開發,我也不想去折騰學習了,因爲我覺得價值不是很大。而且用Java做我們可以回顧JNI開發知識也是一件很好的事情。那麼不多說了,先來解決第一件事就是利用之前的文章說的SQLCipher代碼來解密微信數據庫看看能否成功,代碼修改很簡單,直接把我們計算的密碼替換一下,然後把微信的加密數據庫EnMicroMsg.db放到工程目錄下,運行即可:

 

可惜的是運行代碼提示數據庫加密了,也就是我們解密數據庫失敗了,但是我們用sqlcipher.exe工具查看都沒有問題,所以這裏的密碼是沒有問題的,但是哪裏出問題呢?代碼也是沒問題,因爲我們之前寫的demo都沒有問題,所以就懷疑微信的數據庫加密做了一些其他設置,我們可能還需要設置一些東西,就跑去SQLCipher官網查看api:

 

 

 

這樣就成功了,把userinfo數據表中的數據都成功打印出來了,到這裏本文的內容就結束了,後面還有一篇文章介紹如何利用JNI把C++層的解密數據傳遞到Java層中進行展示,以及如何開發出工具。因爲篇幅過長,本文就不在繼續講解了。 那麼看完本文之後,瞭解到微信中會把uin值和imei值序列化到cfg文件中,所以從這裏看到我們的確只需要MicroMsg目錄就可以進行解密操作了,但是我也發現

 

加密數據庫都放在這種類似於md5文件夾下面,所以我們爲了後面更好的操作,所以我們要搞清楚這個文件夾名字怎麼來的,這個比較簡單,再去dex文件中跟蹤即可:

 

點進去查看跟蹤可以看到,這裏其實我不想說了,因爲我之前在網上看到其他人說了,這個文件夾的算法就是:MD5("mm"+uin).toLower 即可。所以我就直接告訴大家了。當然因爲現在微信作爲最常用的聊天通信工具,很多人的聊天信息都保存了,當然微信官方說好了不會上傳用戶的聊天記錄,所以有時候當我們無意中丟失了和朋友之間的聊天記錄在找回來很麻煩了,比如手機摔壞了想找回聊天記錄怎麼辦?這時候我們可以這麼做吧手機的內存卡卸載下來,這一步一般如果不是一個喜歡動手的同學可以去找專業人員操作:

 

卸載下來之後直接可以用電腦訪問,這時候看到就是有root身份直接訪問微信的沙盒數據,然後直接用這種解密方式就可以找回微信信息進行保存即可。當然如果你在大馬路上無意中撿到一部手機的話,如果無法解鎖找到失主,最好的方式是交給JC叔叔,當然你可以還有其他辦法找到失主,這裏不方便多說,當然也有現在很多JC叔叔破案可以通過手機中的微信聊天記錄找到線索,如果有了犯罪分子的手機可以通過這種方式進行操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章