IDA笔记--VS2008按钮事件捕捉
用到工具:
IDA Proc
C32Asm
Rescope
VS2008
LordPE
实例程序:MFCDemo.exe(附下载链接),我们目标是找到Button1对应的函数的地址处
附件包含:博客文章原文文档,文章中用到的MFCDemo程序。
下载链接:http://download.csdn.net/detail/ccnyou/5012040
1,首先,IDA载入程序,在左侧Function Name中输入 CDialog::GetMessageMap(没有输入框,只是定位到这个函数而已,其实书一部分就出来了PS,如果能找到GetThisMessageMap优选选择GetThisMessageMap),如图
2,在XREF中右键,选择“跳到交叉参考”,如图:
点进去后第一个不是我们要找的,第二个开始才是我们目标,第二个如图:
3,此处,点击IDA上面的 Structures打开结构体窗口,按键盘Insert增加一个结构体
名字使用AFX_MSGMAP_ENTRY,然后依次按D增加几个成员并一一改名,最终如图
接下来,回到刚才汇编窗口,从第一个unk_4357B8开始,按Alt+Q,将此处转为结构体变量,在弹出来的窗口选择AFX_MSGMAP_ENTRY,转化之后如图:
4,到这里,其实已经可以发现一些信息,VS2008中的AFX_MSGMAP_ENTRY结构体,对于按钮消息都是这样子的
{ WM_COMMAND, (WORD)BN_CLICKED, (WORD)IDC_BUTTON1, (WORD)IDC_BUTTON1, AfxSigCmd_v, \
(static_cast< AFX_PMSG > (&CMFCDemoDlg::OnBnClickedButton1)) },
我们用Rescope打开目标程序,打开Dialog窗口,找到目标按钮Button1,拿到按钮ID如图
这里ID = 1000 = 0x03E8,然后根据上面的信息,构造一串HEX常量
1101000000000000E8030000E8030000
其中,1101 就是 0x0111,对应WM_COMMAND, E803即是0x03E8,就是按钮ID。
将程序载入C32Asm,搜索HEX,找到一个:
右键,选择【转到对应汇编模式编辑】,拿到指令地址00436FF8,减掉基址00400000得到036FF8,将程序载入LordPE,使用位置计算器,在偏移量中输入036FF8,点击转换,得到VA=00437DF8。
4,在IDA中反汇编窗口,按G转到00437DF8,如图
这里要说明下,上面那串
dd offset ?OnBnClickedOk@CMFCDemoDlg@@QAEXXZ ; CMFCDemoDlg::OnBnClickedOk(void)
估计是由于IDA找到了调试信息,但是一般逆向过程是没有调试信息的,这里忽略它。
我们对着db 11h按Alt+Q,选择刚才的AFX_MSGMAP_ENTRY,目标出来,如图:
在没有调试信息的情况下,这里是一个函数偏移量,双击就能到达函数代码处。文章至此结束。有问题请给我留言^_^。