您的位置:首页 > 编程语言

快速查找mfc按键对应的程序代码

2015-04-16 20:53 239 查看
_AfxDispatchCmdMsg(this, nID, nCode,lpEntry->pfn, pExtra,lpEntry->nSig, pHandlerInfo);

在_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就可以到了这个函数的起始位置!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐