OllyDBG - 第六章 | 訊息斷點及RUN追蹤的補充
這篇是在補充OllyDBG - 第五章 | 訊息斷點及RUN追蹤這篇文章中的一些疑問。
舉例:
- 是否覺得不知道在哪下斷點?
- 為什麼要這樣子下斷點?
- 如何確定斷點下來後的位置就是正確的?
希望透過這篇可以更了解斷點位置的判斷以及確認。
事件處理程序WinProc
- 事件處理函數是一個回調函數,Windows在窗口中發生需要處理的事件時,在主時間循環中調用該函數。
- 時間處理函數可處理任何想處理的事件,其他的事件傳遞給Windows進行處理。
- 在用戶和Windows執行某些操作時,將生成一些針對應用程序的事件和消息,所有這些消息都將進入一個隊列中,而針對一個應用程序窗口的事件和消息將從消息隊列中轉移到該窗口的私有隊列中。
- 然後主事件循環將獲取這些消息並將它們發送給窗口的WinProc進行處理。
消息處理函數的原型是:
1 | LRESULT CALLBACK WindowProc( |
註:WinProc根據
hwnd知道消息來自哪個窗口,其中uMsg就是關鍵,它代表消息的類型,如:WM_COMMAND,WM_GETTEXT等。
註:這邊提供Windows中的全部消息.txt
分析

- 首先這個
cycle.EXE是從對話框模板資源建立模式對話框。
註:如何知道的?下面的分析就會知道了。
使用OllyDBG分析
- 啟動
OllyDBG - 按下快捷鍵
F3 - 選擇
cycle.EXE

- 按下
Crtl + N,找到函數USER32.DialogBoxParamA - 點選右鍵下選擇
在每個參考上設定斷點

- 按下
F9 - 會斷點到
0040101D |. E8 8F020000 call <jmp.&USER32.DialogBoxParamA> ; \DialogBoxParamA - 其中DlgProc的內容,就是我們需要找的,這個地址是「消息處理函數的入口點」 (DlgProc = cycle.00401029)

為什麼要在窗口那才有消息斷點?
要下消息斷點,首先得找到具有Windows消息處理函數格式的函數,然後,再根據棧的資料來判斷消息,如果符合下斷的消息,那麼,OllyDbg就會攔下來(還會覺得不知道在哪下消息斷點了嗎?知道該如何下消息斷點了吧?)。
很明顯有一點,這個消息斷點的功能是有限的,比如,要攔主窗口中的菜單消息呢?所以,消息斷點的功能還是有限的。

- 回到
OllyDBG - 按下
Ctrl + G - 會開啟
輸入要跟隨的運算式 - 輸入
00401029(就是剛剛的DlgProc = cycle.00401029) - 按下
確定

- 跳轉到了
00401029,這就是消息處理函數 - 但是
OllyDBG沒有識別出他是消息處理函數

- 在
00401029 /. C8 000000 enter 0,0 ;點選右鍵 - 選擇
分析->假定參數

- 選擇
WinProc(hWnd,msg,wParam,lParam) - 按下
套用 - 最在註解那邊顯示
解碼為 <WinProc>


- 在
00401029 /. C8 000000 enter 0,0 ; 解碼為 <WinProc>點選右鍵 - 選擇
斷點->在WinProc 上的訊息斷點

- 會開啟
在 WinProc 上設定斷點視窗 - 訊息選擇
WM_COMMAND註:WM_COMMAND = $0111; 當用戶選擇一條菜單命令項或當某個控件發送一條消息給它的父窗口,一個快捷鍵被翻譯
- 可以看到分紅色為消息斷點


- 按下
Alt + B - 停用或是移除其他斷點

按下
F9好似沒什麼事情發生,但是
cycle.EXE被開啟了此時嘗試去輸入
Name,會發現無法輸入,也無法點擊按鈕此時看到右下角的堆疊視窗
原來被文本框的通知EN_SETFOUCE搞壞了!停留在EN_SETFOCUS和EN_KILLFOCUS兩個消息之間了。

- 這邊拓展消息斷點,即表示是使用條件斷點
- 在
00401029 /. C8 000000 enter 0,0 ; 解碼為 <WinProc>點選右鍵 - 選擇
斷點->條件(快捷鍵Shift + F2)

- 輸入條件
输入 MSG ==WM_COMMAND && [ESP+C]==66註:66是怎麼來的?這個就是那個Check按鈕的ID,意思就是”當收到WM_COMMAND,且是由ID為0x66發出的時候中斷”
- 按下
F9 - 發現可以輸入
Name和Serial - 輸入
Morose、12345678901234567 - 按下
Check按鈕 - 這次中斷,位置上似乎沒有變化,但是,明白了消息處理機制

總結
這篇文章我看了很多次教學文章才寫出來他想讓讀者學習的東西,但是我還是似懂非懂的,不過先知道有條件斷點這件事情,在未來要下斷點的時候可以知道如何下、在哪下。
註:以上參考了
看雪論壇 的 关于《OllyDBG 入门系列(五)-消息断点及 RUN 跟踪》的补充
