PC微信逆向:使用HOOK拦截二维码
文章目錄
- 微信版本
- 尋找微信二維碼基址
- PNG文件格式
- 使用CE過濾基址
- 使用OD確定二維碼基址
- 驗證二維碼基址
- 尋找微信二維碼內容的基址
- 微信二維碼的存儲內容
- 使用CE尋找二維碼內容的基址
- 驗證基址
- 定制微信登錄二維碼的可能性
- 使用hook截取二維碼
- 最終效果
微信版本
尋找微信二維碼基址
PNG文件格式
微信二維碼在內存中存放形式是png格式的二進制數據,所以我們需要眼熟一下png的文件格式,如圖
前32個字節是固定的,分別是btPngSignature和struct PNG_CHUNK chunk結構,其中保存有png圖片的標識。
其中NG和IHDR是每個PNG文件都會有的標識,眼熟一下就好。微信的二維碼圖片就是通過這種格式在內存中存放
使用CE過濾基址
首先在微信未登錄狀態下附加微信,此時二維碼還未加載
然后選擇未知的數值,點擊首次掃描
出現三百萬個結果
此時我們再次點擊切換賬號,出現二維碼,讓保存二維碼的地址被賦值
然后選擇變動的數值 再次掃描
此時還剩下七萬個結果
然后用手機掃描二維碼 不要點擊登錄,再次掃描變動的數值,此時還剩三萬多個結果
接著隨意移動微信框,點擊未變動的數值,還剩一萬多個結果。返回二維碼登錄重復以上操作,直到地址欄還剩下兩個綠色的基址,這兩個綠色的基址就是我們要的。
因為隨機基址的存在,這個地址在各位的電腦上是不一樣的。但是低四位是一致的,這兩個地址應該是xxxx9194和xxxx919C。
使用OD確定二維碼基址
然后重啟一次微信,再用CE附加,回到這個狀態
用OD附加微信,在找到的第一個地址xxxx9194下內存寫入斷點
點擊切換賬號,在二維碼未加載時程序會斷下。注意,這個地方會斷下來兩次,第二次才是我們要的結果。
因為二維碼是存放在微信的核心模塊WeChatWin中的,所以我們在堆棧中找到所有的WeChatWin中的函數
像這種API的調用就可以直接排除掉,然后在每一個疑似函數上下斷點。找的時候堆棧盡量往下拉,這個函數會比較靠后。
因為我已經找過一遍了,所以直接告訴你們是這一個。特征是有一個ecx傳參。
接著在這個函數上下斷點,刪除內存訪問斷點,F9運行
然后掃一下二維碼,點擊返回二維碼登錄,程序斷下
此時觀察ecx指針的內容,明顯是一個結構體,結構體的第一個是地址,第二個好像是大小。然后在這個地址上數據窗口跟隨
里面是PNG文件的二進制數據,這個就是我們要找的微信二維碼的基址
驗證二維碼基址
打開PCHunter,選擇微信進程,查看->查看進程內存,輸入地址和大小,然后將內存dump下來
打開圖片
現在已經確定就是我們需要的二維碼。然后我們將這個call的地址減去模塊基址,記錄下偏移。待會需要HOOK這個call
尋找微信二維碼內容的基址
微信二維碼的存儲內容
二維碼其實是一種開放性的信息存儲器,它將固定的信息存儲在自己的黑白小方塊之間。大部分的二維碼都有一個特點,就是里面存放的其實是一段文本。我們可以利用這個文本來尋找突破口
將微信的二維碼截圖保存,然后用在線的二維碼解碼器解析微信的二維碼
可以看到解碼之后的結果是一段網址
使用CE尋找二維碼內容的基址
如果直接搜索這段網址是找不到任何結果的,原因是因為微信在保存這段位置的時候,實際上是將它分為了兩部分存儲
第一部分:http://weixin.qq.com/x 第二部分:/I-yOUnFpRaZOwZyVPC0H第一部分的固定不變的,第二部分被當作一個參數傳入,客戶端從服務器獲取的只是第二部分的內容。所以我們去搜索第二部分。
另外,微信的二維碼會定時刷新,刷新的時候會改變第二部分的內容。如果你搜不到的話可能是因為之前的文本已經失效了。從解析文本到搜索文本最好在一分鐘之內完成
此時 我們直接搜索第二部分的文本
搜索完成之后,等待二維碼自動刷新,然后找到那個變化之后的地址,用截圖上傳的方式確保找到的是正確的地址
然后用OD附加微信,在找到的地址上下內存寫入斷點
等待二維碼自動刷新,二維碼刷新時會往原來存放二維碼的地址寫入新的二維碼數據,程序就會斷下
此時eax指向二維碼的文本內容,我們找到堆棧中的第一個地址,在數據窗口顯示,此時就能找到存放微信二維碼數據的基址了
然后我們在CE中添加WeChatWin.dll模塊,找到模塊基址,算出偏移(用0x104CF618-0xF250000=127F618)。然后將這個地址換成模塊基址+偏移的方式添加到CE地址欄。
驗證基址
重新打開微信,用CE載入
保留當前列表,然后將二維碼內容指針的值添加到列表
點擊確定。此時二維碼的內容和解析出來的內容一致,說明基址有效
定制微信登錄二維碼的可能性
那么我們拿到這個二維碼的內容有什么作用呢?我們可以將這個獲取到的二維碼內容調用二維碼生成器的API接口進行再次編碼,然后生成一個更加漂亮好看專屬二維碼,效果如圖:
使用hook截取二維碼
接著我們編寫一個dll,將這個dll注入到微信進程中,利用IAT Hook截取微信的二維碼。部分關鍵代碼如下:
開啟HOOK
void StartHook(DWORD dwHookOffset,LPVOID pFunAddr, HWND hWnd) {hDlg = hWnd;//拿到模塊基址DWORD dwWeChatWinAddr = GetWeChatWinAddr();//需要HOOK的地址DWORD dwHookAddr = dwWeChatWinAddr + dwHookOffset; //填充數據jmpCode[0] = 0xE9;//計算偏移*(DWORD*)(&jmpCode[1]) = (DWORD)pFunAddr - dwHookAddr-5;// 保存以前的屬性用于還原DWORD OldProtext = 0;// 因為要往代碼段寫入數據,又因為代碼段是不可寫的,所以需要修改屬性VirtualProtect((LPVOID)dwHookAddr, 5, PAGE_EXECUTE_READWRITE, &OldProtext);//保存原有的指令memcpy(backCode, (void*)dwHookAddr, 5);//寫入自己的代碼memcpy((void*)dwHookAddr, jmpCode, 5);// 執行完了操作之后需要進行還原VirtualProtect((LPVOID)dwHookAddr, 5, OldProtext, &OldProtext); }卸載HOOK
void UnHook(DWORD dwHookOffset) {DWORD dwWeChatWinAddr = GetWeChatWinAddr();DWORD dwHookAddr = dwWeChatWinAddr + dwHookOffset;// 保存以前的屬性用于還原DWORD OldProtext = 0;// 因為要往代碼段寫入數據,又因為代碼段是不可寫的,所以需要修改屬性VirtualProtect((LPVOID*)dwHookAddr, 5, PAGE_EXECUTE_READWRITE, &OldProtext);// Hook 就是向其中寫入自己的代碼memcpy((LPVOID*)dwHookAddr, backCode, 5);// 執行完了操作之后需要進行還原VirtualProtect((LPVOID*)dwHookAddr, 5, OldProtext, &OldProtext); }保存圖片
void SaveImg(DWORD qrcode) {//獲取圖片長度DWORD dwPicLen = qrcode + 0x4;size_t cpyLen = (size_t)*((LPVOID*)dwPicLen);//拷貝圖片的數據char PicData[0xFFF] = { 0 };memcpy(PicData, *((LPVOID*)qrcode), cpyLen);//將文件寫到本地HANDLE hFile = CreateFileA("E:\\qrcode.png",GENERIC_ALL,0,NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL);if (hFile==NULL){MessageBox(NULL, "創建圖片文件失敗", "錯誤", 0);return;}DWORD dwRead = 0;if (WriteFile(hFile, PicData, cpyLen, &dwRead, NULL) == 0){MessageBox(NULL, "寫入圖片文件失敗", "錯誤", 0);return;}CloseHandle(hFile);//顯示圖片CImage img;CRect rect;//拿到控件的句柄HWND hPic = GetDlgItem(hDlg, IDC_QRPIC);GetClientRect(hPic, &rect);//載入圖片img.Load("E:\\qrcode.png");img.Draw(GetDC(hPic), rect);//顯示二維碼內容ShowQrCodeContent(hDlg);//完成之后卸載HOOKUnHook(QrCodeOffset); }最終效果
最終效果如圖:
最后附上工程和成品DLL
目前微信機器人的成品已經發布,需要代碼請移步Github。還請親們幫忙點個star
https://github.com/TonyChen56/WeChatRobot
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的PC微信逆向:使用HOOK拦截二维码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 160个Crackme047
- 下一篇: 【开源】WeChatRobot+WeCh