使用SetWindowsHookEx进行进程范围的挂钩

时间:2010-06-10 19:34:10

标签: windows winapi hook setwindowshookex

我需要将一个dll注入一个或多个外部进程,我也想从中拦截keybord事件。这就是为什么使用带有WH_KEYBOARD的SetWindowsHookEx看起来只是一步到位的简单方法。

现在我真的不想在我只对一些选定的进程感兴趣时安装一个全局钩子,但是Windows钩子似乎是全局的或者只是线程的。

我现在的问题是如何正确设置流程范围的挂钩。

我想有一种方法是从我的应用程序设置目标进程'主线程上的钩子,然后在DLL_PROCESS_ATTACH上为我所有其他正在运行的线程执行相同的操作(以及稍后启动的线程的DLL_THREAD_ATTACH) 。 但这真的是一个好方法吗?更重要的是,有没有更简单的方法来设置流程范围的钩子?我的想法看起来很麻烦而且很难看,但我无法找到任何关于在任何地方这样做的信息。

1 个答案:

答案 0 :(得分:2)

查看此post中的代码,它有一些不错的代码可以执行您想要的操作。这使用了一个全局钩子,这在你的情况下是最好的。

修改

回答Ben的评论,想知道如何将钩子注入特定进程以观察特定线程:

  • 确保您的注入流程正在使用管理权限运行。
  • 对您的注入器代码执行OpenProcess,并获取SeDebugPrivilege PRIV。
  • 使用PROCESS_CREATE_THREAD,VM_READ /在目标上使用OpenProcess WRITE privs。
  • VirtualAlloc目标进程中的一些内存,制作它 PAGE_EXECUTE_READWRITE。
  • 将挂钩DLL的路径和名称写入该内存。
  • 获取kernel32的模块句柄。
  • 在kernel32中获取LoadLibraryW的proc地址。
  • 在目标上调用CreateRemoteThread,为其指定地址 LoadLibraryW,带有你分配的hook dll字符串的地址。
  • 远程线程上的WaitForSingleObject,以便完成加载
  • 清理

不要忘记重复每个要挂钩的进程。 另外,请确保您的钩子代码为钩子进程处理线程创建/删除,因此您也可以挂钩这些线程。

如果您读到全局WH_KEYBOARD挂钩是一个坏主意,您可以开始明白为什么这种方法可能会更糟。