在_AfxDispatchCmdMsg下断点,在[esp+8]的位置就是ID(通过ollydbg的windows可以查看到的),[esp+16]位置就是处理函数代码的位置!
(3)为了定位到_AfxDispatchCmdMsg,我们用VS2005自己建立一个MFC对话框工程,创建一个按钮响应,在响应内部设置断点,触发断点后查看堆栈,双击> mfc80u.dll!CCmdTarget::OnCmdMsg(unsigned int nID=1, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) 行381 + 0x16 字节 C++
来到mfc80u的领空,转到反汇编,看到如下的反汇编代码(你的代码地址可能和我的不一样,请以自己的实际地址为准)
7833A4C4 FF 70 10 push dword ptr [eax+10h]
7833A4C7 8B 55 14 mov edx,dword ptr [ebp+14h]
7833A4CA FF 75 08 push dword ptr [ebp+8]
7833A4CD 8B 75 10 mov esi,dword ptr [ebp+10h]
7833A4D0 8B 40 14 mov eax,dword ptr [eax+14h]
7833A4D3 8B CF mov ecx,edi
7833A4D5 E8 F7 FD FF FF call _AfxDispatchCmdMsg (7833A2D1h)
7833A4DA EB E1 jmp $LN48+0DAh (7833A4BDh)
可以看到7833A4D5就是调用_AfxDispatchCmdMsg 的地址,向上我们可以看到
7833A498 8B 07 mov eax,dword ptr [edi]
7833A49A FF 50 30 call dword ptr [eax+30h]
7833A49D EB 15 jmp $LN48+0D1h (7833A4B4h)
这里的 call dword ptr [eax+30h] 就是调用GetMessageMap()的CALL,在这里获取到AFX_MSGMAP的地址。
方法2:(测试过,找不到这个函数,用ida也找不到)
HINSTANCE LibHandle;
MYPROC ProcAdd;
LibHandle=LoadLibrary("msadco.dll");
printf("kernel32 LibHandle=//x%x\n",LibHandle);
ProcAdd=(MYPROC)GetProcAddress(LibHandle,"CreateObject");
printf("WinExec=//x%x\n",ProcAdd);
/*
方法3:(测试通过的)
1.建立mfc程序,带onclick事件的
2.用vc调试mfc程序,在onclick事件下断点,然后反汇编,找到汇编地址
3.用ollydbg调试,在汇编地址下断点,然后查看堆栈,就看到_AfxDispatchCmdMsg的返回地址
> mfc71.dll!_AfxDispatchCmdMsg(CCmdTarget * pTarget=0x0012fe88, unsigned int nID=0x00000001, int nCode=0x00000000, void (void)* pfn=0x00401150, void * pExtra=0x00000000, unsigned int nSig=0x00000035, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) 行89 C++
0012F890 7C1746CC RETURN to MFC71.7C1746CC
0012F894 00402418 AfxDispa.00402418
0012F898 0012FE88
0012F89C /0012F8CC
0012F8A0 |7C171915 RETURN to MFC71.7C171915 from MFC71.7C1718B4
4.在返回地址之上下断点,重启
7C171910 E8 9FFFFFFF CALL MFC71.7C1718B4
7C171915 ^E9 38FFFFFF JMP MFC71.7C171852
5.在断点的堆栈上可以看到事件处理地址
0012D2AC 016E9F0C
0012D2B0 00000459
0012D2B4 00000000
0012D2B8 00411580 GamePlaz.00411580
方法4:
ollydbg可以直接在windows的api函数上下断点,但必须大小写正确如Ctrl+G 然后输入GetDlgItemTextA就可以到了这个函数的起始位置!