1 MFC框架结构
MFC库(微软基础类库(Microsoft Foundation Class))是开发Windows应用程序的C++接口,是微软公司提供的一个类库。MFC提供了面向对象的框架,采用面向对象技术,将大部分的Windows API 封装到C++类中,以类成员函数的形式提供给程序开发人员调用。
框架包含了更很多东西,如多种不同的库,资源等。库包含了类、对象和方法等供程序员直接使用。
1.1 层次结构图类别
1.2 MFC 类CObject
1.3 MFC 类CCmdTarget
1.4 MFC 类CObject
1.1 基本流程
窗口创建
- 设计窗口类
- 注册窗口类
- 创建窗口
- 显示和更新窗口
消息处理
- 消息获取
- 消息处理
1.2 Winmain函数
WinMain实际上是调用AfxWinMain实现的:
- InitApplication() 完成内存管理方面的工作
- InitInstance() 此函数是虚函数,调用派生类的InitInstance函数,完成窗口类的创建,注册,更新等操作。
- 窗口类的注册是由AfxEndDeferRegisterClass完成。如果该窗口类已经注册,则直接返回一个真值;如果尚未注册,就调用RegisterClass函数注册该窗口类。其中,函数PreCreateWindow是为程序员修改窗口类参数准备的。其参数是CREATESTRUCT的引用,如果其值发生了变化,在调用CreateWindowEx函数时,其参数会发生相应的改变。
- 在MFC中,窗口的创建功能由Cwnd类的CreateEx函数实现(从父类继承来的,调用CWnd::CreateEx())。
- Run() 完成消息循环
1.3 消息处理和映射
消息映射
消息映射是一个结构数组,其中每个结构代表了某个窗口消息的特征,这种结构称为AFX_MSGMAP_ENTRY,
struct AFX_MSGMAP_ENTRY
{
UNIT nMessage; //窗口消息
UNIT nCode; //控制代码或WM_NOTIFY代码
int NID; // 控件ID
UNIT nLastID; //最后一个控件
UNIT NSIG; //函数原型
AFX_PMSG PFN; //消息处理函数
};
每个发送nMessage窗口消息时,将调用存储在PFN中的函数发送窗口消息。
实际上,按钮,菜单,菜单的资源ID,listview或任何生成的消息必须在nID~nLastID之间。
nSig在这里并不重要
一旦找到MessageMap,就有了一个完整的功能布局,会知道将在什么样的窗口消息和资源ID上被调用。
MessageMap如何创建的?
MFC 框架如何处理消息和命令?
如何将这些消息和命令与其处理程序函数相关联?
消息映射表: MFC使用一种消息映射机制来处理消息,在应用程序框架中的表现就是一个消息与消息处理函数一一对应的消息映射表,以及消息处理函数的声明和实现等代码。当窗口接收到消息时,会到消息映射表中查找该消息对应的消息处理函数,然后由消息处理函数进行相应的处理。
1.4 文档/视图体系结构
- 依靠文档保存应用程序的数据
- 依靠视图对象控制视图中显示的数据
2 MFC逆向
2.1 静态分析
静态解析:将MFC和Visual C的签名添加到IDA 中
参考文章:https://blog.csdn.net/SilverMagic/article/details/40622413、https://blog.csdn.net/SilverMagic/article/details/40623299
struct AFX_MSGMAP_ENTRY { UINT nMessage; // Window Message UINT nCode; // Control Code or WM_NOTIFY code UINT nID; // control ID UINT nLastID; // last control ID UINT nSig; // Function Prototype AFX_PMSG pfn; // Message Handler function };