Like Share Discussion Bookmark Smile

J.J. Huang   2019-07-10   OllyDBG   瀏覽次數:

OllyDBG - 第六章 | 訊息斷點及RUN追蹤的補充

這篇是在補充OllyDBG - 第五章 | 訊息斷點及RUN追蹤這篇文章中的一些疑問。

舉例:

  • 是否覺得不知道在哪下斷點?
  • 為什麼要這樣子下斷點?
  • 如何確定斷點下來後的位置就是正確的?

希望透過這篇可以更了解斷點位置的判斷以及確認。

事件處理程序WinProc

  • 事件處理函數是一個回調函數,Windows在窗口中發生需要處理的事件時,在主時間循環中調用該函數。
  • 時間處理函數可處理任何想處理的事件,其他的事件傳遞給Windows進行處理。
  • 在用戶和Windows執行某些操作時,將生成一些針對應用程序的事件和消息,所有這些消息都將進入一個隊列中,而針對一個應用程序窗口的事件和消息將從消息隊列中轉移到該窗口的私有隊列中。
  • 然後主事件循環將獲取這些消息並將它們發送給窗口的WinProc進行處理。

消息處理函數的原型是:

1
2
3
4
5
6
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle of window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);

註:WinProc根據hwnd知道消息來自哪個窗口,其中uMsg就是關鍵,它代表消息的類型,如:WM_COMMAND,WM_GETTEXT等。

註:這邊提供Windows中的全部消息.txt

分析

  • 首先這個cycle.EXE是從對話框模板資源建立模式對話框。

註:如何知道的?下面的分析就會知道了。

使用OllyDBG分析

  • 啟動OllyDBG
  • 按下快捷鍵F3
  • 選擇cycle.EXE

  • 按下Crtl + N,找到函数USER32.DialogBoxParamA

    註: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兩個消息之間了。

    註:EN_SETFOCUS

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

  • 輸入條件输入 MSG ==WM_COMMAND && [ESP+C]==66

    註:66是怎麼來的?這個就是那個Check按鈕的ID,意思就是”當收到WM_COMMAND,且是由ID為0x66發出的時候中斷”

  • 按下F9
  • 發現可以輸入NameSerial
  • 輸入Morose12345678901234567
  • 按下Check按鈕
  • 這次中斷,位置上似乎沒有變化,但是,明白了消息處理機制

總結

這篇文章我看了很多次教學文章才寫出來他想讓讀者學習的東西,但是我還是似懂非懂的,不過先知道有條件斷點這件事情,在未來要下斷點的時候可以知道如何下、在哪下。


註:以上參考了
看雪論壇关于《OllyDBG 入门系列(五)-消息断点及 RUN 跟踪》的补充