OD訊息斷點的設定方法
一、條件斷點:
使用方法(如):
在當前行按[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 ;
二、訊息斷點:
原理:就是在訊息函式上設定條件斷點。
步驟:
1、使用[Ctrl+G]撥出“表示式跟隨視窗”,輸入“TranslateMessage”,然後回車。
2、在“轉到”的位置上使用[Shift+F4]撥出“條件記錄斷點設定視窗”。
3、在“條件”中輸入如下語句“[[ESP+4]]==當前按鈕控制代碼&&[[ESP+4]+4]==WM_LBUTTONUP”。
4、把“暫停程式”設定為“按條件”,其他都為預設,然後確定。
5、點選按鈕後,程式會停在“TranslateMessage”函式的系統領空中。
6、檢視記憶體,對程式碼段下“記憶體訪問斷點”,然後經過多次[F9](執行),就會找到關鍵的處理程式碼了。
=================================================================================
以下演示如何下訊息斷點,
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按鈕事件的程式碼: