之前的笔记搬运
原理:
MFC框架中,使用以下三个宏实现消息映射:
1 | //cpp文件中 |
它们综合在一起的作用,就是将要映射的消息及对应的响应函数集中放在了一个静态成员数组中。因此,我们只要找到这个数组,就能定位代码,从而进行进一步的逆向分析工作。
要在整个内存块中找出一个数组来并不容易,不过好在MFC框架为了方便其自身,定义了查表的接口:
1 | virtual const AFX_MSGMAP* GetMessageMap() const; |
因此,目的变得明确,就是要调用某个窗口对象的GetMessageMap(),它隐藏着以下问题:
1)如何获取对方MFC程序的窗口对象,这涉及到注入
2)如何将GetMessageMap的返回结果传回MFC SPY程序,这涉及到进程间通信
总结:
1)获取目标MFC程序的窗口句柄
2)注入对方MFC程序的进程
3)在对方进程中定位到CWnd::FromHandlePermanent并调用,获得窗口对象
4)调用窗口对象的GetMessageMap()函数,获得消息映射表
其中注入手段很关键,因为FromHandle函数内部的工作就是查句柄与对象指针的映射表,而这个表又是以线程为单位存放的,因此线程注入(CreateRemoteThread)是不会成功的。最方便的是用API提供的挂钩函数(SetWindowsHookEx)来注入,同时还要处理好同步、进程间通信问题