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 定位消息映射表

  1. 使用ResourceHacker:从资源节中获取感兴趣的控件ID
  2. IDA特征码搜索:搜索特定控件ID(如1000)
  3. 过滤.text节:消息映射表通常位于.rdata节

3.2 分析流程

  1. 在IDA中搜索控件ID后,向上滑动找到窗口类的虚表函数
  2. 观察虚表函数后的结构体,手动修改为dword类型
  3. 确认AFX_MSGMAP结构布局(注意可能存在dword 0填充)
  4. 设置结构体便于静态分析(右键创建结构体)
  5. 确定消息映射关系(以全0结构结尾)

3.3 快速定位技巧

  1. 搜索GetThisMessage函数,通过交叉引用定位所有窗口消息绑定
  2. 注意不同样本中AFX_MSGMAP和AFX_MSGMAP_ENTRY之间可能有0填充

4. 关键函数定位

4.1 初始化函数

  1. InitInstance函数:固定在CWinApp::Run上方,是恶意代码常见藏身之处
  2. 窗口逻辑类初始化:调用顺序晚于构造函数,早于窗口初始化函数
  3. CreateDialogIndirectParamA:窗口显示绘制模块前的绑定点

4.2 其他关键点

  1. DoModual函数:下方通常是窗口初始化函数
  2. InInitDialog函数:主窗口回调,通过CreateIndirect调用
  3. CWinApp::Run函数:上一个函数通常是初始化窗口函数

5. 恶意代码分析实例

5.1 Emotet样本分析

  1. 通过初始化函数可发现明显恶意行为
  2. 恶意代码可能隐藏在窗口绑定逻辑类的初始化函数中
  3. 可能通过加载恶意资源实现攻击

5.2 样本分析技巧

  1. 搜索CWinApp::Run函数,定位初始化窗口函数
  2. 检查初始化函数是否加载异常资源
  3. 分析消息处理回调函数中的可疑逻辑

6. 完整逆向流程

  1. 从CWinApp对象绑定的消息函数开始分析
  2. 跟踪自定义主窗口类对象
  3. 检查继承关系(继承CWinApp的通常是用户可控代码)
  4. 分析主窗口类的虚表
  5. 检查动态初始化部分(用户定义的主窗口构造函数调用点)

7. 注意事项

  1. 内存布局可能因编译器优化而有所不同,需具体实例分析
  2. 消息映射表可能分散在不同位置
  3. 系统分配的窗口ID可能不会在资源工具中显示
  4. 不同版本的MFC框架可能有细微差异

8. 工具推荐

  1. ResourceHacker:提取资源信息
  2. IDA Pro:静态逆向分析
  3. 调试器:动态验证分析结果

通过以上方法和技术,可以有效地对MFC程序进行逆向分析,快速定位关键代码和潜在恶意行为。

MFC程序原理与逆向分析技术文档 1. MFC基础原理 1.1 Windows消息机制 Windows系统维护一个全局消息队列,驱动程序将鼠标、键盘等硬件交互设备产生的信号包装成消息数据结构。系统将这些消息放入公共消息队列,各UI程序的窗口线程从中取出自己可处理的消息进行处理。 1.2 MFC消息机制 MFC框架简化了UI开发,其消息机制本质是将SDK中的消息与指定窗口ID的控件进行绑定。这种绑定关系由全局消息映射表(AFX_ MSGMAP)管理存储,通常位于.rdata资源节中。 2. MFC逆向关键数据结构 2.1 AFX_ MSGMAP结构 2.2 AFX_ MSGMAP_ ENTRY结构 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程序进行逆向分析,快速定位关键代码和潜在恶意行为。