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

_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就可以到了这个函数的起始位置!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值