单击按钮后WinDbg中断

时间:2013-01-17 16:44:57

标签: windows debugging windbg

想象一下显示按钮的应用程序:确定。是否可以在按钮收到点击后立即中断程序的执行并使用WinDbg查看反汇编?我该怎么办?在这种情况下,源代码不可用。

2 个答案:

答案 0 :(得分:6)

因此,您的描述非常通用,并且定义不明确,确切的研究实际上取决于您要反转的应用程序。如果你有符号,你会有更多的时间,但这些都不是必需的。

首先,一些(琐碎的)背景: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,它将拆解可执行文件,并解决各种交叉引用。

答案 1 :(得分:2)

假设你有pdbs并且它们没有剥离私有符号,那么你应该在按钮处理程序上设置断点,如下所示:

bp myDLL!myWindowApp::onOKBtnClicked

如果您有pdbs,那么您可以使用x:

搜索可能的处理程序
x myDLL!myWindowApp::*ok*

这假设你知道或者可以猜出哪个dll和函数名是什么,否则你可以使用spy ++,Win Spy ++或Win Detective来获取这些信息来获取按钮的句柄并截取窗口消息并从中获取信息设置断点。

一旦遇到断点,您可以使用u查看汇编代码,如果需要,可以msdn guide