【问题标题】:Detecting child processes检测子进程
【发布时间】:2010-10-14 15:34:04
【问题描述】:

有没有办法(在 C++ 和 Windows XP 中)检测一个进程是否产生任何其他进程?

例如,

system32 中的 write.exe 生成 wordpad.exe 然后消失,是否有一个函数可以告诉我该进程是否即将执行此操作?

对于那些感兴趣的人,我使用这部分 msdn 解决了这个问题:
http://msdn.microsoft.com/en-us/library/aa390425(v=VS.85).aspx

【问题讨论】:

  • 答案将是特定于 Windows 的,并且与 C++ 无关,尤其是因为 C++ 本身对这些概念一无所知。但我很好奇答案。
  • @John Dibling:你的意思是操作系统特定的吗?我相当确定您可以确定 Linux 下的“父进程”。
  • 我知道您可以检测到进程的父进程,但这不是我的问题。我想知道是否可以检测一个进程何时产生另一个进程
  • 即使是特定于 Windows 的内容也有点宽泛,因为它需要驱动程序,因此它会因 Windows 的“风格”而异。有关如何在 XP 上完成它(并且应该在较旧的 NT 上工作)的一个相当古老的示例,请参见此处:codeproject.com/KB/system/soviet_protector.aspx
  • AFAIK 没有直接的 API,但您可以随时查看进程(轮询)。检查进程父进程有点无证,而且也不可靠。为什么要这样做?

标签: c++ windows


【解决方案1】:

Win32 API 中没有任何内容。但是,它通过带有 Win32_ProcessStartTrace 查询的 WMI 得到支持。您会在this thread 的回答中找到一些演示该查询的 C# 代码。用 C++ 编写 WMI 代码相当痛苦,您可以在 MSDN 库文章中找到必须编写的样板代码的链接。

请注意,这不是特别快。我不清楚 WMI 提供程序从内核中获得了多少帮助来生成通知,但考虑到它像轮询一样嘎嘎作响的速度。换句话说,当您收到通知时,该过程可能正在顺利进行。这对于多任务操作系统的课程来说是一样的。

【讨论】:

【解决方案2】:

您可以枚举进程树,它标识正在运行的进程及其父进程。这与您想要的相反(您想要识别子进程,而不是父进程)。当然,通过在枚举时跟踪父进程 ID,您可以识别给定进程产生了哪些子进程。

为此,请调用CreateToolhelp32Snapshot,然后使用Process32FirstProcess32Next 枚举进程。枚举将填充一个包含th32ParentProcessID 成员的PROCESSENTRY32 结构。

这是一种轮询方式;可能还有另一种实际挂钩 CreateProcess 函数的方法,但我没有任何相关信息。

【讨论】:

  • 嗨,是的,我已经在程序中拥有该功能,但您的方法意味着即使可能没有产生子进程,也要遍历进程树。我宁愿这是一个基于事件的解决方案,即当一个进程调用 createprocess(或类似函数)时会发出一些东西
【解决方案3】:

我认为您需要创建一个全局挂钩 DLL,将其自身附加到每个正在运行的进程。然后,DLL 找到一个位置,其中对 CreateProcess 的函数调用映射到 kernel32 中的实际 CreateProcess,并更改表条目以将调用重定向到它自己的代码以“检测”对 CreateProcess 的调用。所有这一切都假设某些用户防火墙不会阻止您的全局挂钩执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多