MFC
介绍
MFC(Microsoft Foundation Classes),即微软基础类库,是微软为 Windows 平台开发者提供的一个 C++ 类库
它的核心价值在于,用 C++ 的 “类” 将复杂的 Windows API (Win32 API) 给 “包裹” 起来,让开发者能通过面向对象的方式去调用
这样做的好处是大大简化了 Windows 图形界面程序的开发工作
核心思想与架构
MFC 的精髓在于其六个相互配合的内部机制,包括我们马上会介绍的消息映射和序列化。简单来说:
程序启动机制:负责程序启动的流程,从
CWinApp派生对象到AfxWinMain主函数等窗口创建机制:管理窗口从无到有的过程,如调用
CWnd::CreateEx、注册窗口类、最终创建窗口动态创建/运行时类信息(RTTI)机制:允许程序在运行时创建对象或查询类的信息(如类名)
消息映射机制:避免虚函数开销的轻量级事件处理方式
序列化机制:实现对象持久化存储的
Serialize方法
类继承体系:MFC 的类层次结构清晰,几乎所有类都直接或间接继承自根类 CObject
实战案例
re2(MFC 逆向 + Base64)

打开程序是经典的 MFC 逆向

IDA 导入,打开字符串窗口发现大量的 Base64 编码

在 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= 处可以看到它被一个函数引用,这个函数地址附近是 sub_4011D0
同时看到注释 *char Str

进入 sub_4011D0 函数反编译代码,这个函数是一个 Base64 解码器,作用是将一个 Base64 编码的字符串解码为原始二进制数据

鼠标放在 sub_4011D0 函数的第一行指令,看谁调用了它

按 X 键,有 6 个调用点地址

先看第一个地址,双击进入,解码字符串 aW9zc67oktsiyu7 得到 密码不能为空
1 | import base64 |

进入第二个地址,将 aW9zc67oktsiyu7 字符串解密得到 密码长度不符合

进入第三个地址,解密得到 HOWMP半块西瓜皮hehe,疑似是密码
在程序中输入拿到 flag
