一個窗體程序的4種逆向思路

窗體程序是VC編寫的,一個簡單的用戶名/密碼驗證:


逆向的目的很簡單,找到驗證用戶名和密碼的彙編代碼段

思路一、通過註冊失敗字符串"registed fail"或者註冊成功字符串回溯

步驟:

   1、在OD CPU窗口右鍵選擇:搜索所有應用的字符串菜單項:




2、右鍵選擇反彙編窗口中跟隨:



來到CPU視圖:


選中的部分彙編代碼就是驗證用戶名和密碼的彙編代碼,這只是個樣例,實際中可能還需要向上成調用函數回溯查找驗證入口代碼

思路二、通用主線程Call Stack(調用棧)回溯實現

步驟:

1、直接在OD中運行程序,輸入錯誤的賬號密碼,然後彈出錯誤的消息:


2、觀察分析OD的調用棧視圖:


這個視圖上的所有過程從上之下是一種被調用關係,例如:ntdll.KiFastSystemCallRet被USER32.WaitMessage+0A調用,USER32.WaitMessage+0A再被USER32.77D277D5調用,USER32.77D277D5再被USER32.77D249BF調用,如此一直到最後被USER32.77D28E9B調用。

很明顯我們當前彈出的框是靠USER32.MessageBoxW這個函數彈出的,而這個函數又被mfc100u.787A0D9F調動。我們可以雙擊這裏或者右鍵選擇"Show Call"回到CPU視圖:


在這裏按F2(下一個INT3類型的斷點),在此點擊註冊按鈕,程序在這裏斷下來。

現在有兩種辦法,你可以找到這段代碼的函數入口,然後回溯,另一種是按Alt+F9程序繼續執行,知道返回程序領空,當這個過程會彈出對話框,你點擊確定即可立即回到程序領空。

在程序領空我們往上看,再次找到了剛纔的驗證代碼:


思路三、要驗證必然會獲取界面上文本框的值:用戶名和密碼,故採用下API斷點的方式,獲取文本框的API較多,你要嘗試看是哪一個,我選擇的是GetWindowTextW

通過命令:bp GetWindowTextW下一個API斷點,然後運行程序點擊“註冊”按鈕,程序在端點處停下來:


接下找到函數的入口向上層回溯,可能要回溯幾層函數才能找到目標,這裏不贅述。

思路四、在“註冊”按鈕上攔截按鈕消息:WM_LBUTTONUP,我覺得這個辦法很不錯。如何實現呢,由於Windows系統是一個消息驅動的系統,所有消息都要經過TranslateMessage這個函數,將virtual-key messages 轉換爲character messages,所以我們在這個函數上下條件斷點:

步驟:

 1、找到這個API函數:在CPU視圖執行快捷鍵"Ctrl+G"在彈出框你輸入“TranslateMessage”:


光標所在行就是TranslateMessage API函數的入口,在這裏下一個條件端點:

按下Shift+F4或者右鍵:


在彈出界面裏面輸入:


選擇當條件滿足時(On Condition)暫停程序(Pause program),其它選項不管。

表達式說明:[[ESP+4]]==0x0130606 && [[ESP+4]+4]==WM_LBUTTONUP

0x0130606爲按鈕的句柄

WM_LBUTTONUP爲消息類型,即鼠標左鍵按鈕按下彈起時。

要明白 [[ESP+4]]和 [[ESP+4]+4],必須搞懂很多東西,首先是彙編方法調用的傳參規則,ESP+4指向的就是傳遞給當前API函數TranslateMessage的參數。

下面是函數原型:

BOOL TranslateMessage(
  CONST MSG *lpMsg   // message information
);

意思是傳遞給該函數的是一個“消息結構的指針”,而這個消息未來是WM_LBUTTONUP類型.我們觀察整個結構體:

typedef struct tagMSG {
  HWND   hwnd; 
  UINT   message; 
  WPARAM wParam; 
  LPARAM lParam; 
  DWORD  time; 
  POINT  pt; 
} MSG, *PMSG; 
這裏的 HWND hwnd;  UINT message; 都是4字節的。

[ESP+4]   ---------->取得參數值,該參數值是指向消息結構的指針

[[ESP+4]] ---------->通過“指向消息結構的指針”取得消息結構頭4個字節的內容,即hwnd,這個就是按鈕句柄

[ESP+4]+4------------>“指向消息結構的指針”加4得到“指向結構體的第二個4字節的地址”,即message,我們要判斷這個message是否是WM_LBUTTONUP

2、點擊“註冊”按鈕,程序在這裏斷下來,按下"Alt+F9"運行,直到返回程序領空:


向上回溯,立即找到目標。


至此,4種思路羅列完畢。暫時想到這些。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章