SetWindowsHookEx 函数,暂时没有深入研究

SetWindowsHookEx

https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx

      在钩子链表中安装一个应用程序定义的钩子函数,以监控系统中特定类型的事件的发生。这些事件或者是与某一个线程绑定的,或者是与调用线程所在的窗口中的所有线程绑定的。

HHOOK WINAPI SetWindowsHookEx(
  _In_ int       idHook,
  _In_ HOOKPROC  lpfn,
  _In_ HINSTANCE hMod,
  _In_ DWORD     dwThreadId
);

      idHook
      int类型,将要安装的钩子的类型。如CBT 钩子,窗口消息钩子,DEBUG 钩子等。
      lpfn
      HOOKPROC 类型,hook 函数的指针,如果dwThreadId参数为0,或者指定了一个其它进程的线程,lpfn 参数指定的函数的地址必须在一个DLL中。否则,lpfn 可以指向一个自己模块中的函数。
      hMod
      包含上面的hook 函数的模块的基地址。如果dwThreadId 指定了以线程,且该线程是自己创建的,或者lpfn 函数是当前模块实现的,hMod 必须为NULL。
      dwThreadId
      这个hook 函数将被绑定的线程的ID。对于桌面应用来说,如果这个参数为NULL,hook 函数将与调用线程绑定的桌面中的所有的线程绑定。
      返回值HHOOK
      如果函数成功,返回的是钩子的句柄,否则,返回NULL。

  • 注意
          SetWindowsHookEx 可以用来注入DLL,仅限于32-bit 程序调用 SetWindowsHookEx 注入32-bit DLL 到 32-bit 进程,或者64-bit 程序调用 SetWindowsHookEx 注入64-bit DLL 到 64-bit 进程。
          因为钩子运行在一个应用程序的上下文中,因此必须符合一个应用程序的“位数”。如果一个32-bit 的应用程序在64-bit Windows 上安装了一个全局钩子。32-bit 钩子被安装到每一个32-bit 进程中。在64-bit 进程中,线程也被标记为“被钩”。因为32-bit 应用程序必须执行这个钩子的代码,系统在调用SetWindowsHookEx 函数的线程的上下文中执行钩子。这意味着32-bit 的应用程序必须持续的抽取消息,负责可能阻碍64-bit 的应用程序正常执行。
          如果一个64-bit 的应用程序在64-bit 系统上安装一个全局钩子,钩子被注入到所有的64-bit 进程中。所有的32-bit 进程使用一个回调函数来钩应用程序。
          如果想在64-bit 的windows 上hook 所有的消息,需要分别构建32-bit 应用程序以及钩子、64-bit 应用程序以及钩子并全部安装。并且要保证两个应用程序持续的抽取消息以保证所有程序正确运行。
          调用CallNextHookEx 函数来调用钩子链表中的下一个钩子是一种责任,否则其它的应用程序的执行可能会被影响。
          在应用程序退出之前,一定要调用UnhookWindowsHookEx 函数来卸载钩子并释放系统为了使用这个钩子而构建的系统资源。
          钩子的范围与钩子的类型相关,可以参见具体的钩子的类型。
          对于一个钩子来说,首先执行的是线程钩子,之后才是全局钩子。需要注意的是,WH_MOUSE,WH_KEYBOARD,WM_JOURNAL*,WH_SHELL,和低等级的钩子是在安装钩子的线程的上下文中执行的,而不是通常的处理钩子的上下文中执行(或者说其它被hook 的进程的上下文)。对于这些钩子来说,如果一个32-bit 钩子在64-bit 钩子之前的话,32-bit 钩子和64-bit 钩子是可能同时执行的。
          

下面将介绍一个HOOK研究的实例代码

https://warroom.securestate.com/dll-injection-part-1-setwindowshookex/

      SetWindowsHookEx 的缺陷:只能hook GUI 进程,不能Hook 更高完整性级别的进程。等等吧,理解了就好

猜你喜欢

转载自blog.csdn.net/qq_18218335/article/details/78166312