mfc里面有张消息映射表(MESSAGE_MAP),消息都是通过这张表来分发到相应函数里的。

这个是我自制的定位器,从vc6.0到现在的2013生成的mfc都可以用,全静态扫描并已处理动态基址.

下面来看MESSAGE_MAP结构:

struct AFX_MSGMAP_ENTRY
{
        UINT nMessage;   
        UINT nCode;         
        UINT nID;             
        UINT nLastID;       
        UINT_PTR nSig;   
        AFX_PMSG pfn;   
};

pfn就是指向响应的位置,每一个继承CWnd的类都会对应一组消息映射表,表总是处在.rdata段,我认为可以最后通过一张全为0的空表来判断是否结束,下面来看怎么找到这张表.

方法1

mfc消息的流程很长,随便一个button按下要经过十多个函数才能到相应位置,十多个函数指的是r3的,算上r0的还要更多,有兴趣的话你就在响应函数里下个端点然后看它栈帧.

在那么多函数里有个关键的函数OnWndMsg(),这个函数里面判断过来的是什么消息,然后进行分发。 它会调用GetMessageMap()来获得MESSAGE_MAP数组的位置,可以通过它调用时的特征定位,调用时总是call   dword ptr [eax+30h],进call后只有一句话mov eax,xxx然后就retn。xxx就指向MESSAGE_MAP数组的位置。还有就是我通过实际分析时发现一个规律就是一个GetMessageMap()前后往往正是别的类的GetMessageMap()。

方法2

这个结构有三个关键的地方

1、 nMessage        消息id

2、 nID,nLastID   控件id,一般情况下这两个值是相等的

3、 pfn                    已经说过了

举个button按下的例子

nMessage = WM_COMMAND

nCode = 0

nID = 1001这个id可以在资源节里找到,具体自己查pe结构

nLastID = 1001同上

nSig = 0x38这个牵扯到的东西有点多,对我们定位意义不大,先无视它

pfn = 4074F0 这个是我OnButtonXXX()的地址

通过这些特征就可以在.rdata里面查找了

作者qq1454322323

最新文章

  1. C#调试器导航
  2. java高薪之路__008_Annotation
  3. 使用NodeJS、GruntCLI遇到的问题
  4. strcat()函数常见问题
  5. SSIS with vertica
  6. ORA-12518 TNS:监听程序无法分发客户机连接 解决办法
  7. linux基于file的logger
  8. [Javascript] Intro to Recursion
  9. java中如何计算两个时间段的月份差
  10. Python前世今生
  11. PHP-学习之路1
  12. Python爬取指定重量的快递价格
  13. Oracle深入学习
  14. C# DataTable导出EXCEL后身份证、银行卡号等长数字信息显示乱码解决
  15. 利用Jquey.hover来实现 鼠标移入出现删除按钮,鼠标移出删除消失
  16. 电视不支持AirPlay镜像怎么办?苹果iPhone手机投屏三种方法
  17. C# 将 HTML 转换为图片或 PDF
  18. jmeter基础之录制篇
  19. 数据类型转换(计算mac地址)
  20. python 爬虫系列06--古诗文

热门文章

  1. ased
  2. Flex 监听浏览器关闭
  3. 转:仿QQ长按弹出功能菜单
  4. 转载list
  5. Bash条件判断
  6. Java后台判断请求来自PC端还是移动端
  7. SQLServer count函数、cross apply和outer apply、
  8. SQL:over partition by与group by 的区别
  9. IIS7下使用4.0框架集成模式URLRewriter重写中文URL乱码问题
  10. 为Asp.net WebApi 添加跨域支持