自制MFC消息响应定位器+原理分析
mfc里面有张消息映射表(MESSAGE_MAP),消息都是通过这张表来分发到相应函数里的。
这个是我自制的定位器,从vc6.0到现在的2013生成的mfc都可以用,全静态扫描并已处理动态基址.
下面来看MESSAGE_MAP结构:
struct AFX_MSGMAP_ENTRY
{
UINT nMessage;
UINT nCode;
UINT nID;
UINT nLastID;
UINT_PTR nSig;
AFX_PMSG pfn;
};
pfn就是指向响应的位置,每一个继承CWnd的类都会对应一组消息映射表,表总是处在.rdata段,我认为可以最后通过一张全为0的空表来判断是否结束,下面来看怎么找到这张表.
方法1
mfc消息的流程很长,随便一个button按下要经过十多个函数才能到相应位置,十多个函数指的是r3的,算上r0的还要更多,有兴趣的话你就在响应函数里下个端点然后看它栈帧.
在那么多函数里有个关键的函数OnWndMsg(),这个函数里面判断过来的是什么消息,然后进行分发。 它会调用GetMessageMap()来获得MESSAGE_MAP数组的位置,可以通过它调用时的特征定位,调用时总是call dword ptr [eax+30h],进call后只有一句话mov eax,xxx然后就retn。xxx就指向MESSAGE_MAP数组的位置。还有就是我通过实际分析时发现一个规律就是一个GetMessageMap()前后往往正是别的类的GetMessageMap()。
方法2
这个结构有三个关键的地方
1、 nMessage 消息id
2、 nID,nLastID 控件id,一般情况下这两个值是相等的
3、 pfn 已经说过了
举个button按下的例子
nMessage = WM_COMMAND
nCode = 0
nID = 1001这个id可以在资源节里找到,具体自己查pe结构
nLastID = 1001同上
nSig = 0x38这个牵扯到的东西有点多,对我们定位意义不大,先无视它
pfn = 4074F0 这个是我OnButtonXXX()的地址
通过这些特征就可以在.rdata里面查找了
作者qq1454322323
最新文章
- C#调试器导航
- java高薪之路__008_Annotation
- 使用NodeJS、GruntCLI遇到的问题
- strcat()函数常见问题
- SSIS with vertica
- ORA-12518 TNS:监听程序无法分发客户机连接 解决办法
- linux基于file的logger
- [Javascript] Intro to Recursion
- java中如何计算两个时间段的月份差
- Python前世今生
- PHP-学习之路1
- Python爬取指定重量的快递价格
- Oracle深入学习
- C# DataTable导出EXCEL后身份证、银行卡号等长数字信息显示乱码解决
- 利用Jquey.hover来实现 鼠标移入出现删除按钮,鼠标移出删除消失
- 电视不支持AirPlay镜像怎么办?苹果iPhone手机投屏三种方法
- C# 将 HTML 转换为图片或 PDF
- jmeter基础之录制篇
- 数据类型转换(计算mac地址)
- python 爬虫系列06--古诗文