【问题标题】:How can I keep Task Manager from killing my program?如何防止任务管理器杀死我的程序?
【发布时间】:2009-12-31 01:47:23
【问题描述】:

有什么方法可以保护我的 Delphi 应用程序不被 Windows 任务管理器(或其他类似 Process Explorer)杀死?

我认为 Windows 消息可以做到这一点(通过挂钩并拦截 TerminateProcess 消息)。

我想要一个这种保护的例子。卡巴斯基反病毒套件是这样的;我们无法在任务管理器中结束他们的进程。

【问题讨论】:

  • 你有什么正当理由这样做?
  • 我建议一个替代方案:有一个显示正确关闭的状态标志,如果您在没有设置该关闭标志的情况下启动,请记录它(或更大)。然后有一个服务来监控你的进程并确保它正在运行。如果用户杀死它,只需重新启动它。这就是我们对用户可能会弄​​乱的“必须运行”的进程所做的事情。
  • 我有一个建议:请不要这样做。
  • 如果一个人想写一个病毒,然后在 StackOverflow 上寻求帮助,让它变得更糟糕怎么办。我们帮他还是不帮他?
  • 那么这不是技术问题,而是社会/教育问题。解决方案是确保用户知道这是一个他们不应该杀死的合法进程。添加类似病毒的行为只会让精明的用户更加怀疑。

标签: windows delphi process messages taskmanager


【解决方案1】:

正如 Kornel 所说,对用户隔离的进程有操作系统级别的保护。但一般来说,没有办法阻止您的进程被有权这样做的用户终止。并且用户有权终止以该用户身份运行的进程。

即使您想以 SYSTEM 身份运行它,您也无法使用此进程与已登录的用户进行交互。您需要将其作为服务运行,并且它没有 GUI。您可以尝试其他方法,例如将 DLL 加载到像 Explorer.exe 这样用户不会终止的进程中,因为他们不想这样做,但这只是滥用。

如果开发人员只能编写无法终止的应用程序,这对最终用户来说将是一个非常糟糕的情况。如果这是一个内部应用程序,您可能会检查服务器故障,看看是否有某种方法可以通过组策略实现它。

【讨论】:

    【解决方案2】:

    像 Kaspersky 这样的 AV 程序可能使用驱动程序并使用挂钩来防止终止。 在您的情况下,我建议在进程上设置 ACL,这可以防止使用任务管理器或 cmdline 工具终止(如果用户没有调试权限)。当然,用户可以随时使用 Process Explorer 之类的工具,获取进程的所有权,设置新的 ACL 并终止。

    如果用户不是管理员,则在不同的用户上下文中运行进程就足够了(例如从服务启动它)。

    使用Jedi Windows Security Library 设置进程ACL 非常简单,正如sample 所示。

    【讨论】:

    • oaky Remko,这个库让我很满意,示例中显示的它可以满足我的需求,因为我只想要一些“无法”被新手杀死的东西(使用和任务管理器!!)跨度>
    • @JoshEinstein 现在那是文明的。 +1 评论和你的答案。
    【解决方案3】:

    这是一个非常糟糕的主意。如果您的程序在其他人的计算机上运行,​​则它在他们的财产上,而不是您的财产上,并且需要在他们家中表现得像客人一样。这意味着你不会表现得好像你拥有这个地方,而且你当然不会告诉计算机所有者他不能用自己的财产做什么,例如杀死他不想运行的任务。如果你这样做了,那么你的程序并不比恶意软件好,很可能会被当作恶意软件对待。

    【讨论】:

    • -1:电脑不能是他们的财产。例如经理必须监督操作员的帮助台,尤其是当他们可以访问敏感数据时。操作系统不是关于道德,而是关于编程问题
    • @Andy:在这种情况下,管理人员可以使用适当的策略编辑工具来处理这些情况。如果您认为道德可以以某种方式与编程分开,请不要再接触编译器。我不想冒你写的东西最终会出现在我的机器上的风险。
    • 为什么不详细描述一下呢? OP 已经保证这与恶意软件无关(在 cmets 中)
    • @Andy:也许吧,但这并不能阻止其他正在尝试编写恶意软件的人找到此页面。
    • 我认为知识应该是公开的,你的想法不同。这就是为什么我建议在其他地方讨论这些事情以避免在 SO 上发火。如果您认为 OP 不值得他询问的那些非常危险的信息 - 不要给他。我希望其他人的想法不同
    【解决方案4】:

    我认为你问错了问题。

    您试图以错误的方式解决“如果连接将在与服务器聊天过程中终止”问题。答案是不是“拒绝进程终止”,而是“预见连接问题并编写错误回退代码”!

    为什么?原因很明显,连接终止可能是由于网络问题(您不能拒绝用户从网络中拔出机器)而不是客户端终止!

    Why can't you trap TerminateProcess?

    如果您担心应用程序崩溃 - 只需使用 Application Restart & Recovery API。

    【讨论】:

      【解决方案5】:

      最简单的方法:您可以只启动 2 个进程,让它们相互“看”。
      如果其中一个已关闭,则让另一个进程重新启动它。它将防止新手(如您所说)杀死该过程。

      抱歉,我认为您的“服务器/客户端应用程序”具有木马/后门能力。 “客户端应用程序发送一些有用的数据”,“无法杀死的进程”(在您的 cmets 中)对我来说似乎太可疑了。

      【讨论】:

        【解决方案6】:

        创建一个NT-service项目,服务进程不能被Process Manager杀死,而是由内部的服务管理器控制。

        【讨论】:

          猜你喜欢
          • 2011-02-16
          • 1970-01-01
          • 2012-03-17
          • 1970-01-01
          • 1970-01-01
          • 2011-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多