簡體   English   中英

單擊按鈕后WinDbg中斷

[英]WinDbg break on button click

想象一下顯示按鈕的應用程序: 好的 是否可以在按鈕收到點擊后立即中斷程序的執行並使用WinDbg查看反匯編? 我該怎么辦? 在這種情況下,源代碼不可用。

因此,您的描述非常通用,並且定義不明確,確切的研究實際上取決於您試圖扭轉的應用程序。 如果您有符號,您將有更多的時間,但這些不是必需的。

首先,一些(瑣碎的)背景:Windows通過Windows消息與應用程序通信。 應用程序將從消息隊列中獲取消息,並且幾乎總是將這些消息分派給相應的Windows過程。

那么,首先 - 你是什么意思:“按鈕收到點擊后”? 我懷疑你實際上並不關心這段代碼。 雖然您的應用程序可以有一個自定義按鈕,但您真的關心該按鈕如何處理WM_LBUTTONDOWN消息。 我將假設您的應用程序有一個Windows庫存按鈕(在user32.dll或comctl32.dll中實現),並且您不關心它。

處理WM_LBUTTONDOWN的按鈕控件的默認實現是將WM_COMMAND發送到包含該按鈕的窗口。 通常,您要調查的應用程序處理“單擊”。 現在,如果這是“確定”按鈕,它的ID將是IDOK(定義為1),當您單擊“Enter”鍵時,Windows也會向您發送相同的消息。

所以,我們現在正在尋找應用程序如何處理WM_COMMAND。 你想要找到的是Windows程序。 用Spy ++做到這一點。 打開間諜,找到包含按鈕的窗口。 您正在尋找的代碼最有可能位於該窗口的Windows過程中。 Spy ++會告訴你Window Procedure的地址。

例如,讓我們看一下記事本中“另存為”對話框的“保存”按鈕。 在我的機器上,地址是:0x73611142,它位於ComCtl32.dll中

轉到WinDbg,看一下該函數。

0:000> u 73611142
COMCTL32!MasterSubclassProc
73611142 8bff            mov     edi,edi
73611144 55              push    ebp
73611145 8bec            mov     ebp,esp
73611147 6afe            push    0FFFFFFFEh
73611149 6858126173      push    offset COMCTL32!Ordinal377+0x146 (73611258)
7361114e 68a1b06273      push    offset COMCTL32!DllGetVersion+0x336f (7362b0a1)
73611153 64a100000000    mov     eax,dword ptr fs:[00000000h]
73611159 50              push    eax

這確實是一種功能。 像所有Windows一樣,它從move edi,edi ,然后設置幀指針。

放一個斷點,擊中去,你幾乎會立即突破。 讓我們來看看:

0:000> bu 73611142
0:000> g
0:000> kb1

ChildEBP RetAddr Args to Child
0101f220 75d87443 00120c6a 00000046 00000000 COMCTL32!MasterSubclassProc

第一個參數(00120c6a)是窗口的句柄。 與Spy ++上的值相比,它應該是相同的。 第二個參數是消息。 在我的情況下,它是0x46,這是WM_WINDOWPOSCHANGING。

好吧,我不關心所有這些消息,我只想打破我關心的消息。 你關心的是WM_COMMAND,它是0X0111(winuser.h)

現在,把以下(有點復雜的命令):

0:000> bu 73611142 "j poi(esp+4)==00120c6a AND poi(esp+8)==111 AND poi(esp+''; 'gc'"
breakpoint 0 redefined

你在windows程序上設置一個斷點,只有當第一個參數(即poi(esp + 4))是你的Windows句柄,而第二個參數是111時,你告訴WinDbg才會中斷.'gc'告訴WinDBG繼續當條件不符合時執行。

現在您可以調試反匯編。 如果你有符號,你會有一個更容易的工作,但這不是必要的。 在任何情況下,請記住從符號服務器下載Microsoft精簡符號,因此如果您正在調試的代碼正在調用Windows API,則可以看到它。

就是這樣。 如果您的要求不同(不同的窗口,不同的消息等),請修改此技術。 如果您無法可靠地找到Windows過程(盡管如此,您必須遵循該代碼),請考慮在PostMessage或DispatchMessage上設置斷點。 對於重型提升倒車使用IDA,它將拆卸可執行文件,並解決各種交叉引用。

假設你有pdbs並且它們沒有剝離私有符號,那么你應該在按鈕處理程序上設置斷點,如下所示:

bp myDLL!myWindowApp::onOKBtnClicked

如果您有pdbs,那么您可以使用x搜索可能的處理程序:

x myDLL!myWindowApp::*ok*

這假設你知道或者可以猜出哪個dll和函數名稱是什么,否則你可以使用spy ++,Win Spy ++或Win Detective來獲取這些信息以獲取按鈕的句柄並截取窗口消息並從該信息設置斷點。

一旦它到達斷點,您可以使用u查看匯編代碼,如果需要,可以使用msdn指南

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM