MFC程序原理与逆向
字数 1351 2025-08-20 18:17:07
MFC程序原理与逆向分析技术文档
1. MFC基础原理
1.1 Windows消息机制
Windows系统维护一个全局消息队列,驱动程序将鼠标、键盘等硬件交互设备产生的信号包装成消息数据结构。系统将这些消息放入公共消息队列,各UI程序的窗口线程从中取出自己可处理的消息进行处理。
1.2 MFC消息机制
MFC框架简化了UI开发,其消息机制本质是将SDK中的消息与指定窗口ID的控件进行绑定。这种绑定关系由全局消息映射表(AFX_MSGMAP)管理存储,通常位于.rdata资源节中。
2. MFC逆向关键数据结构
2.1 AFX_MSGMAP结构
struct AFX_MSGMAP{
AFX_MSGMAP * pBaseMessageMap; // GetMessageMap函数指针
AFX_MSGMAP_ENTRY * lpEntries; // 消息绑定项结构体数组指针
}
2.2 AFX_MSGMAP_ENTRY结构
struct AFX_MSGMAP_ENTRY{
UINT nMessage; // Windows消息类型
UINT nCode; // 控制代码或WM_NOTIFY代码
UINT nID; // 控件ID(窗口消息为0)
UINT nLastID; // 用于指定控件ID范围
UINT nSig; // 签名类型(动作)或消息指针
AFX_PMSG pfn; // 回调函数指针
}
3. 静态逆向分析技巧
3.1 定位消息映射表
- 使用ResourceHacker:从资源节中获取感兴趣的控件ID
- IDA特征码搜索:搜索特定控件ID(如1000)
- 过滤.text节:消息映射表通常位于.rdata节
3.2 分析流程
- 在IDA中搜索控件ID后,向上滑动找到窗口类的虚表函数
- 观察虚表函数后的结构体,手动修改为dword类型
- 确认AFX_MSGMAP结构布局(注意可能存在dword 0填充)
- 设置结构体便于静态分析(右键创建结构体)
- 确定消息映射关系(以全0结构结尾)
3.3 快速定位技巧
- 搜索
GetThisMessage函数,通过交叉引用定位所有窗口消息绑定 - 注意不同样本中AFX_MSGMAP和AFX_MSGMAP_ENTRY之间可能有0填充
4. 关键函数定位
4.1 初始化函数
- InitInstance函数:固定在CWinApp::Run上方,是恶意代码常见藏身之处
- 窗口逻辑类初始化:调用顺序晚于构造函数,早于窗口初始化函数
- CreateDialogIndirectParamA:窗口显示绘制模块前的绑定点
4.2 其他关键点
- DoModual函数:下方通常是窗口初始化函数
- InInitDialog函数:主窗口回调,通过CreateIndirect调用
- CWinApp::Run函数:上一个函数通常是初始化窗口函数
5. 恶意代码分析实例
5.1 Emotet样本分析
- 通过初始化函数可发现明显恶意行为
- 恶意代码可能隐藏在窗口绑定逻辑类的初始化函数中
- 可能通过加载恶意资源实现攻击
5.2 样本分析技巧
- 搜索
CWinApp::Run函数,定位初始化窗口函数 - 检查初始化函数是否加载异常资源
- 分析消息处理回调函数中的可疑逻辑
6. 完整逆向流程
- 从CWinApp对象绑定的消息函数开始分析
- 跟踪自定义主窗口类对象
- 检查继承关系(继承CWinApp的通常是用户可控代码)
- 分析主窗口类的虚表
- 检查动态初始化部分(用户定义的主窗口构造函数调用点)
7. 注意事项
- 内存布局可能因编译器优化而有所不同,需具体实例分析
- 消息映射表可能分散在不同位置
- 系统分配的窗口ID可能不会在资源工具中显示
- 不同版本的MFC框架可能有细微差异
8. 工具推荐
- ResourceHacker:提取资源信息
- IDA Pro:静态逆向分析
- 调试器:动态验证分析结果
通过以上方法和技术,可以有效地对MFC程序进行逆向分析,快速定位关键代码和潜在恶意行为。