调用堆栈不显示消息处理程序

逆向工程 视窗 x64dbg
2021-07-10 11:30:25

单击按钮或执行任何可能生成要翻译和分派的消息后,为什么调用堆栈可能不显示消息处理程序?

假设我正在反转一个应用程序,我点击了 Ok 按钮,然后它会生成一个窗口。在生成该窗口后暂停应用程序应该在调用堆栈中显示消息处理程序,对吗?我看到一个调用堆栈,其中最后一个条目是消息循环本身(获取翻译和调度),但我没有看到回调函数。我应该尝试通过 dispatchmessage 来获取消息处理程序吗?是否有一些资源可以告诉我消息处理程序在 dispatchmessage 中的确切位置?

1个回答

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