【问题标题】:Monitor process start in the system监控系统中的进程启动
【发布时间】:2010-09-22 13:24:50
【问题描述】:

有没有办法在启动之前监控系统中启动的进程?

示例:
在 ZoneAlarm 或防病毒程序等程序上,当您运行程序时,它会在运行之前询问您是否允许运行该程序...

【问题讨论】:

    标签: c# .net c++ winapi


    【解决方案1】:

    有几种方法可以做到这一点。如果您只需要跟踪来自特定程序(或几个程序)的进程创建,这里提到的 EasyHook/Detours 方法将工作得很好,但您实际上需要在 CreateProcess 上安装一个钩子到每个程序中,所以它不是如果您想跟踪系统中的所有进程创建,这是一个很好的解决方案。

    在基于 NT 的 Windows 变体 (NT/2000/XP/Vista) 中有一个特定的 API,称为 PsSetCreateProcessNotifyRoutine()。不幸的是,您只能从 ring0 调用此函数,因此需要在驱动程序中完成。这篇 CodeProject 文章中有一个方便的解释(和代码):http://www.codeproject.com/KB/threads/procmon.aspx

    AFAIK,这只是一个通知,它本身并不允许您告诉系统是否应该创建进程。但是,如果您需要这样做,您可以暂停进程(例如,通过将其作为调试器附加),同时您的代码决定是否终止它。

    【讨论】:

      【解决方案2】:

      您应该查看easyhook-continuing-detours 项目,它是Microsoft Detours 项目的.NET 端口。它将允许您挂钩非托管 API(例如 CreateProcess)。查看类似 FileMon 的简单程序的代码示例here

      【讨论】:

      • 请不要在生产代码中这样做,它在 x64 上不起作用,而且很可能会造成混乱
      • @Paul:为什么会造成混乱?
      【解决方案3】:

      您可以通过使用实时 ETW 消费者了解进程何时启动 - 但是,为了能够采取一些可能取消进程启动的操作,您必须这样做一些可疑/未记录的内容,例如挂钩 CreateProcess,或使用内核过滤器驱动程序阻止对 EXE 的读取。

      【讨论】:

        【解决方案4】:

        只需使用进程创建通知。 它包含在 Windows 中。 你不需要挂钩任何东西。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-21
          • 1970-01-01
          相关资源
          最近更新 更多