单击按钮或执行任何可能生成要翻译和分派的消息后,为什么调用堆栈可能不显示消息处理程序?
假设我正在反转一个应用程序,我点击了 Ok 按钮,然后它会生成一个窗口。在生成该窗口后暂停应用程序应该在调用堆栈中显示消息处理程序,对吗?我看到一个调用堆栈,其中最后一个条目是消息循环本身(获取翻译和调度),但我没有看到回调函数。我应该尝试通过 dispatchmessage 来获取消息处理程序吗?是否有一些资源可以告诉我消息处理程序在 dispatchmessage 中的确切位置?
单击按钮或执行任何可能生成要翻译和分派的消息后,为什么调用堆栈可能不显示消息处理程序?
假设我正在反转一个应用程序,我点击了 Ok 按钮,然后它会生成一个窗口。在生成该窗口后暂停应用程序应该在调用堆栈中显示消息处理程序,对吗?我看到一个调用堆栈,其中最后一个条目是消息循环本身(获取翻译和调度),但我没有看到回调函数。我应该尝试通过 dispatchmessage 来获取消息处理程序吗?是否有一些资源可以告诉我消息处理程序在 dispatchmessage 中的确切位置?
LRESULT DispatchMessage(
const MSG *lpMsg
);
它只需要一个指向struct MSG的指针, 它的第一个 hwnd
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
DWORD lPrivate;
} MSG, *PMSG, *NPMSG, *LPMSG;
这个 hwnd 被验证并且适当的回调被 user32.dll 和 comctl32.dll 的内部函数调用
你可以在 x64dbg 的 handles 窗口中获取 window proc
这是在 user32.DispatchMessageW() 中的断点处暂停的 windows calc.exe 的屏幕截图
您可以通过查看堆栈log {x:[[esp+4]]}
并在句柄窗口中跟踪它来获取 hwnd 参数屏幕截图显示命令窗口中状态栏命令中的 hwnd 和句柄窗口中的窗口 proc
在 proc 上设置断点并按 f9 将使我们进入 windowproc
Address To From Size Comment
0012EFB4 770C5F9F 00631EDE 78 calc.00631EDE
0012F02C 770C4F0E 770C5F9F 5C user32._GetRealWindowOwner@4+54
0012F088 770C4F7D 770C4F0E 28 user32._DispatchClientMessage@20+4B
0012F0B0 777B702E 770C4F7D 74 user32.___fnDWORD@4+24
0012F124 770CCC70 777B702E 10 ntdll.777B702E
0012F134 00631CAC 770CCC70 D70 user32._DispatchMessageW@4+F
0012FEA4 0064219A 00631CAC 90 calc.00631CAC
0012FF34 7748ED6C 0064219A C calc.0064219A
0012FF40 777D37EB 7748ED6C 40 kernel32.7748ED6C
0012FF80 777D37BE 777D37EB 18 ntdll.777D37EB
0012FF98 00000000 777D37BE ntdll.777D37BE