上篇讲的是对程序的定时器消息下断点,如果要拦截用户消息,比如点击按钮等,则需要对消息WM_COMMAND下条件断点,下断点的位置与定时器消息相同,步骤如下:
1 首先找到CWnd::WindowProc函数,进入这个函数以后在函数OnWndMsg前下条件断点,条件为[ebp+8]==WM_COMMAND,代码如下
点击程序按钮,断下command消息,F7跟进73D31B95
与WM_TIMER消息不通,此时在73D31BE1处不会发生跳转,继续F8到call处,跟进,进入OnCommand函数中,继续F8,直到call函数_CDialog::OnCmdMsg处
跟进这个call
73D9DEA8 E8 0844F9FF call #4424_CCmdTarget::OnCmdMsg
很快发现了对_CCmdTarget::OnCmdMsg的call,继续跟进,在这个函数中会调用_AfxDispatchCmdMsg对消息进行分发,只要跟进这个函数很快就能找到消息处理函数了,继续F8寻找_AfxDispatchCmdMsg函数
73D323BA E8 7F000000 call 73D3243E
终于找到了,跟进这个call,来到函数_AfxDispatchCmdMsg内部,跟进遇见的第一个call
73D324BA 8B4D 08 mov ecx, dword ptr [ebp+8]
73D324BD FF55 14 call dword ptr [ebp+14] ; MFC42.73D4AAB0
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
73D4AAB2 - FFA0 CC000000 jmp dword ptr [eax+CC] ; 拦截按钮.004014A0
出现了程序领空了,这里不是用的call,是直接jmp过去的,跟进,消息处理函数终于出来了!哈
004014B3 . C3 retn
消息处理函数很简单,就是调用下定时器,再结合上篇寻找定时器消息相应函数的方法,这个程序的秘密已经完全被消除了,oh yeah!