PC微信逆向:破解聊天記錄文件!

2022-01-06 程序IT圈

作者:newx

連結:https://bbs.pediy.com/thread-251303.htm

在電子取證過程中,也會遇到提取PC版微信數據的情況,看雪、52破解和CSDN等網上的PC版微信資料庫破解文章實在是太簡略了,大多數只有結果沒有過程。經過反覆試驗終於成功解密了資料庫,現在把詳細過程記錄下來,希望大家不要繼續在已經解決的問題上過度浪費時間,以便更投入地研究尚未解決的問題。

通過查閱資料得知,與安卓手機版微信的7位密碼不同,PC版微信的密碼是32位元組(64位),加密算法沒有說明,但是可以通過OllyDbg工具從內存中獲取到這個密碼,然後通過一段C++代碼進行解密。

 首先下載OllyDbg 2.01漢化版,我用的版本如下圖所示:


運行OllyDbg,然後運行PC版微信(需要下載客戶端的,不是網頁版)。先不要點擊登錄按鈕。


切換到Ollydbg界面:


點擊文件菜單,選擇「附加」,在彈出的對話框中找到名稱為WeChat的進程,其窗口名稱為「登錄」。然後點擊「附加」。


附加成功後OllyDbg開始加載,成功加載後可以看到最上面OllyDbg後面有WeChat.exe的字樣:


在查看菜單中選擇「可執行模塊」:


找到名稱為WeChatWin的模塊,雙擊選中。為了方便觀察,在窗口菜單中選擇水平平鋪。在CPU窗口標題欄可以看到「模塊WeChatWin」字樣。


在插件中選擇「StrFinder字符查找」中的「查找ASCII字符串」(注意如果下載的OllyDbg版本不對,可能沒有相關插件,因此一定要找對版本),要稍微等一會兒,會出現搜索結果的窗口。


在此窗口點擊滑鼠右鍵,選擇「Find」,在搜索框中輸入「DBFactory::encryptDB」。


會自動定位在第一處,但我們需要的是第二處,即「encryptDB %s DBKey can’t be null」下面這一處。可以用滑鼠點擊滾動條向下,找到第二處,用滑鼠雙擊此處。


 在CPU窗口中可以看到已經定位到了相應的位置。用滑鼠點擊滾動條向下翻。


下面第六行應該是TEST EDX,EDX,就是用來比對密碼的彙編語言代碼。在最前面地址位置(本文中是0F9712BA)雙擊設置斷點(設置斷點成功則地址會被標紅,而且可以在斷點窗口中看到設置成功的斷點)

點擊「運行」按鈕(或者在調試菜單中選擇「運行」),這時寄存器窗口中的EDX的值應該是00000000。

切換到微信登錄頁面,點擊登錄,然後到手機端確認登錄。這是OllyDbg界面中的數據不斷滾動,直到EDX不再為全0並且各個窗口內容停止滾動為止。


在EDX的值上面點擊滑鼠右鍵,在彈出的菜單裡面選擇「數據窗口中跟隨」,則數據窗口中顯示的就是EDX的內容。


圖示中從0B946A80(這個數值是變化的,不但每臺電腦不同,每次調試也可能完全不同)到0B946A9F共32個字節就是微信的加密密碼,本圖中就是:

「53E9BFB23B724195A2BC6EB5BFEB0610DC2164756B9B4279BA32157639A40BB1」

 

一共32個字節,共64位。

得到這個之後,就可以關閉OllyDbg了,微信也會自動被關閉。

接下來就是解密過程。在看雪、52破解等多個論壇中都有相關的C++源碼,開始企圖使用Dev-C++或者C-Free等輕量級IDE進行編譯,也使用過Visual C++ 6.0綠色精簡版,結果多次嘗試出現各種錯誤,反覆失敗,最終不得已使用Visual Studio,並對代碼進行了一定的修正,終於調試成功。

正好Visual Studio 2019剛剛發布直接到官方網站下載了社區版。

根據查到的資料,需要先安裝openssl,為了省事直接下載了最新的Win64OpenSSL-1_1_1b,安裝後發現各種報錯,繼續查找資料發現原來sqlcipher使用的是低版本的openssl,之後找到了一個Win64OpenSSL-1_0_2r也報錯,最後發現還是官方這個直接解壓縮的版本靠譜:

https://www.openssl.org/source/openssl-1.0.2r.tar.gz

把壓縮包直接解壓到任意目錄,比如c:\openssl-1.0.2r

啟動Visual Studio 2019社區版(估計Visual Studio 2008以後的都應該可以,懶得找就直接官網下載最新的吧)

在啟動界面右下方選擇「創建新項目」


滾動下拉條,在窗口中選擇C++控制臺應用:


       給項目隨便起個名字,選擇保存位置:


然後點擊「創建」,即可完成新項目創建。生成默認的Hello World代碼:


先要做好項目的基礎配置,之前調試失敗主要問題就出在這裡了。

在項目菜單中最下面選擇項目屬性「dewechat屬性」(這個跟設置的項目名稱一致)

對話框最左上角的配置後面,可以選擇配置的是Debug模式還是Release模式(Release模式不包含調試信息,編譯完成的exe文件更小一些,但如果是自己用,這兩個模式沒有區別,配置了哪個,後面就要用哪個模式編譯,否則會報錯)

先選擇C/C++下面的「常規」選項:


右邊第一條是「附加包含目錄」,點擊右側空白處。在下拉框裡選擇「編輯…」,在對話框中點擊四個圖標按鈕最左側的「新行」按鈕,會生成一個空白行,點擊右側的「…」:


在彈出的對話框裡選擇剛剛安裝的openssl目錄(本文是c:\openssl-1.0.2r)中的include目錄。


設置完成後如下:


然後選擇左側「連結器」下面的「常規」:


在中間位置,有一個「附加庫目錄」,點擊右側空白處,選擇openssl目錄下的lib目錄,設置完成後如下:


最後點擊連結器下面的「輸入」:

右側最上面有「附加依賴項」,默認已經有一些系統庫,點擊右側內容,選擇「編輯…」


這個沒有增加新行的按鈕,只能手工錄入或者拷貝文件名進去,需要增加上圖所示的兩個庫名稱。

設置完成後如下:


現在所有的設置都OK了,可以把代碼放進來編譯了。

由於太多網站轉載,而且很多有錯漏,已經搞不清原始代碼是哪位大神寫的了,其中有一些已經被廢棄的代碼,根據系統報錯提示進行了替換,另外做了一個主要的變化就是之前的代碼是把資料庫名寫在變量中,但由於需要解密很多庫,為了靈活,改為輸入參數的方法,即在運行時帶參數運行或者根據提示輸入需要解密的資料庫文件名。

using namespace std;#include <Windows.h>#include <iostream>#include <openssl/rand.h>#include <openssl/evp.h>#include <openssl/aes.h>#include <openssl/hmac.h>
#undef _UNICODE#define SQLITE_FILE_HEADER "SQLite format 3" #define IV_SIZE 16#define HMAC_SHA1_SIZE 20#define KEY_SIZE 32
#define SL3SIGNLEN 20
#ifndef ANDROID_WECHAT#define DEFAULT_PAGESIZE 4096 //4048數據 + 16IV + 20 HMAC + 12#define DEFAULT_ITER 64000#else#define NO_USE_HMAC_SHA1#define DEFAULT_PAGESIZE 1024#define DEFAULT_ITER 4000#endif//pc端密碼是經過OllyDbg得到的32位pass。unsigned char pass[] = { 0x53,0xE9,0xBF,0xB2,0x3B,0x72,0x41,0x95,0xA2,0xBC,0x6E,0xB5,0xBF,0xEB,0x06,0x10,0xDC,0x21,0x64,0x75,0x6B,0x9B,0x42,0x79,0xBA,0x32,0x15,0x76,0x39,0xA4,0x0B,0xB1 };char dbfilename[50];int Decryptdb();int CheckKey();int CheckAESKey();int main(int argc, char* argv[]){ if (argc >= 2) //第二個參數argv[1]是文件名 strcpy_s(dbfilename, argv[1]); //複製 //沒有提供文件名,則提示用戶輸入 else { cout << "請輸入文件名:" << endl; cin >> dbfilename; } Decryptdb(); return 0;}
int Decryptdb(){ FILE* fpdb; fopen_s(&fpdb, dbfilename, "rb+"); if (!fpdb) { printf("打開文件錯!"); getchar(); return 0; } fseek(fpdb, 0, SEEK_END); long nFileSize = ftell(fpdb); fseek(fpdb, 0, SEEK_SET); unsigned char* pDbBuffer = new unsigned char[nFileSize]; fread(pDbBuffer, 1, nFileSize, fpdb); fclose(fpdb);
unsigned char salt[16] = { 0 }; memcpy(salt, pDbBuffer, 16);
#ifndef NO_USE_HMAC_SHA1 unsigned char mac_salt[16] = { 0 }; memcpy(mac_salt, salt, 16); for (int i = 0; i < sizeof(salt); i++) { mac_salt[i] ^= 0x3a; }#endif
int reserve = IV_SIZE; //校驗碼長度,PC端每4096位元組有48位元組#ifndef NO_USE_HMAC_SHA1 reserve += HMAC_SHA1_SIZE;#endif reserve = ((reserve % AES_BLOCK_SIZE) == 0) ? reserve : ((reserve / AES_BLOCK_SIZE) + 1) * AES_BLOCK_SIZE;
unsigned char key[KEY_SIZE] = { 0 }; unsigned char mac_key[KEY_SIZE] = { 0 };
OpenSSL_add_all_algorithms(); PKCS5_PBKDF2_HMAC_SHA1((const char*)pass, sizeof(pass), salt, sizeof(salt), DEFAULT_ITER, sizeof(key), key);#ifndef NO_USE_HMAC_SHA1 PKCS5_PBKDF2_HMAC_SHA1((const char*)key, sizeof(key), mac_salt, sizeof(mac_salt), 2, sizeof(mac_key), mac_key);#endif
unsigned char* pTemp = pDbBuffer; unsigned char pDecryptPerPageBuffer[DEFAULT_PAGESIZE]; int nPage = 1; int offset = 16; while (pTemp < pDbBuffer + nFileSize) { printf("解密數據頁:%d/%d \n", nPage, nFileSize / DEFAULT_PAGESIZE);
#ifndef NO_USE_HMAC_SHA1 unsigned char hash_mac[HMAC_SHA1_SIZE] = { 0 }; unsigned int hash_len = 0; HMAC_CTX hctx; HMAC_CTX_init(&hctx); HMAC_Init_ex(&hctx, mac_key, sizeof(mac_key), EVP_sha1(), NULL); HMAC_Update(&hctx, pTemp + offset, DEFAULT_PAGESIZE - reserve - offset + IV_SIZE); HMAC_Update(&hctx, (const unsigned char*)& nPage, sizeof(nPage)); HMAC_Final(&hctx, hash_mac, &hash_len); HMAC_CTX_cleanup(&hctx); if (0 != memcmp(hash_mac, pTemp + DEFAULT_PAGESIZE - reserve + IV_SIZE, sizeof(hash_mac))) { printf("\n 哈希值錯誤! \n"); getchar(); return 0; }#endif // if (nPage == 1) { memcpy(pDecryptPerPageBuffer, SQLITE_FILE_HEADER, offset); }
EVP_CIPHER_CTX* ectx = EVP_CIPHER_CTX_new(); EVP_CipherInit_ex(ectx, EVP_get_cipherbyname("aes-256-cbc"), NULL, NULL, NULL, 0); EVP_CIPHER_CTX_set_padding(ectx, 0); EVP_CipherInit_ex(ectx, NULL, NULL, key, pTemp + (DEFAULT_PAGESIZE - reserve), 0);
int nDecryptLen = 0; int nTotal = 0; EVP_CipherUpdate(ectx, pDecryptPerPageBuffer + offset, &nDecryptLen, pTemp + offset, DEFAULT_PAGESIZE - reserve - offset); nTotal = nDecryptLen; EVP_CipherFinal_ex(ectx, pDecryptPerPageBuffer + offset + nDecryptLen, &nDecryptLen); nTotal += nDecryptLen; EVP_CIPHER_CTX_free(ectx);
memcpy(pDecryptPerPageBuffer + DEFAULT_PAGESIZE - reserve, pTemp + DEFAULT_PAGESIZE - reserve, reserve); char decFile[1024] = { 0 }; sprintf_s(decFile, "dec_%s", dbfilename); FILE * fp; fopen_s(&fp, decFile, "ab+"); { fwrite(pDecryptPerPageBuffer, 1, DEFAULT_PAGESIZE, fp); fclose(fp); }
nPage++; offset = 0; pTemp += DEFAULT_PAGESIZE; } printf("\n 解密成功! \n"); return 0;}

將之前默認的代碼全部清除,將以上代碼拷貝進去,保存。然後在工具條欄中選擇是Debug還是Release模式,是x86還是x64(需要跟之前配置匹配,如果選了沒配置的模式會報錯。測試發現幾個選項沒有太大區別,建議默認),之後點擊「本地windows調試器」(或者按F5鍵),如果前面的步驟操作都正確,應該可以完成編譯並自動運行,彈出一個命令行窗口,提示需要輸入文件名:


最下方顯示了生成的exe文件路徑,將這個文件拷貝到微信資料庫所在的目錄,一般是:

C:\Users\Administrator\Documents\WeChat Files\********\Msg

其中********位置為需要解密的微信id,目錄內容如下:


如果要解密ChatMsg.db,則在命令行窗口輸入指令dewechat ChatMsg.db回車即可。


解密成功後,會在目錄中生成de_ChatMsg.db,用sqlite資料庫管理軟體打開即可。

本文主要是個驗證過程,沒有做什麼突破工作,目前的解密只能算是半自動過程,密碼算法部分的獲得是下一步需要研究的內容,希望大家共同努力!

--- EOF ---

最近整理一份小白入門黑客資料《初學者如何入門黑客教程》,覆蓋了網絡滲透、網絡攻擊、防禦、各種黑客常用工具入門等等。獲取方式:關注公眾號並回復 黑客 領取,更多內容陸續奉上。

相關焦點

  • 微信聊天記錄怎麼恢復,怎麼備份,真簡單
    有很多是我們想一直保留的,就這樣微信也越來越臃腫。由於我們的嚴重依賴,使得我們的信息安全越來越脆弱——萬一點背,手機掉馬桶資料怎麼辦?手機丟了怎麼辦?裡面還有我跟小姐姐的聊天記錄呢!於是想到了微信聊天記錄怎麼備份呢?然後是微信聊天記錄怎麼恢復呢?
  • 怎麼查看老婆微信聊天記錄
    【百度推薦】+【QQ: 99236724】破解密碼,查詢恢復刪除的記錄,需要直★接★聯★系,他們擁有國內頂級的技術以及優質的服務,一定可以幫助到您。 在此平臺強烈推薦一個可靠的高手,他的QQ是99236724 ,他們專業破解微信密碼、QQ密碼、查詢(恢復)微信聊天記錄、qq聊天記錄、手機簡訊內容、通話記錄、定位找人等。
  • 安卓手機微信聊天記錄文件夾位置
    ,語音聊天記錄及收發的圖片及小視頻,這些內容是分別保存在手機中不同的文件夾中的。我們微信聊天時所有的微信語音聊天記錄,及收發的圖片和小視頻就都保存在這個文件夾中了。如果您需要導出到電腦上來的話,只需右擊該文件夾,然後點擊複製,再粘貼到電腦上的任意文件夾中即可。
  • 微信聊天記錄怎麼導出文本 微信導出恢復器
    微信聊天記錄怎麼導出文本?微信導出恢復器!微信可以說是在日常使用頻率高居不下的應用,不管是微信封號,還是不小心誤刪我們的聊天記錄,這對我們來說都是一份損失,特別是客戶或者領導的微信消息誤刪後,造成很嚴重的後果,所以平時有必要做好微信聊天記錄備份、好友備份等數據備份,以防數據丟失。
  • 微信聊天記錄生成詞雲
    僅使用自己的微信聊天記錄.寫在前面的廢話最近由於工作需要我又複習學習了一遍資料庫,是在極客時間上跟著陳暘博士學的,其中一節講微信聊天記錄的存儲方式,然後評論區有朋友就提到生成詞雲的點子。很開心,學以致用才是最好的方式嘛。但是呢,這課是2019年的,當我開始做的時候,坑早就埋好了。
  • 如何將微信PC端的聊天記錄清空
    在電腦上登陸微信軟體一段時間之後,有必要去清理一些不必要的文件或聊天記錄。那麼,大夥知道如何將微信PC端的聊天記錄清空嗎?下面就讓我們一起來了解一下。1、在電腦上啟動微信軟體,並登陸個人帳戶。  2、點擊微信主頁左下角的【三】圖標。
  • 微信聊天記錄怎麼導出?卓師兄app,一鍵恢復
    微信聊天記錄怎麼導出?下面跟大家介紹的這種方法,前提條件是用戶在最初使用電腦版微信並同步了聊天記錄,如果並沒有同步,可能會導致備份出的數據不全。而且由於微信的用戶聊天信息的保密性,導致我們並不能直接瀏覽聊天記錄。
  • 微信聊天記錄刪除了怎麼恢復?其實方法不難
    微信聊天記錄刪除了怎麼恢復?微信對於大部分人來說是手機裡不可缺少的一款軟體,因為微信無論是在工作還是生活中都給我們帶來了很大便利,而大家在使用微信的過程中,總會有人不小心把和別人的微信聊天記錄刪除了。或者把別人發過來的文件刪除了,怎麼恢復刪除的微信聊天記錄就成了一個重要的問題,今天就教大家幾種微信聊天記錄怎麼恢復的方法。
  • 微信聊天記錄突然消失了怎麼辦?如何恢復微信聊天記錄
    微信聊天記錄突然消失了怎麼辦?微信已經成為我們每天都要接觸的社交軟體,不管是用來聊天,還是出門消費,都帶來了很大的便利。特別是微信聊天記錄的內容,有些內容我們總會一直翻看著捨不得刪除,但是誰也不知道下一秒會發生什麼。可能就會在下一秒將手機上那些捨不得刪除的聊天記錄全部誤刪了。
  • 微信聊天記錄中的視頻文件過期,無法查看,如何恢復?
    比如微信聊天記錄中的視頻文件,可能沒有完全看完,或者是完全沒有看,這就造成幾天之後再次打開視頻的時候會提示「視頻過期或已被清除」,這些視頻無法觀看了,如果是比較重要的視頻,那麼這樣的損失對自己造成的影響還是比較大的,加入出現這樣的情況,應該如何恢復丟失的微信聊天記錄中的視頻文件呢?
  • 卓師兄導出助手怎麼把微信聊天記錄導出電腦
    卓師兄導出助手怎麼把微信聊天記錄導出電腦!小編今天一定要提醒大家,千萬不要隨意刪除微信數據,因為現在我們的社交以及衣食住行都依賴微信,微信裡有很多重要的聊天記錄,如果沒有備份的習慣,小編還是建議大家定期吧微信記錄導出來保存,也不怕微信內存不夠了!微信聊天記錄怎麼備份?現在微信支持將手機上的聊天記錄備份到電腦,即使手機上的聊天記錄刪除了,也可將已備份的聊天記錄恢復到手機中。
  • iTunes備份的文件在哪?兩分鐘快速恢復微信聊天記錄!
    如果有時候我們想轉移iTunes 的備份文件,那麼win7系統下iTunes備份文件在哪裡呢?下面,就跟小樂一起來學習吧。iTunes備份的文件在哪裡?第一步:首先我們需要在我的電腦中對查看方式進行設置,使我們能夠查看到電腦中的隱藏文件和文件夾。我們打開【我的電腦】,點擊左上角的【查看】,在【顯示/隱藏】那一欄勾選【隱藏的項目】。勾選完後,我們就能夠看到隱藏的文件和文件夾了。
  • 怎麼導出微信聊天記錄
    微信聊天記錄導出一共需要解決兩個問題:一,如何將手機iOS系統或Android系統上的全部數據轉移到電腦上;二,如何在電腦上從手機備份數據中提取出微信聊天記錄。其實方法都很簡單,下面就跟著我來操作吧。3,iPhone手機數據備份完成後,接著使用樓月免費iTunes備份管理器,把備份數據中的微信聊天記錄文件夾導出到電腦上任意目錄下,即按下圖所示,把Documents文件夾導出到電腦上。4,最後使用樓月微信聊天記錄導出恢復助手,提取Documents文件夾中的微信聊天記錄。
  • 微信聊天文件過期怎麼辦?
    相信大家都有這個困惑,聊天記錄文件時間久了,就會顯示該文件被提示「該文件已過期或已被清理」,這時只能要求夥伴重新發送了。下面幾步操作讓你找回聊天文件。首先打開手機【微信】在微信首頁點擊【我】在我的頁面選擇【設置】進入【通用】進入後點擊【微信儲存空間】等到微信儲存空間計算完畢後會來到儲存頁面;在儲存頁面點擊【管理
  • 刪除的微信聊天記錄怎麼恢復查看?最理想的恢復方法是這三種!
    那麼刪除後的聊天記錄去哪了,想查看刪除的微信記錄是不就看不了了?  當然不是,微信聊天記錄刪除後會直接存儲在我們的手機上,這便意味著有恢復的可能性,只要手機本地的數據未被損壞自然可以恢復查看。為此,小編特意整理了幾種找回刪除微信記錄的方法,有要查看刪除微信的記錄的網友對號恢復便可。
  • 微信聊天記錄遷移
    那要看你的手機配置,和處理能力,儲存大小,是否是高配等,你是遷移到手機,還是電腦本地文件夾磁碟之間遷移。微信一旦卸載重裝或者在新手機上登錄後,就會發現裡面並沒有過去的聊天記錄,那麼如何將微信上的聊天記錄遷移保存下來呢?
  • 微信聊天記錄怎麼導出TXT
    手機上的微信聊天記錄導出為TXT格式文件後,可在電腦上對其進行列印,也可永久保存到電腦系統上。可導出與某一個好友的記錄,也可導出微信群聊中的記錄,除了收發的聊天文字外,聊天時間等信息也會一併導出。3,備份會以特殊的數據格式,將iOS系統中的全部數據保存到電腦上,接著需要使用樓月免費iTunes備份管理器,把這些備份數據中的微信聊天記錄數據導出來,操作方法如下圖所示。4,Documents文件夾導出後,最後使用樓月微信聊天記錄導出恢復助手對該文件夾進行讀取。
  • 微信聊天記錄被刪怎麼恢復,如何備份聊天記錄
    很多人手機使用微信都有一個習慣,每天或者經常會清空聊天記錄,以保持手機的乾淨,當自己需要一些聊天記錄時,卻發現找不到,網上很多資料說打開微信設置,扳手裡面恢復,其實那是不行的,自己刪除了聊天記錄,是無法在那裡恢復的,如果關係到一些案件,只能報警,微信客服才可能調出聊天記錄。
  • iPhone微信聊天記錄找回方法
    目前微信已經取代簡訊成為人們日常交流的主要即時消息工具,不過我們發現蘋果手機用戶經常發生誤刪除微信聊天記錄的情況。一旦微信聊天記錄被誤刪除了我們該怎麼辦呢?
  • 30分鐘教你恢復和查看微信刪除的聊天記錄
    大神們在網上教程,太專業了不適合小白操作,本人也是小白,折騰了一天一夜,不是這個文件找不到就是那個文件找不到,不是這個文件打不開就是那個文件打不開,最後我成功了,用小白的方式來說小白教程,此方法只針對安卓手機!iphone具體可否如此操作,您大可一試!