1.预备知识
2.MFC逆向基础概念
3. IDA逆向查找
4.mfc消息映射定位
5.虚表函数定位
6.修复创建原始结构
7.定位分析用户函数代码
[关于消息和消息队列 - Win32 apps | Microsoft Learn](https://learn.microsoft.com/zh-cn/windows/win32/winmsg/about-messages-and-message-queues)
系统维护了一个大的消息队列,由驱动讲鼠标、键盘等硬件交互设备产生的信号包装成一个个数据结构,也就是常说的消息。系统维护了一个大的公共消息队列,每当键盘鼠标产生一个硬件消息后都会讲消息塞到这个大的消息队列中。然后等待各个UI程序的每个窗口线程,从这个大消息队列中取出自己窗口可以处理的消息后拿到自己的窗口回调消息队列里处理。
相关视频教程
恶意软件开发(更新到了155节)
在开发早期没有各种UI框架的情况下,需要开发者自己注册窗口并设置窗口回调来处理自己想要的消息函数。后来微软推出MFC UI框架,可以使开发者高效的拖拽UI控件,为繁琐的UI代码设计节约了宝贵时间。但却为逆向工作者定位用户代码添加了负担。# MFC逆向基础概念
MFC的消息机制本质是将SDK中的消息与指定窗口ID的控件进行绑定。这种绑定关系由一种全局消息映射表(AFX_MSGMAP)管理存储。该映射表一般存储在.rdata资源节中,所以查找该表应该优先过滤其他节的干扰。
pBaseMessageMap参数存放GetMessageMap函数指针
struct
AFX_MSGMAP{
AFX_MSGMAP * pBaseMessageMap;
AFX_MSGMAP_ENTRY * lpEntries;
}
struct
AFX_MSGMAP_ENTRY{
UINT
nMessage;
//Windows Message
UINT
nCode;
//Control code or WM_NOTIFY code
UINT
nID;
//control ID (or 0 for windows messages)
UINT
nLastID;
//used for entries specifying a range of control id's
UINT
nSig;
//signature type(action) or pointer to message
AFX_PMSG pfn;
//routine to call (or specical value)
}
AFX_MSGMAP结构中第一个字段是一个函数指针我们一般并不关注,第二个是我们关注的消息绑定项结构体数组指针。nMessage是窗口消息、nCode是消息附加信息、nID是窗口ID、pfn就是该控件用于处理指定类型消息的回调函数。
两个结构体在IDA内存布局如下,我们在静态逆向的过程就是找到对应的消息绑定结构然后直接定位到用户代码。
# IDA逆向查找
可以优先查看ResourceHacker从资源节中获取感兴趣的控件ID。
原文始发于微信公众号(安全狗的自我修养):ida逆向实战8.MFC程序原理与消息映射逆向还原
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论