【问题标题】:Process-wide hook using SetWindowsHookEx使用 SetWindowsHookEx 的进程范围挂钩
【发布时间】:2023-03-03 05:52:21
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: windows winapi hook setwindowshookex


    【解决方案1】:

    查看post 中的代码,它有一些不错的代码,可以满足您的需求。这使用了一个全局钩子,这对你来说是最好的。

    编辑:

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

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

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

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

    【讨论】:

    • 您的示例使用全局挂钩,而这是挂钩单个进程的特定请求。
    • 由于钩子只能与特定线程或同一桌面中的所有线程相关联,您建议我们应该使用什么来监控“一个或多个外部进程”?
    • 一种方法可以枚举当前进程的所有线程并为所有这些线程设置钩子。
    • “但这真的是个好方法吗?” - 不。WH_KEYBOARD 上的全局挂钩是唯一明智的解决方案。键盘输入是有限的。与 WH_MOUSE 挂钩相比,事件计数将是最少的。注入进程的当前(和未来)线程所需的复杂性和管道将是荒谬的、容易出错且无法支持的。
    • 应尽可能避免全局挂钩,但即使您选择争论这一点,您仍然没有在这里回答问题。我们中的一些人实际上想知道如何实现一个进程范围的钩子。
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多