mfc-study

​ 最近遇到一个mfc的题目,由于没接触过mfc,卡了好几天。赶紧补充一波。

0x00 啥是MFC?

​ 微软基础类库MFC用C++类包装了部分Windows API,并包含了一个应用程序框架。类被定义为很多用句柄来管理的窗口对象,另外还有预定义窗口和各种通用控件。

消息处理函数:就是监听消息,然后做出响应的函数。

0x01

参考1:小小鱼师傅的《浅谈MFC类CrackMe中消息处理函数查找方法》

https://www.cnblogs.com/h2zZhou/p/10593168.html

​ 讲的很好,就不直接copy了。

​ 主要内容就是,当我们执行某个操作的时候,程序会执行什么处理函数。而在MFC中,实现这个功能主要有两个相关的数据结构:

1
2
3
4
5
6
7
8
9
10
11
12
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)
}

​ 其中,我们想要的某个控件的消息处理函数,就存放在该结构体的pfn中(其中nID与我们的控件ID相同的AFX_MSGMAP_ENTRY中的pfn就是我们所寻找的消息响应函数)。

​ 因此,我们只需要找到以下两个信息,即可定位消息响应函数。

  1. 需要的控件ID

  2. AFX_MSGMAP

​ AFX_MSGMAP存在于.rdata段,而.rdata段一般有RTTI,虚函数表与AFX_MSGMAP,所以MSG_MAP数据结构特征相对容易分辨。

​ 例如:

image-20221204162941668

​ 这个结构的特点是前面一个函数的偏移地址,后面一个函数的偏移地址,类似这样的基本都是AFX_MSGMAP_ENTRY结构体,AFX_MSGMAP_ENTRY又是AFX_MSGMAP的组成部分。

参考2:

https://www.jianshu.com/p/6e75c5d58230

​ 上述博客说了查找消息控件函数的3种方法。

留言

2022-12-04

© 2024 wd-z711

⬆︎TOP