静态获取MFC的MESSAGE_MAP表
2015-9-19 00:9:0 Author: guage.cool(查看原文) 阅读量:15 收藏

调试MFC程序的时候,每次都要去找MESSAGE_MAP里的处理函数

MESSAGE_MAP的定义

1
2
3
4
5
6
7
BEGIN_MESSAGE_MAP(CMFChelloDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDOK, &CMFChelloDlg::OnBnClickedOk)
ON_WM_DROPFILES()
END_MESSAGE_MAP()

AFX_MSGMAP_ENTRY结构

实际上每个BEGIN_MESSAGE都是一个AFX_MSGMAP_ENTRY结构

1
2
3
4
5
6
7
8
9
struct AFX_MSGMAP_ENTRY
{
UINT nMessage;
UINT nCode;
UINT nID;
UINT nLastID;
UINT_PTR nSig;
AFX_PMSG pfn;
};

处理函数pfn

pfn即对应MESSAGE的处理函数

通过观察AFX_MSGMAP_ENTRY结构,其有以下特征

  • nMessage在{0,1024}的范围内
  • nCode似乎一直都是0
  • nSig是对pfn函数参数的sign,不同版本MFC也不同,范围大概在{0,100}
  • pfn肯定要位于代码段
  • AFX_MSGMAP_ENTRY肯定位于rdata段

通过以上限定即可找到所有处理函数pfn

pic

代码地址

https://github.com/howmp/MFCFinder


文章来源: https://guage.cool/mfc-map/
如有侵权请联系:admin#unsafe.sh