快速查找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就可以到了这个函数的起始位置!
在_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就可以到了这个函数的起始位置!
相关文章推荐
- 如何快速的定位程序中某个功能对应的代码?
- mfc对话框程序在ide编译可运行,但编译完毕的debug和release版本不能运行。。后来发现原因是:用到的sqlite数据库文件没在对应目录下,而代码中没有try..catch..
- 如果不用MFC,直接使用API写一个Windows程序,需哪些步骤?MFC是怎么做到菜单点击后,响应对应的代码的?
- 手工编写MFC的窗口程序(不用VS自带的MFC代码)
- [转]MS-VC 使用MAP文件快速定位程序崩溃代码行(转贴)
- 在 IBM Lotus Notes 和 Domino 中编写快速查找代码
- web工程之SSM快速搭建示例程序(文末含代码附件)
- 【分享】必杀技公布——用特征码定位关键代码,秒杀MFC程序
- 查找SAP系统用户出口列表的程序代码(--SMOD)
- 查找AIX系统开启端口号对应服务程序
- AB程序核心代码(MFC从文件读取一行+MFC字符串处理+C在文件末尾追加内容)
- vc调试:使用MAP文件快速定位程序崩溃代码行-zz
- Eclipse添加快速查找Dao中方法所对应的Mybatis XML映射SQL的插件
- mfc 查找线程获取程序的线程ID,判断线程是否启动
- linux中查找java程序 cpu占用高的代码位置。
- 如何查找事务代码所在程序的用户出口(user-exit)
- 【分享】必杀技公布——用特征码定位关键代码,秒杀MFC程序
- 使用MAP文件快速定位程序崩溃代码行
- java基础代码----根据日期字符串 查找对应的周期的起始位置和结束位置
- 查找SAP系统用户出口列表的程序代码(--SMOD)