逆向与分析-WebBrowserPassView消息分析
逆向與分析-WebBrowserPassView消息分析
這個的源頭是之前我寫的一個博客:
http://blog.csdn.net/u013761036/article/details/73042749
? ? 里面整理了對WebBrowserPassView進行二次開發的思路和注意事項,當時里面有一個環節是當WebBrowserPassView在虛擬桌面上運行起來的時候,怎么樣把程序里面的執行結果給拿出來,當時說了很多思路,比如直接模擬按鍵,通過窗口一層一層注入找到里面的窗體,然后把里面的內容拿出來,在或者直接查找內存偏移量,今天要整理是:WebBrowserPassView這個程序本身有幾個按鈕,有全選結果按鈕,有復制結果按鈕,如果能分析出來這兩個按鈕對應的消息內容,就可以在程序運行起來的時候,直接給相應窗體發送這兩個消息內容,這樣內容就直接在剪切板里了,然后通過剪切板相關函數把各個賬號密碼拿出來就行了。
?
下面是分析思路?[至于其他的姿勢,窗體注入什么的之后會陸續實現整理代碼]
先看下軟件本身用戶操作的地方:
????所以說,如果找到那兩個對應的消息ID就可以了,比較簡單。接下來說怎么找這個ID(此處感謝ZDS提供的思路,對于逆向,我是剛開始搞)。
? ??
切入點:
可以先找Copy?Selected?Items的消息處理相關。這個函數執行的時候無疑會操作剪貼板,所以想辦法在剪切板函數位置下斷點:
我都不知道剪切板有啥函數,直接搜一把。
顯然找一個他肯定會用的,就OpenClipboard了。
?
附加進程->右鍵查找->所有模塊,找上面的按個函數。
????回車進去看,發現兩處調用,OK直接下兩個斷點,然后觸發那個動作,就是點擊復制所有選擇項的那個按鈕。
? ? 看到上面的那個調用剪貼板函數位置,然后上下屢了下,并沒有發現什么相關代碼,所以極有可能這個是個處理函數,想看判斷部分就繼續往外走,因為消息id應該是一堆判斷,會是很多的判斷,所以直接一步一步往下走,知道走到return,繼續再走一次,跳出到了這個函數被調用的地方。
? ? 就是那個cmp...所以上面那個call?后面的函數就是剛剛的函數,然后在網上看,很容易找到那個cmp?di,0x9c48,講道理這個應該是粘貼的消息ID了,當然也可能不是,分析就是這樣,感覺是就測試下就行了,不是的話繼續屢匯編。這個我測試過了,這個參數就是消息發送的信息,直接給主窗體發送這個消息就能實現復制功能。
?
接下來就是找全選的那個了,為啥不是先找全選,其實是有原因的,入口點選擇了剪切板函數,這樣我們就可以有確定的函數去下斷點了,找到粘貼的id那么全選的id就很容易在附近唄(當然其他id也是)。講道理就是
Switch(id){
????Id1:
????????do1...
????Id2:
????????do2...
????Id3:
????????do3...
}
? ? 所以就直接把附近所有的do?1?2?3..都下上斷點,然后觸發條件,看看是那個call,然后再找這個call是那個邏輯下來的就ok了。
? ? OK這樣就找到0x9c47這個消息id了,這個就是全選,其實只要切入點正確,很容易找到,接下來就可以嘗試這樣:
啟動WebBrowserPassView,然后給窗體發送兩個消息,一個是0x9c47?全選結果,一個是0x9c48復制結果,然后在調用相關API把剪貼板里面的東西拿出來,我寫了測試代碼,代碼和結果如下:
結果:
代碼:
?
#include "stdafx.h" #include <string> #include <windows.h> #pragma warning(disable:4996) using namespace std;VOID Send_AC_2_Window(__in const HWND & hdWindow) { PostMessage(hdWindow, WM_COMMAND, 0x9c47, 0); PostMessage(hdWindow, WM_COMMAND, 0x9c48, 0); } string GetTextFromShearPlate() { string strCache = ""; if (OpenClipboard(NULL)){ if (IsClipboardFormatAvailable(CF_TEXT)){ HANDLE hClip; hClip = GetClipboardData(CF_TEXT); char* pCache = (char*)GlobalLock(hClip); strCache = string(pCache); GlobalUnlock(hClip); CloseClipboard(); } } return strCache; }int main(){ Send_AC_2_Window(FindWindow(NULL, L"WebBrowserPassView")); MessageBoxA(NULL ,GetTextFromShearPlate().c_str() ,"Hi" ,MB_OK); return 0; }?
?
?
?
?
???OK,上面那樣就可以直接通過消息發送讓那個工具干活,然后把結果存到剪切板里,我們在從剪切板里面拿就行了,下面說下另一種得到這個消息id的方式,其實可以直接通過PE文件的資源里面把這個消息拿出來,這個后來才知道。
????但是并不是所有的都能通過從這里面拿出來,之前同事逆過Pchunter,我今天銅鼓了下Pchunter發現并沒有把相關操作驅動的消息按鈕id放在里面,應該是現用現寫的。所以說通常靠譜的方式還是要去簡單逆下,之前有一段時間再逆PowerToo,當時的目的是想逆向分析他驅動消息傳遞內容,然后直接加載或者他加載我調用,用它驅動當跳板做事。當時忘記因為啥原因沒有逆完,我直接選擇自己寫一套驅動程序來做這個事。近期會重新逆向PowerToo的驅動,練手玩。還有就是說下,很多大廠商的驅動相關寫的并不怎么嚴謹,比如X度殺軟的某個驅動部分,就是直接沒有校驗,誰給他直接通過驅動接口發消息他就干活,所以后來出現了XXX那個事。其實就算校驗也很難根治,校驗了可以逆他上一層調用程序,或者是如果你可以手寫驅動的話,直接把他的驅動程序拿出來,當成自己的驅動,然后安裝到目標機器上(主要是64位過簽名問題),然后直接類似PE內存加載的方式把自己的無簽名驅動程序弄上去跑起來就OK,TDL64位無簽名加載驅動就是這個思路,只不過是用的過期簽名,改本地時間實現的臨時正確安裝......上一次逆PowerToo的驅動,我是直接用IDA在看他驅動的消息處理函數,賊多。這次打算直接先掛鉤他相關驅動通訊函數,抓抓看看再說。感覺應該很容易抓到,是在不行再OD調試相關函數,或者IDA接著看那個嘗嘗的switch,總之肯定可以搞定。后續找時間昨完整理出來。
總結
以上是生活随笔為你收集整理的逆向与分析-WebBrowserPassView消息分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTTP1.0,1.1,2.0,HTTP
- 下一篇: 《THE LEAN STARTUP》 《