電子取證之PC版微信資料庫解密

2022-01-24 NEO攻防隊
電子取證之PC版微信資料庫解密

記錄學習「PC版微信資料庫解密」全過程,參考原文「PC版微信資料庫解密詳細教程」連結:https://bbs.pediy.com/thread-251303-4.htm

1、環境&工具

Windows10:https://www.microsoft.com/

PC版微信:https://pc.weixin.qq.com/

visual studio community 2019:https://visualstudio.microsoft.com/zh-hans/

Ollydbg (吾愛破解專用版):https://down.52pojie.cn/Tools/Debuggers/%E5%90%BE%E7%88%B1%E7%A0%B4%E8%A7%A3%E4%B8%93%E7%94%A8%E7%89%88Ollydbg.rar

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

SQLite DB Browser:https://sqlitebrowser.org/dl/

2、提取資料庫文件密碼

打開 微信(退出狀態) 和 OD :

使用OD 附加 微信進程, 點擊 「文件」 --> "附加"  會彈出新窗口, 找到名稱是 wechat  的選中 點擊附加: 

加載後OD標題處會顯示 wechat.exe:

點擊菜單欄 「查看」 --> "可執行模塊" (快捷鍵:Alt+E):

打開後找到 名稱為「WeChatWi」 且路徑以WeChatWin.dll 結尾這一行,雙擊進入:

Executable modules:
名稱=WeChatWi
文件版本=3.3.0.115
路徑=D:\Program Files (x86)\Tencent\WeChat\WeChatWin.dll

進入後OD標題末尾處會顯示 WeChatWi , 接下來點擊 「插件」-->「中文搜尋引擎」--> "搜索ASCII" :

點擊後需要等等待一會,搜索結束後會跳轉到搜索結果界面:

搜索結果展示,在此界面右鍵 選擇 「Find」 (快捷鍵:Ctrl+F):

在搜索框中輸入「DBFactory::encryptDB」:

搜索到後雙擊進入,會定位到「push WeChatWi .XXXXXX"  這個位置,然後向下6行找到 」test edx , edx" :

在「test edx,edx" 這一行下斷點, 直接雙擊本行(滑鼠不要放在地址那一欄)或者 選中本行 按下快捷鍵 」F2" , 斷點設置成功後,本行地址欄會變成紅色:

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

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

此時斷點生效了,寄存器的值也發生變化了,接下來單擊選中EDX的值然後單擊滑鼠右鍵,在彈出的菜單裡面選擇「數據窗口中跟隨」,則數據窗口中顯示的就是EDX的值也就是內存地址對應的內容:

從地址」05340DB8「 開始選中 32 個字節,就是微信資料庫的加密密碼,本圖中密碼如下:

05340DB8  71 1A 1F FA 27 E6 41 D9 AB 8E 8D C0 F1 8A F9 66  
05340DC8  76 11 6F EF 95 30 48 91 B3 9B 40 9B 57 B1 35 00  

」711A1FFA27E641D9AB8E8DC0F18AF96676116FEF95304891B39B409B57B13500」    得到這個即密碼提取結束,退出OD。

將提取到的密碼轉換為 0x 格式備用,如下:

{0x71,0x1A,0x1F,0xFA,0x27,0xE6,0x41,0xD9,0xAB,0x8E,0x8D,0xC0,0xF1,0x8A,0xF9,0x66,0x76,0x11,0x6F,0xEF,0x95,0x30,0x48,0x91,0xB3,0x9B,0x40,0x9B,0x57,0xB1,0x35,0x00}

3、編譯解密程序

本文使用編譯工具:visual studio community 2019

3.1-配置openssl

在編譯前需要配置openssl  ,經過測試強制使用openssl 1.0.2r的版本,下載地址:https://www.openssl.org/source/openssl-1.0.2r.tar.gz

下載並解壓, openssl 需要自己編譯,網上教程有很多,我直接把編譯後生成的文件打包:

將這個兩個文件夾直接複製到openssl 1.0.2r 解壓的目錄中:

3.2-配置visual studio

接下來配置 visual studio, 打開visual studio,選擇 「創建新項目」:

選擇「C++ 控制臺應用」:

配置項目:(名稱和位置 自定義)設置好後點擊創建

生成默認的 hello world 代碼:

接下是添加openssl附加依賴庫,單擊 菜單欄的 「項目」 --> "dewechatdb屬性":(這個跟設置的項目名稱一致)

1.配置與平臺需要保持一致:

2.選擇 C/C++ 下面的 「常規」 --> 配置項 「附加包含目錄」 :

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

在彈出的對話框裡選擇前面解壓的openssl目錄(根據自己放目錄選擇,本文是D:\tools\openssl-1.0.2r)中的include目錄。

配置好後如圖:

3.選擇左側「連結器」下面的「常規」 --> 「附加庫目錄」:

點擊右側空白處,選擇openssl目錄下的lib目錄,設置完成後如下:

最後點擊「連結器-->「輸入」:

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

添加 libeay32.lib 、ssleay32.lib 依賴項。

到此配置完成。

3.3-編譯程序

複製大佬的原始碼:

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 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;
}

替換pass[] 的值為第一步獲取的 密碼:(轉換成0x格式的密碼值)

//pc端密碼是經過OllyDbg得到的32位pass。
unsigned char pass[] = {}

//本文獲取的密碼為:
{0x71,0x1A,0x1F,0xFA,0x27,0xE6,0x41,0xD9,0xAB,0x8E,0x8D,0xC0,0xF1,0x8A,0xF9,0x66,0x76,0x11,0x6F,0xEF,0x95,0x30,0x48,0x91,0xB3,0x9B,0x40,0x9B,0x57,0xB1,0x35,0x00}

替換好後將代碼複製到剛才在visual studio創建的 dewechatdb.cpp 中(刪除默認生成的hello world代碼):

點擊「本地windows調試器」(或者按F5鍵),如果前面的步驟操作都正確,應該可以完成編譯並自動運行,彈出一個命令行窗口,提示需要輸入文件名則為成功:

編譯成功,生成了 D:\wwwcode\c\dewechatdb\Debug\dewechatdb.exe  文件,將dewechatdb.exe 複製到微信的資料庫文件夾中,

默認安裝微信的文件夾路徑為:C:\Users\Administrator\Documents\WeChat Files\********\Msg ,

如果找不到路徑可以在微信設置--> 文件管理 中找到,可以使用打開文件夾 按鈕直接打開:

//使用:
dewechatdb.exe 資料庫名

解密 ChatMsg.db 這個庫:

dewechatdb.exe ChatMsg.db

解密成功後會生成 dec_ChatMsg.db 文件,即為解密後的資料庫文件,使用 DB Browser for SQLite 工具打開即可查看內容:

解密後的數據(微信聊天記錄):

到此解密完成。

4、常見問題匯總(踩坑記錄)

Q1:為什麼我下載的openssl裡面沒有lib目錄,而且include內為空?

A1: openssl 下載後需要編譯(win安裝的openssl 會出現位置錯誤),才會有lib目錄 和include裡面的內容,本文已打包include和lib文件夾。

Q2: 設置斷點之後微信就顯示無法獲取二維碼或者無法登陸?

A2:OD 版本問題可以換一個OD試一試(建議使用與本文一致的OD),或者是 設置好斷點後 沒有點擊運行 。

Q3: 為什麼編譯完成後使用生成的exe解密時顯示「打開文件錯」?

A3:經過測試是因為在解密時微信是在登錄狀態,所以在解密資料庫文件時要退出微信(一定還有其他情況會提示「打開文件錯」,我沒遇到)。

Q4: 編譯好的exe 運行時提示缺少libeay32.dll文件?

A4:下載一個根據系統版本放在指定的目錄內就可以了:https://cn.dll-files.com/libeay32.dll.html

下載後會有教程:

相關焦點

  • PC微信逆向:破解聊天記錄文件!
    作者:newx連結:https://bbs.pediy.com/thread-251303.htm在電子取證過程中,也會遇到提取PC版微信數據的情況,看雪、52破解和CSDN等網上的PC版微信資料庫破解文章實在是太簡略了,大多數只有結果沒有過程。
  • 《三位一體4夢魘王子》pc版巫婆解密怎麼玩 巫婆解密攻略
    有很多小夥伴不清楚要怎麼通過,那麼就來看看「chinesesword」分享的《三位一體4:夢魘王子》pc版巫婆解密攻略吧。 ... 在《三位一體4:夢魘王子》這款遊戲中,有一個巫婆解謎的關卡,總計有四關。
  • 虎符網絡安全大賽電子取證
    從虎符網絡安全大賽一道雜項題目學習電子取證前言在最近的虎符網絡安全大賽上遇到一道雜項題目,賽後通過電子取證的方式進行了復盤,覺得很有意思,從中也學習到了很多知識點。題目描述解題過程題目附件:附件下載 提取碼:(yzsa)本題用得到的取證工具為MAGNET AXIOM,下載地址:軟體下載提取碼:(bige),推薦使用取證大師,能夠檢索的信息更多一些,可以在官方微信公眾號聯繫客服獲取試用版本題目下載下來解壓發現是Windows系統中C盤文件夾,使用
  • 大咖雲集解密大數據時代電子取證難題如何破?
    電子數據看不到、摸不著、易修改、易破壞,導致電子數據發現難、固定難、取證難,給行政執法取證工作帶來了較大的困難。針對電子數據的特性,本次電子數據取證大比武團體賽一等獎浙江省市場監管局代表隊領隊水元琦對電子取證工作提出若干建議。
  • 手機取證中iPhone手機越獄權限對於取證數據的影響
    通常,在手機取證過程中,軟體允許對手機獲取數據的權限越多,獲取到的手機數據就會更加完整全面。
  • 電子數據執法取證5問5答
    總局網絡交易信息監測研究工作組成員,浙江省網絡交易平臺規則評審專家,浙江省電子數據取證比武團體個人三等獎獲得者、杭州市蕭山區市場監督管理局網監分局工程師王盛分享關於電子數據取證實操指引,並進行了常見問題答疑。
  • 法治課 | 簡訊、支付寶、微信等電子證據如何取證、舉證?
    本文原標題:《最詳指引:簡訊、支付寶、微信等9大電子證據如何取證、存證、舉證?》電子化的時代充分展現了電子科技進步帶來的好處,不僅方便人們進行信息檢索和交流,還大大提高工作和生活效率,但同時,也引發越來越多的新形式糾紛、違法行為甚至是犯罪活動。
  • 【281期-1】Android ROOT權限對於取證數據的影響
    即時通訊:已支持41種應用微信、微信小號、QQ、QQ輕聊版、QQ國際版、陌陌、快、Telegram(電報)、釘釘、 Talkbox、點點蟲、備註:點點蟲(資料庫被加密了正在逆向分析其解密方式);QQ、QQ輕聊版
  • 【用戶痕跡在電子數據取證實戰中的應用】
    用戶痕跡是用戶在使用計算機、手機、平板電腦等設備時產生的電子數據記錄,因此它與用戶活動息息相關。我們已經知道,電子數據證據有生成證據、存儲證據和混合證據之分,這是根據電子數據的身世來由確定的,電子數據可以是人為生成、自動生成或者兩者結合下生成的,用戶痕跡數據也是這樣。
  • 電子數據取證在市場監管執法辦案中的運用
    電子數據是《行政訴訟法》法定的一種證據類型。原工商總局於2011年專門下發了《關於工商行政管理機關電子數據證據取證工作的指導意見》,對電子證據的定義、取證原則、取證方式、取證程序,以及詢問筆錄和檢查封存的要求作了框架性規定,但目前仍未制定具有可操作性的電子數據取證細則規範,加上基層缺乏專業人員、缺少專業設備和鑑證輔助,嚴重影響了涉及電子數據取證案件的查辦。
  • 電子數據現場取證小課堂丨 辦案取證中,如何破解涉案密碼?
    ,越來越多的行政案件需要在案發現場對電子數據進行取證。2019年4月1日施行的《市場監督管理行政處罰程序暫行規定》(國家市場監督管理總局令第2號)第二十三條明晰了行政處罰一般程序中的電子數據證據規則。掌握正確的電子取證技巧、科學運用電子證據已成為執法辦案重要和關鍵的一環。
  • 取證技術 - 電子數據恢復分類
    收錄於話題 #取證技術>易失數據在機器重啟後會丟失故不能實現  重複性  或  復現分類> 硬體恢復> 軟體恢復> 特定類型文件恢復> 覆蓋恢復硬體恢復> 主要針對硬體故障而丟失的數據-- 據稱,佔所有數據意外故障一半以上--
  • 第四屆全國電子數據取證競賽團體賽題目
    經整理,現將「美亞杯」第四屆全國電子數據取證競賽-團體賽題目分享給大家。
  • 執法取證現場勘驗文書如何製作?電子物證又該如何封存固定?
    電子證據及物證又該如何封存、固定情況?12月23日,首屆全國市場監管系統執法辦案電子數據取證大比武個人賽第一名、江西省上饒市市場監督管理局楊志龍分享了在大比武中現場勘驗的標準文書製作和電子證據及物證封存、固定的流程,並就一些常見電子取證問題進行了答疑。01 勘驗環節現場文書包括哪些內容?
  • 最詳指引:簡訊、支付寶、微信等9大電子證據如何取證、存證、舉證?
    在核實雙方當事人身份的時候,應當注意雙方的名片上或合同約定中是否留有傳真號碼;2、存在多份傳真件的,應審查各傳真件之是否相互銜接,與其他證據能否印證。通過一系列傳真件結合其他證據能夠證明各傳真件之間存在連續性及關聯性的,可認定傳真件的證據效力;3、對單一傳真件的審查,可以適用證據補強規則,結合其他證據加以佐證。
  • 計算機取證方法介紹
    計算機取證要解決的重要問題是電子物證如何收集、如何保護、如何分析和如何展示。可以用做計算機取證的信息源很多,如系統日誌,防火牆與入侵檢測系統的工作記錄、反病毒軟體日誌、系統審計記錄、網絡監控流量、電子郵件、作業系統文件、資料庫文件和操作記錄、硬碟交換分區、軟體設置參數和文件、完成特定功能的腳本文件、Web瀏覽器數據緩衝、書籤、歷史記錄或會話日誌、實時聊天記錄等。
  • 22款受歡迎的計算機取證工具
    這些電腦取證工具,也被分為了不同的類別:磁碟和數據捕獲工具文件查看器文件分析工具註冊表分析工具網際網路分析工具電子郵件分析工具行動裝置分析工具Mac OS分析工具網絡取證工具資料庫取證工具在本文中,我將為大家羅列一些當前流行的計算機取證工具
  • 這些電子數據取證高手都是誰?(第一期)
    相應案例《從一起微信公眾號違法廣告案看對涉網證據的固定與使用》在中國市場監管報刊登。邢相坤,男,1989年11月生。本科畢業於內蒙古師範大學教育技術學(信息技術教育)專業,具有教育學和理學雙學士學位。研究生畢業於北京郵電大學工程管理專業,具有管理學碩士學位,熟悉網絡信息技術,善於開展電子證據固證和數據分析。
  • 電子數據取證之阿里雲網站伺服器鏡像取證方法
    當辦案人員從阿里雲公司獲取涉案網站伺服器的鏡像後,將面對如何對伺服器的鏡像進行取證的難題。  下面,效率源盤點關於阿里雲網站伺服器鏡像文件的取證思路,希望能給公檢法機構辦案人員一些靈感和參考。  取證思路  從上文我們知道辦案人員拿到的鏡像是關於涉案網站的伺服器鏡像,在針對這個伺服器鏡像進行取證時,可以通過仿真的方法將網站重新搭建起來,然後對網站進行取證。這樣對伺服器鏡像的取證就變成了對網站的取證。
  • 最全解密微信紅包隨機算法(含代碼實現)
    本文根據有限的資料,分享了微信紅包隨機算法實現中的一些技術要點,並整理了兩種比較靠譜的紅包算法實現思路(含可運行的實現代碼),希望能給你的紅包算法開發帶來啟發。申明:本文資料整理自網絡,僅供學習研究之用,如有不妥,請通知Jack Jiang。