1

我需要将一个 dll 注入一个或多个外部进程,我还想从中拦截键盘事件。这就是为什么使用带有 WH_KEYBOARD 的 SetWindowsHookEx 看起来是一个简单的方法来一步实现这两个目标。

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

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

我想一种方法是在我的应用程序的目标进程的主线程上设置钩子,然后在我的 dll 中对所有其他正在运行的线程执行相同的操作(加上 DLL_THREAD_ATTACH 用于稍后启动的线程)。但这真的是一个好方法吗?更重要的是,没有更简单的方法来设置进程范围的钩子吗?我的想法看起来既麻烦又丑陋,但是我无法在任何地方找到有关执行此操作的任何信息。

4

1 回答 1

3

查看这篇文章中的代码,它有一些不错的代码可以做你想做的事。这使用了一个全局钩子,在你的情况下这将是最好的。

编辑:

在回复 Ben 关于想知道如何将钩子注入特定进程以监视特定线程的评论时:

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

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

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

于 2010-06-10T19:44:28.920 回答