190326 逆向-MFC逆向技巧

MFC

简介

微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。
–百度百科

虽然由于实际应用中MFC似乎即将被淘汰,(据说微软放弃更新十几年,但从版本号和种种迹象来看似乎是还在不断更新的,VS2015中的MFC已经更新到了14.0版本),但偶尔还是会出现这一类的GUI的
而且由于相对于原生WindowsGUI程序的主函数被直接作为参数来说,MFC将各个触发函数放置在消息映射表里,所以相对有一些难度 因此CTF中有时会出现MFC类的题目、也需要做一些知识储备

基本机制

MFC的思想是所有类继承自基类CObject,每个类都拥有一个消息映射表和各自的成员
通常开发者自定义的窗口是继承自CDialog的,整个继承链为

MyDialog->CDialog->CWnd->CCmdTarget->CObject

当遇到消息时,会从本类的消息映射表中匹配处理对应消息的函数,如果没有找到则去父类的消息映射表中寻找,以此类推
如果直到CObject类的消息映射表寻找完都没有函数处理消息,则将消息放入默认处理函数中处理(与Windows32API的思想一致)

消息映射表是如下结构

struct AFX_MSGMAP
{
  const AFX_MSGMAP *(__stdcall *pfnGetBaseMap)();
  const AFX_MSGMAP_ENTRY *lpEntries;
};

第一个成员指向其父类的AFX_MSGMAP,从而实现路由
第二个成员指向的是本类的消息映射表数组,即如下结构

struct AFX_MSGMAP_ENTRY
{
	UINT nMessage;
	UINT nCode;
	UINT nID;
	UINT nLastID;
	UINT_PTR nSig;
	void (*pfn)(void);
};

其中nMessage表示消息号,nID表示触发消息的控件ID,最后一个成员就是消息处理函数了

逆向技巧

  • 字符串搜索
    通过消息处理函数中的字符串来寻找切入点
  • API下断
    通过消息处理函数中的API,例如MessageBox、GetWindowText等来寻找切入点
  • 资源节内获取控件ID后通过RTTI寻找消息映射表
    RTTI是MFC中用来识别对象所属类的机制,这个机制中要求类名以字符串形式存储,这就给了我们找到CDialog类的机会。然后通过AFX_MSG_MAP的交叉引用可以找到子类的消息映射表,再通过资源节内查找到的控件ID来锁定消息映射条目
  • 使用xspy、spy++等工具
    xspy是一个通过注入dll到目标进程,然后利用MFC特性来获取相关数据的自动化工具,非常方便

你可能感兴趣的:(CrackMe)