有任何工具或技巧可以帮助实现这一目标吗?
#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.exec:\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
评论
正如Peter所说,这取决于很多事情,我通常在Olly中要做的是暂停程序,然后单击“在用户输入处停止”(或类似的操作),当您按下按钮时,该操作会中断。