5min學會WinDBG條件斷點

2021-09-19 11:13:01 字數 2757 閱讀 9146

很多時候我們可以使用spy++檢視某個視窗的訊息,但是有一定的侷限性。

以編輯控制項為例,我們開啟spy++截獲應用程式的em_gettextrange訊息,卻只能看到textrange結構的指標值,看不到結構的內容。

如果想要詳細檢視訊息的wparam和lparam引數,spy++是無能為力的。

但是可以通過windbg的條件斷點卻可以輕鬆實現。

我們先從最簡單的windbg斷點開始,將斷點打在user32!sendmessage函式上,就可以看到應用程式傳遞了什麼引數。

首先,設定符號路徑(假設放在本地的目錄e:\symbols):

srv*e:\symbols*
然後,將windbg偵錯程式附加到目標程序並且中斷程式。

接著,就可以打斷點了。

bp user32!sendmessagew

bp user32!sendmessagea

打完斷點之後,繼續執行程式。

g
觸發應用程式傳送windows訊息,例如可以將滑鼠移動到程式客戶區將傳送wm_mousemove訊息。輸入以下命令,可以看到函式呼叫堆疊和傳入的引數。

kvn

dd esp

整體效果如下圖所示:

可以看到 'kvn' 命令輸出的 '00'行,第二個值 '0a09c81'是函式返回位址,第三個值開始就是函式引數。結合sendmessage的定義可以知道『0022065c』為視窗控制代碼,『00000229』為訊息值。

根據'dd esp'輸出結果,可以看到,esp+4開始從左到右依次就是sendmessage的4個引數

現在萬事具備,如何加上條件呢?

我們先來最簡單的。在斷點命中時,輸出一句'hello sendmessage'

重新定義斷點:

bp user32!sendmessagew " .printf \"hello sendmessage\t\" "
這樣定義斷點的意義就是,斷點命中時,執行後面的windbg指令碼。怎麼樣?是不是超簡單。

執行程式:

g
觸發應用程式傳送windows訊息之後,可以得到以下結果:

可以看到,確實輸出了'hello sendmessage』,並且執行中斷在了'user32!sendmessagew'。

接著,我們來嘗試篩選訊息em_gettextrange。由2可以,esp+4就是視窗控制代碼,esp+8就是訊息值。

重新定義斷點:

bp user32!sendmessagew ".if(poi(esp+8) == 0x44b)  .else "
指令碼的意義是,執行乙個if-else語句。當訊息值為em_gettextrange時,列印文字,否則從斷點繼續執行。具體來講,poi的含義跟c/c++的解引用是類似的。

執行程式:

g
觸發應用程式傳送em_gettextrange訊息,可得到結果如下:

可以看到,指定的文字確實輸出了,程式也中斷了。說明應用程式確實傳送了em_gettextrange訊息。那麼怎麼檢視這條訊息的引數呢?

如果想要更複雜的功能,我們通常就會使用指令碼檔案來達到這個目的了,誰也不想在一行上寫完所有**邏輯。windbg裡也是支援這種功能的,我們可以指定命中斷點時,執行指定的指令碼檔案。

bp user32!sendmessagew "$$>< d:\script.txt"
再次繼續執行程式

g
觸發應用程式傳送em_gettextrange後,可以得到如下執行結果:

可以看到,我們輸出了更多的資訊,把 em_gettextrange的lparam引數指向的textrange結構都列印出來了。下面給出指令碼。

$$ put messageid into presudo register t0

r $t0 = poi(esp + 8)

$$ put pointer to textrange structure into presudo register t1

r $t1 = poi(esp + 0x10)

.if($t0 == 0x44b) .else

其中:

'$$'開始的行是注釋

r $t0 = poi(esp + 8)則是定義了偽暫存器

當我們得到指定訊息時,先列印引數情況,然後呼叫gu命令讓sendmessagew繼續執行後返回,這樣我們就可以得到正確的結果。就儲存在textrange結構的lpstrtext裡。

怎麼樣,是不是非常簡單。5min立馬就學會了windbg條件斷點。

每日5min分享 跳槽

跳槽目的 增加薪水,技能提公升,擴大人脈,所謂跟著一群牛人混,怎麼也就有了小牛的潛質。總體不違背自己的職業規劃即可。跳槽時機 金三銀四 每年的3,4月份都是各公司的洗牌高峰?跳槽方式 網上海投 內推 boss直聘 跳槽準備 測試開發 功能測試用例設計編寫方法,程式設計能力,linux,sql,htt...

5分鐘學會 CSS Grid 布局

這是一篇快速介紹 未來布局的文章。css grid 布局 grid 布局是 設計的基礎,css grid 是建立網格布局最強大和最簡單的工具。css grid 今年也獲得了主流瀏覽器 safari,chrome,firefox,edge 的原生支援,所以我相信所有的前端開發人員都必須在不久的將來學習...

5分鐘學會mybatis 批量更新

點滴記載,點滴進步,願自己更上一層樓。上節 了批量新增資料,這節 批量更新資料兩種寫法的效率問題。實現方式有兩種,一種用for迴圈通過迴圈傳過來的引數集合,迴圈出n條sql,另一種 用mysql的case when 條件判斷變相的進行批量更新 下面進行實現。注意第一種方法要想成功,需要在db鏈結ur...