使用hook 拦截消息

原创 2012年03月23日 11:07:13
钩子(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



HOOK钩子机制学习笔记

HOOK钩子机制学习笔记(1) 收藏  一、什么是钩子(hook)     Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。钩子(hook)是一种特殊的消息...
  • AstrayLinux
  • AstrayLinux
  • 2012年11月25日 20:22
  • 11032

DDE client

  • 2012年02月19日 21:51
  • 2KB
  • 下载

Hook : KeUserModeCallback用法详解

ring0调用ring3早已不是什么新鲜事,除了APC,我们知道还有KeUserModeCallback.其原型如下: 代码: NTSTATUS KeUserModeCallback ( ...
  • zhou191954
  • zhou191954
  • 2013年09月30日 01:04
  • 1027

windows中使用钩子拦截消息

一、前 言 众所周知,Windows程式的运行是依靠发生的事件来驱动。换句话说,程式不断等待一个消息的发生,然后对这个消息的类型进行判断,再做适当的处理。处理完此次消息后又回到等待状态。从上面对...
  • zi_wu_xian
  • zi_wu_xian
  • 2013年04月25日 22:21
  • 3335

Hook 简单的实例--拦截鼠标和键盘消息(一)

Hook(钩子)就是对Windows系统的一些消息或是API函数进行拦截和监控的处理平台,让可以根据程序员的设置获取其感兴趣的信息。 这里主要是介绍一下Hook拦截鼠标消息和键盘消息。 下面是CALL...
  • u013147600
  • u013147600
  • 2015年05月06日 15:05
  • 4478

拦截聊天记录--Hook技巧简介【原创】

一、    战场环境 [兵工场]:VC6.0 [兵器谱]: Detours Express 2.1、Windbg6.11、OllyDBG 二、    战术分析 Hook从字面上...
  • liujiayu2
  • liujiayu2
  • 2016年02月02日 18:40
  • 1183

Hook 简单的实例--拦截鼠标和键盘消息(一)

Hook(钩子)就是对Windows系统的一些消息或是API函数进行拦截和监控的处理平台,让可以根据程序员的设置获取其感兴趣的信息。 这里主要是介绍一下Hook拦截鼠标消息和键盘消息。 下面是CALL...
  • u013147600
  • u013147600
  • 2015年05月06日 15:05
  • 4478

金山词霸抓词机理 -- HOOK消息功能的使用

内容提要 Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完...
  • xuqiang918
  • xuqiang918
  • 2013年02月19日 17:24
  • 570

hook 自定义消息 (delphi 7)

  • 2013年09月15日 19:50
  • 200KB
  • 下载

获取HOOK捕获的消息

  • 2009年09月26日 20:44
  • 1.3MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用hook 拦截消息
举报原因:
原因补充:

(最多只允许输入30个字)