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