如何找到MFC程序中的消息处理函数

如何找到MFC程序中的消息处理函数?

1 如果想断下特定的消息的处理函数,则首先在函数CWnd::WindowProc函数中下条件断点,因为消息经过内核到相应的处理函数的过程中必须经过这个函数,此函数的定义如下:

Code

message即为消息,在这个函数中首先调用了函数OnWndMsg对消息进行处理,这个处理过程是找到消息对应的处理函数的过程,如果未能找到相应的处理函数则调用DefWindowProc,即默认的消息处理函数对消息进行处理,因此,如果我们需要对特定的消息下断点,只要在函数OnWndMsg处设置条件断点即可,WindowProc函数的反汇编代码如下

Code

 

call    dword ptr [eax+A4]即为OnWndMsg函数的调用,函数的参数有四个,message,wParam,lParam,&lResult,分别对应73D31B92 73D31B8F 73D31B8A 73D31B89四行,因此,条件断点下在73D31B92处,例如下条件断点[ebp+8]==WM_TIMER即对定时器消息进行中断。

2 追踪用户自定义的消息处理函数

条件断点下好以后,此时已经断下了定时器消息,这个消息的处理过程是用户自定义的,如何找到它呢?

其实很简单,一路F8下去吧,如果遇到进入程序领空的call,就F7跟进,很快的。。示例如下:

Code

在第73D31BD7行,函数OnWndMsg比较当前消息是否为WM_COMMAND消息,如果是则执行73D31BE1以下的命令,如果不是则跳转到73D31BFE行,本例中拦截的是WM_TIMER,不是WM_COMMAND,所以会跳转。73D31BFE行代码如下:

73D31BFE    83FB 4E         cmp     ebx, 4E                               ; WM_NOTIFY
73D31C01    
75 23           jnz     short <WM_ACTIVATE>

同样是一个比较,此处比较的是当前消息是否为WM_NOTIFY消息,此处会跳,跳的位置是73D31C26,此行代码如下:

Code

此处也是一个比较,比较当前消息是否喂WM_ACTIVATE消息,此处跳,跳到73D31C3E处,代码如下:

73D31C3E    83FB 20         cmp     ebx, 20                               ; WM_SETCURSOR
73D31C41    
75 18           jnz     short 73D31C5B

此处比较消息是否为WM_SETCURSOR,此处跳到73D31C5B处,代码如下:

Code

值得注意的是第73D31C5F处的call进入了程序领空,F7跟进以后代码如下:

00401240   .  B8 E8224000   mov     eax, 004022E8
00401245   .  C3            retn

这显然不是消息相应函数,继续跟踪,直到遇到进入程序领空的call,在第73D31FD1行找到了一个进入程序领空的call,F7跟进,代码如下:

Code

这就是WM_TIMER消息的相应函数,可以看到,调用了MessageBoxA函数,输出一个简单的对话框,消息的追踪流程到此结束,其他类型的消息可以同样追踪完成

博客很久没更新,汗颜。。。

 

posted @ 2009-07-12 23:36  认真做人,认真做事  阅读(1860)  评论(0编辑  收藏  举报