-
-
如何在IDA中找到MFC程序的消息处理函数
-
发表于:
2005-12-8 23:39
14713
-
比起用Win32SDK写的程序,要分析MFC应用程序要麻烦不少。在前者,只要找到注册窗口类的地方就知道其WinProc的位置。那里是程序的控制中心,只要顺藤摸瓜就可以找到你感兴趣的地方。对于用MFC写的程序,这一切都变得复杂起来了。这时,所有的消息都是通过一套复杂的机制来完成分发的。他们是通过分发数据表来找到最终函数地址的. 详细请参阅MFC的源代码。
常见的消息分发数据是由以下的宏来生成的:
ON_WM_SIZE()
ON_NOTIFY(TCN_SELCHANGE, ID_TABBOARD, OnBoardSelchange)
ON_WM_LBUTTONDBLCLK()
ON_WM_LBUTTONDOWN()
ON_WM_RBUTTONDOWN()
ON_WM_TIMER()
ON_COMMAND(ID_REDRAW_ALL, OnRedrawAll)
这里简单说一下如何找到二类消息的处理函数。一类是WM_XXX型消息,如WM_LBUTTONDOWN,另一类是WM_COMMAND型消息.
对于第一类,它的调用栈是:
CMyView::OnLButtonDown <--最终目标
CWnd::OnWndMsg <--找到这个函数就接近最终目标了
CWnd::WindowProc
AxfCallWndProc
AxfWndProc
AxfWndProcBase
以WM_LBUTTONDOWN为例
#define ON_WM_LBUTTONDOWN() \
{ WM_LBUTTONDOWN, 0, 0, 0, AfxSig_vwp, \
(AFX_PMSG)(AFX_PMSGW)(void (AFX_MSG_CALL CWnd::*)(UINT, CPoint))&OnLButtonDown },
AfxSig_vwp = 0x31
对于VC6.0 Release 版本,可搜索 C0 24 F0 83 C0 2F 48 83 F8 30 0F 87 C6 02 找到CWnd::OnWndMsg。
[注意]看雪招聘,专注安全领域的专业人才平台!