使用hook 拦截消息

钩子(Hook),是Windows消息处理机制的一个平台,用用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的(我始终认为用hook去钩当前自己的进程没多大意义,去钩别的进程才比较实在)。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。

  钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。

Hook原理

  每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定的,应用程序定义的,被Hook子程调用的回调函数,也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。
  Windows 并不要求钩子子程的 卸载 顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Hook链表。如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。
  钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个 类的成员函数 ,只能定义为普通的C函数。用以监视系统或某一特定类型的事件,这些事件可以是与某一特定线程关联的,也可以是系统中所有线程的事件。
   系统钩子与线程钩子
  SetWindowsHookEx()函数的最后一个参数决定了此钩子是系统钩子还是线程钩子。
  线程钩子用于监视指定线程的事件消息。线程钩子一般在当前线程或者当前线程派生的线程内。
  系统钩子监视系统中的所有线程的事件消息。因为系统钩子会影响系统中所有的应用程序,所以钩子函数必须放在独立的动态链接库(DLL) 中。系统自动将包含“钩子回调函数”的DLL映射到受钩子函数影响的所有进程的地址空间中,即将这个DLL注入了那些进程。

       DLL的一些知识

这里需要一些DLL的知识,简单讲DLL在内存中是共享的,假设有3个进程都需要x.dll,那么在内存中x.dll只会加载一次,他的内存空间被需要它的那3个进程公用,所以,一定程度上,这个dll也就在3个进程间起到桥梁的作用。dll中有一个概念叫共享段,通俗易懂的讲:根据上面讲的多进程共享一个dll,但是他们只共享了dll的执行代码(可以理解为函数),但是并没有共享dll中的全局变量。由下图可知:


全局变量存放在可读写区,并不在共享库的内存映射区,也就是说,如果不做些手脚,那么多个进程虽说可以共享一份dll的执行代码(函数吧),但却不可共享dll的全局变量,我擦,这样的话我还怎么传递数据...

所以就用到了共享段,共享段可以把dll中的这些全局变量也整成各个进程共享的。(该部分可以在看完下面的例子后再回过头看,或许会更清晰)

     例子

下面介绍一种使用系统钩子获取其他进程数据的方法。现在假设有一个进程A,用户会在A进程的编辑框中输入字符,进程B为监视进程,使用系统钩子,B就可以知道A进程输入的是什么内容。

      

     发送消息与消息获取

我们想获取A进程的输入框的数据,那么就需要通过发送消息。SendMessage函数可以向某一线程(窗口)发送WM_GETTEXT消息,来获取该窗口的内容,该线程可以属于同一进程,也可以跨进程。但有一种情况是不行的,就是当输入框具有ES_PASSWORD风格时,且不在同一进程中时,这种方式是不行的,这是微软基于安全的考虑设计的。也就是说,问题可以分为5种情况:

1.普通编辑框,且不在同一进程,直接获取该进程的句柄,获取目标线程(窗口)的句柄,发送SendMessage(WM_GETTEXT);

2.普通编辑框,且在同一进程,擦,更简单了...

3.ES_PASSWORD风格编辑框,在同一进程,方法同1

4.ES_PASSWORD风格编辑框,不在同一进程,需要使用钩子(本文重点)

5.窗口是自绘的,除了一个主窗口外,其他的的元素,如输入框,按钮等(比如QQ),全是自绘,没有句柄,不在本文讨论范围内,需要更高级的技术

    

代码:

http://download.csdn.net/detail/zp373860147/4165858



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值