如何让任务管理器不要杀死我的程序?

时间:2009-12-31 01:47:23

标签: windows delphi process messages taskmanager

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

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

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

6 个答案:

答案 0 :(得分:14)

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

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

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

答案 1 :(得分:11)

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

如果用户不是管理员,则可以在不同的用户上下文中运行该过程(例如,从服务启动它)。

使用此Jedi Windows Security Library显示的sample非常容易设置流程ACL。

答案 2 :(得分:5)

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

答案 3 :(得分:3)

我认为你问的是一个错误的问题。

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

为什么呢?很明显,连接终止可能是由于网络问题(你无法拒绝用户从网络上拔掉机器)而不是终止客户端!

Why can't you trap TerminateProcess?

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

答案 4 :(得分:0)

最简单的方法:您可以启动 2个流程并让它们“相互”看。
如果其中一个已关闭,请让另一个程序重新启动它。它会阻止新手(如你所说)杀死这个过程。

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

答案 5 :(得分:-1)

创建一个NT服务项目,不能使用Process Manager终止服务进程,而是由内部服务管理器控制。