MFC逆向-查找控件事件

本文最后更新于:2022-01-21 晚上

前言

最近想做一下腾讯的2016游戏安全竞赛的题目,然后第一题的是一个MFC程序,很久没有调试过MFC程序了,然后来记录一下MFC逆向中如何查找到控件事件的方法吧。

以前我遇见MFC的程序,一般都是直接用API下断的方式,比如断在弹窗,获取文本这些地方。这些方法也可以用,只是感觉没有学习到的这个方法方便。这次搜索了一下,学习了一种新的方式。(怎么以前没想着搜索学习一下呢…)

方法原理

首先我们要做MFC类的逆向,比如一些CM,都是想知道当点击按钮的时候的事件,从而来逆算法。在MFC中,程序是使用消息机制来实现操作相应的,数据结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct AFX_MSGMAP
{
const AFX_MSGMAP* (PASCAL* pfnGetBaseMap)();
const AFX_MSGMAP_ENTRY* lpEntries;
};
struct AFX_MSGMAP_ENTRY
{
UINT nMessage;
UINT nCode;
UINT nID;
UINT nLastID;
UINT_PTR nSig;
AFX_PMSG pfn;
};

其中nid就是控件的idpfn代表着处理函数,当此控件被调用时,就会调用此函数。

实际寻找

这里就直接拿腾讯的2016游戏安全竞赛题目来做示例了。

首先用Resource Hacker打开文件,此工具可以帮助我们找到控件的ID。我们现在想找的是名为注册的按钮,看到此控件的ID1003

然后使用IDA进行查找

找到rdata的数据,可以看到如下的结构

可以手动修改结构,看到此时已经修改好了结构,其中sub_401E60,就是我们想要找的当按下注册按钮时的事件处理函数。

接下来就可以开始进行分析了。

参考链接

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

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

https://blog.csdn.net/SilverMagic/article/details/40623299