1、條件斷點:windows
使用方法(如):
在當前行按[Shift+F2]鍵->條件斷點(這個不太好用,由於程序BUG偶爾失效)。
在當前行按[Shift+F4]鍵->條件記錄斷點(只要設置上條件語句和按什麼條件生效就能夠了)。函數
條件語句(如):
EAX == 00401000 ; 當EAX的值爲00401000時。
[EAX] == 05201314 ; 好比EAX的值爲00401000,而地址00401000處所指向的值等於5201314時,即EAX的值表示爲指針。
[[EAX]] == 05201314 ; 好比EAX的值爲00401000,地址00401000處所指向的值爲00402000,而地址00402000處所指向的值等於5201314時,即EAX的值表示爲指針的指針。
EAX == 05201314 && EBX == 0x05201314 ; 當EAX的值等於5201314(十進制),而且EBX的值等於5201314(十六進制)時。
[EBP+8] == WM_COMMAND ;
[[EBP+8]] == 05201314 ;
byte ptr[EAX] == 'y' ;
[EAX] == "coderui" ; 好比EAX的值爲00401000,而地址00401000處所指向的字符串爲「coderui」時,即EAX的值表示爲指針。
[[EAX+4]+4] == WM_LBUTTONUP ;工具
2、消息斷點:ui
原理:就是在消息函數上設置條件斷點。3d
步驟:
一、使用[Ctrl+G]呼出「表達式跟隨窗口」,輸入「TranslateMessage」,而後回車。
二、在「轉到」的位置上使用[Shift+F4]呼出「條件記錄斷點設置窗口」。
三、在「條件」中輸入以下語句「[[ESP+4]]==當前按鈕句柄&&[[ESP+4]+4]==WM_LBUTTONUP」。
四、把「暫停程序」設置爲「按條件」,其餘都爲默認,而後肯定。
五、點擊按鈕後,程序會停在「TranslateMessage」函數的系統領空中。
六、查看內存,對代碼段下「內存訪問斷點」,而後通過屢次[F9](運行),就會找到關鍵的處理代碼了。指針
=================================================================================code
如下演示如何下消息斷點,blog
OD運行TraceMe.exe,事件
單擊系統菜單View/Windows(查看/窗口)或單擊工具欄的W按鈕,如無內容,則執行右鍵菜單"Actualize"刷新命令內存
如今要對Check按鈕下斷點,當單擊按鈕時中斷,在Check行上單擊鼠標右鍵,在彈出的右鍵菜單中,選擇"Message breakpoint on ClassProc"
當單擊事件發生時,會發送WM_LBUTTONUP這個消息,因此,選中這個消息,單擊OK,設好消息斷點:
單擊Check按鈕,將會中斷到windows系統代碼中,因爲處於系統底層代碼裏,這時企圖使用Alt+F9或Ctrl+F9返回TraceMe程序的領空代碼是徒勞的,
因此用Ctrl+M打開內存區,對.text區塊下一次性內存訪問斷點,如圖:
按F9運行,當即中斷在程序的空間004010D0處,這裏正是程序的消息循環處:
注意的是,這段代碼是一個消息循環,不停的處理TraceMe主界面的各種消息,所以可能不是直接處理按鈕事件,
能夠重複這個過程(其餘過程會走到系統領域中,這時再下內存訪問斷點),在幾回中斷後到達處理按鈕的事件代碼,很快就能發現check按鈕事件的代碼: