如何在IDA中找到MFC程序的消息处理函数

news/2025/2/25 18:58:24
比起用Win32SDK写的程序,要分析MFC应用程序要麻烦不少。在前者,只要找到注册窗口类的地方就知道其WinProc的位置。那里是程序的控制中心,只要顺藤摸瓜就可以找到你感兴趣的地方。对于用MFC写的程序,这一切都变得复杂起来了。这时,所有的消息都是通过一套复杂的机制来完成分发的。他们是通过分发数据表来找到最终函数地址的. 详细请参阅MFC的源代码。

常见的消息分发数据是由以下的宏来生成的:
ON_WM_SIZE()
ON_NOTIFY(TCN_SELCHANGE, ID_TABBOARD, OnBoardSelchange)
ON_WM_LBUTTONDBLCLK()
ON_WM_LBUTTONDOWN()
ON_WM_RBUTTONDOWN()
ON_WM_TIMER()
ON_COMMAND(ID_REDRAW_ALL, OnRedrawAll)


这里简单说一下如何找到二类消息的处理函数。一类是WM_XXX型消息,如WM_LBUTTONDOWN,另一类是WM_COMMAND型消息.

对于第一类,它的调用栈是:
CMyView::OnLButtonDown <--最终目标
CWnd::OnWndMsg <--找到这个函数就接近最终目标了
CWnd::WindowProc
AxfCallWndProc
AxfWndProc
AxfWndProcBase

以WM_LBUTTONDOWN为例

#define ON_WM_LBUTTONDOWN() /
{ WM_LBUTTONDOWN, 0, 0, 0, AfxSig_vwp, /
(AFX_PMSG)(AFX_PMSGW)(void (AFX_MSG_CALL CWnd::*)(UINT, CPoint))&OnLButtonDown },
AfxSig_vwp = 0x31

对于VC6.0 Release 版本,可搜索 C0 24 F0 83 C0 2F 48 83 F8 30 0F 87 C6 02 找到CWnd::OnWndMsg。
进入CWnd::OnWndMsg后,找到 case 0x30(IDA 中的case 0x30其实是 case 0x31)处的
call ebx
将进入你真正感兴趣的地方!

这里必须用条件断点Dword(ESP+0x0c) == 0x201, (注WM_LBUTTONDOWN == 0x201) 否则这个断点总会遇到.

找WM_COMMAND消息处理的地方

对于第二类,它的调用栈是:
CMyDoc::OnCmdXXX <--最终目标
_AxfDispatchCmdMsg <--找到这个函数就接近最终目标了
CCmdTarget::OnCmdMsg
CDocument::OnCmdMsg
CView::OnCmdMsg
CFrameWnd::OnCmdMsg
CWnd::OnCommand
CFrameWnd::OnCommand
CWnd::OnWndMsg
CWnd::WindowProc
AxfCallWndProc
AxfWndProc
AxfWndProcBase

ON_COMMAND定义如下
#define ON_COMMAND(id, memberFxn) /
{ WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSig_vv, (AFX_PMSG)&memberFxn },
其中的AfxSig_vv = 12

搜索 71 74 5C 48 48 74 53 83 E8 0A 74 46,将找到_AfxDispatchCmdMsg函数,在case 12 的地方设断点并运行,当程序需要处理OnCmdXXX的时候,控制就会跑到这里,单步进入就可以了。

http://www.niftyadmin.cn/n/4645234.html

相关文章

距离矢量路由协议通用属性

一、路由分类大多的路由协议都属于两个类别1、距离矢量&#xff08;Distance Ventor&#xff09;、2、链路状态&#xff08;Link State&#xff09;二、距离矢量路由协议因为路由是以矢量&#xff08;距离&#xff0c;方向&#xff09;的方式被通告出去的&#xff0c;其中距离是…

JSR 299 建议草案第二版已提交

昨天 Gavin King 提交了 JSR 299 &#xff08;Contexts and Dependency Injection for the Java EE platform&#xff09;的第二个建议草案 给 JCP。相比上一个建议草案&#xff0c;主要有如下四个大的修订&#xff1a; 在依赖注射注解&#xff08;annotation&#xff09;上全面…

csdn博客集

逆向 http://blog.csdn.net/pll621/article/category/138401 http://blog.csdn.net/cattom/article/category/220275

锂电池知识

一&#xff0e;锂电池保护 一般用户接触到手机锂离子电池,在外面看到的除了电池外壳,还有就是几个五金触片了,如图中"电池正极,电池负极"就是的电池正负极输出. ┏━━Fuse━━━━━┳━━━━━━━━━┫电池正极 ┃ R1 ┃ ┃ ┇ ┏┻━━┓ ┏┻┓ ┃保护IC┃…

MoveFileEx 的特殊应用

了解MoveFileEx (2012-01-18 11:01:36) 转载▼标签&#xff1a; 杂谈 分类&#xff1a; 技术文章 当dwFlags被设为MOVEFILE_DELAY_UNTIL_REBOOT时&#xff0c;函数直到系统重启后才移动文件。注意文件的移动是发生在AUTOCHK执行之后&#xff0c;在页面文件创建之前。而此时…

分析了一下360安全卫士的 HOOK(二)——架构与实现(zt)

连接&#xff1a;http://blog.csdn.net/lionzl/article/details/7738182 上一篇的分析中漏掉了三个函数&#xff0c;现补上&#xff1a; NtSetSystemInformation 024 ProcessNotify 045 //这个并非Hook,只是HookPort安装的一个Notify KeUserModeCallback 04…

分析Oracle数据库日志文件

一、如何分析即LogMiner解释从目前来看&#xff0c;分析Oracle日志的唯一方法就是使用Oracle公司提供的LogMiner来进行&#xff0c; Oracle数据库的所有更改都记录在日志中&#xff0c;但是原始的日志信息我们根本无法看懂&#xff0c;而LogMiner就是让我们看懂日志信息的工具。…

360安全卫士hookport.sys简单逆向——基础

360安全卫士hookport.sys简单逆向——基础2009年10月23日 星期五 17:09hookport.sys模块作用Hookport.sys是360安全卫士对系统进行挂钩操作的核心模块。其中主要方式对SSDT和shadowSSDT安装钩子函数。但其使用了一种较为特殊的实现方法&#xff0c;使众多常规ARK软件很难检测出…