WeTool逆向:借用别人的成果 打造自己的程序
文章目錄
- 什么是WeTool
- 前置知識&基于WM_COPYDATA的消息模型
- 進程通訊相關知識
- WM_COPYDATA的相關知識
- WM_COPYDATA的缺點
- 示例代碼
- 逆向WeTool
- 定位WeTool核心模塊
- 分析WeChatHelp
- 分析SendMsg函數
- WeTool逆向和微信逆向的對比
- 微信逆向
- WeTool逆向
- 方法擴展
什么是WeTool
百度直接搜索WeTools就可直接找到WeTools官方網站
這是一款專業的微信粉絲和社群的管理工具,是目前市面上微信HOOK做的非常不錯的一款產品。不管是從產品設計角度還是用戶體驗角度或者是產品安全角度來看都無可挑剔。具體功能各位可以去官網看相關介紹,這里就不多做說明。
目前官網已經不提供免費版本下載了,我會在文末放出免費版本的安裝包。
前置知識&基于WM_COPYDATA的消息模型
進程通訊相關知識
WeTool的客戶端和服務端之間的采用WM_COPYDATA的方式進行進程通訊。要想逆向WeTool,就必須理解WM_COPYDATA消息模型。
在Windows程序中,各個進程之間常常需要交換數據,進行數據通訊。常用的方法有
- 使用內存映射文件
- 通過共享內存
- 使用SendMessage向另一進程發送WM_COPYDATA消息
比起前兩種的復雜實現來,WM_COPYDATA消息無疑是一種經濟實惠的一種方法
WM_COPYDATA的相關知識
我們可以用下面的函數發送WM_COPYDATA消息
SendMessage(hwnd,WM_COPYDATA,wParam,lParam);其中,WM_COPYDATA對應的十六進制數為0x4A,wParam設置為包含數據的窗口的句柄。lParam指向一個COPYDATASTRUCT的結構:
typedef struct tagCOPYDATASTRUCT {DWORD dwData;//用戶定義數據DWORD cbData;//數據大小PVOID lpData;//指向數據的指針 }COPYDATASTRUCT;其中dwData既可以是數組,也可以是結構體。能發送這兩種數據類型,其實就已經滿足大部分的進程通訊需求了。
WM_COPYDATA的缺點
這種通訊方式有一個缺點:接收方必須是窗口程序。所以要想實現exe和dll之間的通信,就必須在dll里注冊一個窗口類,并將其顯示方式設置為隱藏。
示例代碼
發送端:
COPYDATASTRUCT show_qrpic; show_qrpic.dwData = WM_ShowQrPicture; show_qrpic.cbData = 0; show_qrpic.lpData = NULL; //發送消息 ::SendMessage(hWeChatHelp, WM_COPYDATA, (WPARAM)hWeChatHelp, (LPARAM)&show_qrpic);接收端:
LRESULT CALLBACK WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) {if (Message == WM_COPYDATA){COPYDATASTRUCT *pCopyData = (COPYDATASTRUCT*)lParam;switch (pCopyData->dwData){//顯示二維碼case WM_ShowQrPicture:{GotoQrCode();HookQrCode(QrCodeOffset);}break;} }逆向WeTool
定位WeTool核心模塊
我們打開WeTool,并登陸微信。WeTool分為兩個部分,一個是客戶端,就是現在大家所看到的這個,負責顯示UI和數據,還有一個是服務端,負責從微信進程獲取數據,并將數據傳到客戶端。WeTool的核心功能都在服務端里面。所以我們要做的就是找到WeTool的核心模塊。
打開PCHunter,選中微信進程,右鍵->查看進程模塊,并按照模塊路徑排序
接著在這里我們看到了一個特殊的東西,之所以特殊是因為這個模塊的路徑既不屬于微信,也不屬于系統dll
接著右鍵->定位到模塊文件,找到這模塊所在的路徑。這個文件夾的名字WeToolCore其實已經暴露了這個dll的功能了。沒錯,這個就是我們要找的WeTool的核心模塊。
這個文件的原始路徑是在WeTool文件夾下的WeChatVersion這個子文件夾下。WeTools啟動后,會先檢測當前微信版本,并根據不同的微信版本注入不同的dll。
這里我們選擇分析2.6.5.52這個版本的WeChatHelp。
分析WeChatHelp
接下來我們用IDA載入WeChatHelp
在左側的函數窗口,能直接看到一堆帶有名字的函數。之所以能看到這些帶有名字的函數,是因為WeTools將這些函數作為接口導出了
我們可以使用LoadPE查看其導出函數。
分析SendMsg函數
接下來,為了和微信逆向的過程進行對比,我們選擇分析SendMsg這個函數,雙擊SendMsg,并按F5查看偽代碼。
這里將一個全局變量賦給了lParam,并且調用SendMessage,參數為lParam和0x4A。根據之前我們學習過的WM_COPYDATA通信模型,很容易就能看出這里并不是真正的SendMsg函數,而是和客戶端進行通信的函數。
那么怎么找到真正的SendMsg函數呢
選中賦值給lParam的這個常量,右鍵,跳轉到交叉引用
選擇第二個調用
這里實際上是在判斷lParam的消息類型是否是發送消息,如果是則調用sub_100050F0發送文本消息,如果要翻譯成源碼,就是這個樣子
接下來進入sub_100050F0這個函數
重點關注和數字相關的地方,比如0x2EB4E0。接著用OD附加微信(記得退掉WeTool)
用RVA的方式跳轉到WeChatWin模塊0x2EB4E0的地方,下斷點
然后隨便發送一條消息,程序斷下
接著通過堆棧,找到上一層返回地址,下斷點,讓程序再次斷下,分析函數參數
此時edx指向消息接收者的微信ID
ebx指向消息內容
那么要想確定這個是不是發送消息的call,只需要修改發送的消息內容。接著F9運行
此時消息內容已經被修改,我們就已經找到了發送消息的call。
這里為了節省篇幅我只分析了SendMsg函數內的一個地址,事實上,只要是函數內有的偏移,都需要逐個排查一遍,一個多多個其實沒什么差別,只不過多花點時間而已。
WeTool逆向和微信逆向的對比
微信逆向
請看我上一篇文章,PCXX逆向:發送與接收消息的分析與代碼實現:https://blog.csdn.net/qq_38474570/article/details/93339861
這里我們找到發送消息的接口,總共需要以下幾步:
WeTool逆向
而WeTool逆向則完全不同,只需要兩步
明顯直接逆向WeTool會比逆向微信要省很多時間。特別是在一些不可控的情況,比如找不到切入點,無法確定是不是關鍵call等等。
方法擴展
只要掌握了上面的方法,就能搞定WeChatHelp里導出的所有函數。這些你都可以直接拿過來,變成自己的程序。事實上我的微信機器人,其中百分之三十的功能就是來自于WeChatHelp。
最后 附上WeTool安裝包和微信機器人的成品地址
鏈接:https://pan.baidu.com/s/1GHjFhkdlUCxjIRfwyo89sA
提取碼:d5v6
https://github.com/TonyChen56/WeChatRobot
總結
以上是生活随笔為你收集整理的WeTool逆向:借用别人的成果 打造自己的程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CVE-2017-11882漏洞分析
- 下一篇: CVE-2012-1876 Intern