【问题标题】:Can I Get Notified When Some Process Starts?当某些进程开始时,我可以得到通知吗?
【发布时间】:2009-12-16 17:09:22
【问题描述】:

我需要知道foo.exe 何时启动(最好是延迟最少)。

现在,我有一个线程,它位于一个轻量循环 (~10 Hz) 中,并遍历进程树,看起来 foo.exe

这不太优雅,我想知道是否可以注册 Windows API 的某些部分,以便在任何进程启动时获得回调。

如果没有这样的设施,我当然愿意接受其他更优雅地完成这项任务的方法。

【问题讨论】:

  • 如果有人重命名 foo.exe 的副本怎么办?您真正想在这里完成什么?
  • 他们不会。这个应用程序解决了一个非常特定的问题。基本上让旧版应用程序与现代外围设备一起工作。

标签: winapi process notifications


【解决方案1】:

您可以通过Image File Execution Options 将自己注册为 foo.exe 的调试器。每当系统需要启动 foo.exe 时,它​​都会启动您的应用程序并将 foo.exe 及其参数传递给您。你必须自己开始这个过程。

注意:像往常一样,一些 words of caution 来自 Raymond Chen。

您还可以设置system-wide message hook,并且对于您的 dll 加载的每个新进程,检查它是否是您关心的您刚刚通过的进程,对于 foo.exe,您通知自己然后通过。不幸的是,这意味着您将在每个进程中注入您的代码,并且您将稍微损害系统性能。更不用说,如果您的代码中有错误,您实际上可以对所有人进行攻击。

【讨论】:

  • 酷,IFEO 看起来很有希望。至于系统辅助挂钩,我同意。这是我想到的第一件事,但认为不值得一试。我很快就会回到这个问题。
【解决方案2】:

可能的选择:

foo.exe 在你的控制之下吗?如果是,请修改源代码以发送信号。

foo.exe 不在你的控制之下吗?写一个injection DLL 并让它在加载到具有正确名称的进程时发送一个信号。

【讨论】:

  • 感谢唐的回复。有趣的是,我的应用程序本身会注入 foo.exe。 ;) 我最初考虑的是全局注入(即系统辅助),但这意味着系统会不必要地将我的 dll 加载到 all 进程中。在这种特殊情况下,静态 IAT 修补也不起作用。我在想除了使用 PsSetCreateProcessNotifyRoutine 之外必须有一种更简单的方法。
猜你喜欢
  • 1970-01-01
  • 2018-03-23
  • 2017-11-19
  • 2022-06-16
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多