自制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

时间: 2024-12-14 18:47:11

自制MFC消息响应定位器+原理分析的相关文章

MFC消息响应机制分析

---- 摘要: ---- MFC是Windows下程序设计的最流行的一个类库,但是该类库比较庞杂,尤其是它的消息映射机制,更是涉及到很多低层的东西,我们在这里,对它的整个消息映射机制进行了系统的分析,可以帮助程序开发人员对MFC的消息映射机制有一个比较透彻的了解. ---- 关键词:面向对象 消息映射 MFC 程序设计 一.引言---- VC++的MFC类库实际上是Windows下C++编程的一套最为流行的类库.MFC的框架结构大大方便了程序员的编程工作,但是为了更加有效.灵活的使用MFC编程

MFC消息映射的原理:笔记

多态的实现机制有两种,一是通过查找绝对位置表,二是查找名称表:两者各有优缺点,那么为什么mfc的消息映射采用了第二种方法,而不是c++使用的第一种呢?因为在mfc的gui类库是一个庞大的继承体系,而里面的每个类有很多成员函数(只说消息反映相关的成员函数啊),而且在派生类中,需要改写的也比较少(我用来做练习的程序就是那么一两个,呵呵).那么用c++的虚函数的实现机制会导致什么问题呢?就是大量虚表的建立使得空间浪费掉很多. 嗯-怎么办呢?于是各大c++名库(比如QT,MFC,VCL-)在消息映射的实

MFC消息响应机制 q

MFC消息响应机制分析 1 引言微软公司提供的MFC基本类库(Microsoft Foundation Classes),是进行可视化编程时使用最为流行的一个类 库.MFC封装了大部分Windows API函数和Windows控件,使得程序的开发变得简单,极大的缩短了程序的开发 周期.MFC独创的Document/View框架结构,能够将管理数据的代码和显示数据的程序代码分开,并且设计了 一套方便的消息映射和命令传递机制,方便程序员的开发使用.其中消息映射机制本身比较庞大和复杂,对 它的分析和了

vue的响应式原理分析

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8" /> 5 <meta name="viewport" content="width=device-width, initial-scale=1"> 6 <title></title> 7 </head> 8 <body>

ActiveMQ(2)---ActiveMQ原理分析之消息发送

持久化消息和非持久化消息的发送策略 消息同步发送和异步发送 ActiveMQ支持同步.异步两种发送模式将消息发送到broker上.同步发送过程中,发送者发送一条消息会阻塞直到broker反馈一个确认消息,表示消息已经被broker处理.这个机制提供了消息的安全性保障,但是由于是阻塞的操作,会影响到客户端消息发送的性能 异步发送的过程中,发送者不需要等待broker提供反馈,所以性能相对较高.但是可能会出现消息丢失的情况.所以使用异步发送的前提是在某些情况下允许出现数据丢失的情况. 默认情况下,非

MFC中消息响应机制

由于视类窗口始终覆盖在框架类窗口之上,因此所有操作,包括鼠标单击.鼠标移动等操作都只能由视类窗口捕获.一个MFC消息响应函数在程序中有三处相关信息:函数原型.函数实现和以及用来关联消息和消息响应函数的宏. (1)在消息响应函数的原型代码中,函数声明的前部有一个afx_msg限定符,也是一个宏,该宏表明这个函数是一个消息响应函数的声明. (2)消息映射宏:在视图类的源文件中,BEGIN_MESSAGE_MAP()和 END_MASSAGE_MAP()这两个宏之间定义了消息映射表,例如对于画线,其中

MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应

MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文:  http://blog.csdn.net/supermanking/article/details/5866213 二.在对话框中创建视图(我这里创建的是一个滚动视图): 见博文: http://blog.csdn.net/clever101/article/details/4873994 http://blog.csdn.net/clever101/article/details/37790

MFC窗口的消息响应顺序

最开始的消息传递 1.AfxWndProc() 该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc() 该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数 3.WindowProc() 该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数 4.OnWndMsg() 该函数的功能首先按字节对消息进行排序,对于WM_COM

MFC动态创建控件及添加消息响应

MFC动态创建控件及添加消息响应 分类: 控件技术2013-01-24 14:12 7020人阅读 评论(0) 收藏 举报 转载地址:http://blog.csdn.net/luy3728000/article/details/8193918 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放