我试图找到按钮的作用,所以我想设置一个断点以捕获按钮单击事件。有可能吗?

有任何工具或技巧可以帮助实现这一目标吗?

评论

正如Peter所说,这取决于很多事情,我通常在Olly中要做的是暂停程序,然后单击“在用户输入处停止”(或类似的操作),当您按下按钮时,该操作会中断。

#1 楼

这在很大程度上取决于他们使用什么框架进行窗口化。它可能是MFC,WPF,WinForms,WTL,QT,wxWidgets,纯Windows API。有很多框架,它们都以不同的方式处理消息的最终路由。 Windows API直接。除了最外层的窗口外,WPF都不使用Windows API窗口系统。

程序最初注册一个处理用于特定窗口的消息的函数。可以使用RegisterClass或RegisterClassEx函数来完成。负责处理发送到窗口的消息的函数是传递给这些函数的结构的lpfnWndProc成员。这称为窗口过程。

按下按钮时发生的事情是Windows将消息(在这种情况下为WM_COMMAND)推入线程消息队列。然后使用GetMessage或PeekMessage获取此消息。有些消息使用快捷方式,并且在您调用GetMessage时可能直接导致对窗口过程的调用,而某些消息仅在应用程序调用DispatchMessage时才导致对窗口过程的调用。如果要处理对话框,则将通过调用IsDialogMessage处理该消息。

既然我们已经了解了它在幕后的工作方式,那么OllyDbg实际上已经有了一个处理这类事情的助手。您可以简单地打开View-> Windows对话框项。右键单击要捕获的窗口,在其中按下按钮,选择classproc上的消息断点,从消息下拉列表中选择命令和通知,或选择WM_COMMAND消息。现在,每当您单击按钮时,您都会在窗口过程中中断该窗口注册的应用程序。您仍然需要跟踪代码,以便可以找到检查消息类型然后处理消息的代码。从现在开始,将取决于所使用的框架类型。

评论


非常感谢您的评论,我尝试了您之前所说的内容,由于某种原因,我一直无法找到应用程序的功能,因此我认为我做错了..我想我需要更加努力!谢谢!

–梅纳
2013年12月26日13:46

我可以给你的提示是,我已经习惯了窗口系统(尽管不能全部都承认)是编写一些使用该框架的东西,并使回调成为自己的内联程序集(类似于20 nops / int3s / etc),然后在调试器/反汇编器中找到该函数。您可以从那里追溯它,以查看您在真实样本中可以找到的内容。取决于您的学习方式,但可能会有所帮助。

–Fewmitz
2013年12月26日15:21

我已经使用这种学习技术来学习我所知道的大多数逆向工程技巧,但是这次我没有想到..谢谢!

–梅纳
2013年12月27日上午9:02

#2 楼

在ollydbg中打开calc.exe c:\ollydbg.exe calc.exe
Ctrl + G and type GetMessageW
F2设置一个断点,然后按F9直到断点
被破坏时按ctrl+f9运行直到返回
shift+f4到在表达式编辑框中设置条件日志断点
在表达式[esp+4]的解码值中键入select pointer to MSG structure (UNICODE)
将单选按钮暂停设置为never
将单选按钮日志表达式设置为Always
点击ok
现在查看所有已处理消息的日志窗口
调整条件断点以仅处理您要检查的情况
,例如,此条件将仅记录mouseup和wm_char消息

Breakpoints, item 1
 Address=7E41920E
 Module=USER32
 Active=Log when [[esp+4]+4] == WM_KEYDOWN || [[esp+4]+4] == WM_LBUTTONUP
 Disassembly=RETN    10


类似的结果如下所示,请注意,您可以使用特定的窗口句柄hWnd 2e048a等将每个按钮的hwnd调整为多种条件

/>
\Log data
Message
COND: 0007FEE8 WM_LBUTTONUP hw = 2E048A ("C") Keys = 0 X = 57. Y = 14.
COND: 0007FEE8 WM_LBUTTONUP hw = 10053E ("And") Keys = 0 X = 22. Y = 10.
COND: 0007FEE8 WM_LBUTTONUP hw = 200404 ("Xor") Keys = 0 X = 22. Y = 18.
COND: 0007FEE8 WM_LBUTTONUP hw = 270402 ("M+") Keys = 0 X = 22. Y = 11.
COND: 0007FEE8 WM_LBUTTONUP hw = D036A ("Sta") Keys = 0 X = 27. Y = 15.
COND: 0007FEE8 WM_LBUTTONUP hw = 1B04F0 ("x^2") Keys = 0 X = 18. Y = 17.
COND: 0007FEE8 WM_KEYDOWN hw = 1B04F0 ("x^2") Key = 35  ('5') KeyData = 60001
COND: 0007FEE8 WM_KEYDOWN hw = 4303EC (class="Edit") Key = 42  ('B') KeyData = 300001
COND: 0007FEE8 WM_KEYDOWN hw = 4303EC (class="Edit") Key = 41  ('A') KeyData = 1E0001


要在windbg中进行模拟,请将此命令放在txt文件中并运行windbg(您应该已为详细显示加载了skywing sdbgext扩展名)

bp user32!GetMessageW "pt;gc"
g
bc *
.load sdbgext
bp @eip ".if (poi(poi(esp+4)+4) == 0x202) {!hwnd poi(poi(esp+4));gc } .else {gc}"
g

windbg  -c "$$>a< ......\wtf.txt" calc

Window    00600438
Name      And
Class     Button
WndProc   00000000
Style     WS_OVERLAPPED 
ExStyle   WS_EX_NOPARENTNOTIFY WS_EX_LEFT WS_EX_LTRREADING WS_EX_RIGHTSCROLLBAR 
HInstance 01000000
ParentWnd 00490534
Id        00000056
UserData  00000000
Unicode   TRUE
ThreadId  00000df0
ProcessId 00000f68
Window    00150436
Name      Xor
Class     Button
WndProc   00000000
Style     WS_OVERLAPPED 


评论


我不知道x64dbg(开源,并且仍在开发中)是否可以做同样的事情。

–中国
15年10月28日在17:58

带有详细示例的好帖子。很有帮助。

–卷
17年8月6日在5:44

@Ciantic它可以x64dbg.com/blog/2017/07/07/messages-breakpoints-in-x64dbg.html

–康拉德
5月22日7:08