使用SetWindowsHookEx的进程范围的钩子

我需要注入一个DLL到一个或多个外部进程,从中我也想拦截keybord事件。 这就是为什么在WH_KEYBOARD中使用SetWindowsHookEx看起来像一个简单的方法来在一个步骤中实现这两个事情。

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

我现在的问题是如何正确地设置一个stream程范围的钩子。

我想一种方法是在我的应用程序中设置目标进程的主线程的钩子,然后在DLL_PROCESS_ATTACH中为所有其他正在运行的线程(在稍后启动的线程上加上DLL_THREAD_ATTACH)在DLL中执行相同的操作。 但这真的是一个好方法吗? 更重要的是,没有更简单的方法来设置全过程钩子? 我的想法看起来相当繁琐和难看,但我无法find任何有关在任何地方做这件事的信息。

看看这篇文章中的代码,它有一些体面的代码,正在做你想要的东西。 这使用全局钩子,这将是你的情况最好的。

编辑:

在回答Ben的意见时,他想知道如何在特定的过程中注入一个钩子来观察特定的线程:

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

不要忘了重复每个你想要钩住的进程。 此外,请确保您的钩子代码处理线程创建/删除挂钩进程,以便您可以挂钩这些线程以及。

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