[英]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,它將拆卸可執行文件,並解決各種交叉引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.