如何找到MFC中的消息处理函数(2)

上篇讲的是对程序的定时器消息下断点,如果要拦截用户消息,比如点击按钮等,则需要对消息WM_COMMAND下条件断点,下断点的位置与定时器消息相同,步骤如下:

1 首先找到CWnd::WindowProc函数,进入这个函数以后在函数OnWndMsg前下条件断点,条件为[ebp+8]==WM_COMMAND,代码如下

Code

点击程序按钮,断下command消息,F7跟进73D31B95

Code

与WM_TIMER消息不通,此时在73D31BE1处不会发生跳转,继续F8到call处,跟进,进入OnCommand函数中,继续F8,直到call函数_CDialog::OnCmdMsg处

Code

跟进这个call

Code

很快发现了对_CCmdTarget::OnCmdMsg的call,继续跟进,在这个函数中会调用_AfxDispatchCmdMsg对消息进行分发,只要跟进这个函数很快就能找到消息处理函数了,继续F8寻找_AfxDispatchCmdMsg函数

Code

终于找到了,跟进这个call,来到函数_AfxDispatchCmdMsg内部,跟进遇见的第一个call

73D324BA    8B4D  08          mov     ecx, dword ptr [ebp + 8 ]
73D324BD    FF55 
14          call    dword ptr [ebp + 14 ]                 ; MFC42.73D4AAB0

这是一个MFC42领空的调用,进入以后代码如下

73D4AAB0    8B01            mov     eax, dword ptr [ecx]
73D4AAB2  
-  FFA0 CC000000   jmp     dword ptr [eax + CC]                 ; 拦截按钮.004014A0

出现了程序领空了,这里不是用的call,是直接jmp过去的,跟进,消息处理函数终于出来了!哈

Code

消息处理函数很简单,就是调用下定时器,再结合上篇寻找定时器消息相应函数的方法,这个程序的秘密已经完全被消除了,oh yeah!

例程源代码

你可能感兴趣的:(mfc)