【发布时间】:2022-06-24 05:15:17
【问题描述】:
所以在过去的一周半时间里,我一直在编写代码,为一个程序设置 wh_shell 的钩子程序,该程序将替换注册表中的 explorer.exe 并作为主桌面程序运行。似乎只有很少的信息和资源可以在 Windows API 之外使用,这有点难以描述,也没有详细解释所有内容。出于某种原因,我无法让它工作,无论我是在 explorer.exe 中运行它,还是我替换寄存器并使其成为默认 shell。我将在这篇文章中提出一些问题,因为我认为如果你能回答其中一个问题,你可能会得到更多的答案。
首先我有一个关于钩子的问题:当我运行下面的 SetWindowsHookEx(...) 函数 -resource 时,它表示 var lpfn 如果hook 仅用于监控当前进程。现在很明显,当监视诸如 window_created 之类的事件时,这些事件是不同进程中的事件,这让我认为 hookproc 必须在 DLL 中(这是我迄今为止的编程方式)。但这对我来说是有问题的,因为当你运行 SetWindowsHookEx(...) 时,我希望监视的进程在用户决定启动它们之前还不存在。这些进程是否会在 wh_shell 事件完成时通知系统,以便我的钩子在创建时不需要放入每个进程中,还是更像是当我使用 wh_shell 运行 SetWindowsHookEx(...) 时它会放置一个钩子在创建时的所有进程中。第二个资源指出,当这些事情发生时,系统只是调用 hookproc,那么我什至需要一个 DLL,或者它需要挂接到什么进程,因为我认为它不需要挂接到所有东西。
其次,我有一个关于将我的进程设置为默认 shell 的问题 - 请参阅资源 - 资源说明任何将自己注册为默认 shell 的进程(我假设只是将注册表修改为我的进程,如果没有,并且有更多请让我知道)需要调用 SystemsParameterInfo(...) 函数。那么首先,在运行 SetWindowsHookEx(...) 之前是否需要调用这个函数,或者是否有一些预期的位置应该在我的代码中的其他地方?然后关于它没有指定的其他变量,只是好奇建议将它们设置为什么,就像它们为 explorer.exe 设置的一样,也许还有一些其他示例(包括不做的事情)。
最后为了测试,这里使用控制台对我最有帮助。控制台现在将用于输入以运行函数和命令(例如打开寄存器并将 shell 换回 explorer.exe)。如果我的 hookproc 在一个 DLL 中,我需要它来输出一些消息,我不想混淆同一个控制台,我什至不知道它是否会输出到同一个控制台,所以什么可能是推荐或潜在的输出解决方案(这也是暂时的,而且是为了测试,所以它不必是完美的,甚至是伟大的)?
另外我认为windows 11应该不是问题,但我还没有在windows 10系统上测试过……
我没有包含任何代码,因为我很确定没有它可以回答大部分内容,而且它的代码行数太少,不像典型的问题,它就像检查我的代码并帮助我,也许是一些示例代码你可以告诉我真的很有帮助。
谢谢!
SetWindowsHookEx(...)
默认外壳
测试环境:
- 在 Hyper-V 管理器中运行的 Windows 11 虚拟机
【问题讨论】:
-
"...全局挂钩过程可以在与调用线程在同一桌面的任何应用程序的上下文中调用,因此该过程必须位于单独的 DLL 模块中。... ." Hooks Overview 即您的 DLL 被注入到每个进程中,并在处理钩子时由操作系统在该进程的上下文中调用
-
SetWindowsHookEx 被其他进程使用,shell 从其他地方获取它们(未记录)。
标签: c++ windows windows-shell