如何防止任务管理器关闭我的程序?

10

有没有办法保护我的 Delphi 应用程序免受 Windows 任务管理器(或其他类似的工具,如 Process Explorer)的结束?

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

我想要一个此保护的例子。卡巴斯基杀毒软件就是这样的,我们无法在任务管理器中结束它们的进程。


14
你这样做的正当理由是什么? - Loren Pechtel
1
我建议一个替代方案:设置一个状态标志,显示适当的关闭状态。如果在没有设置该关闭标志的情况下启动,则记录日志(或更大)。然后有一个服务来监控您的进程并确保它正在运行。如果用户终止它,只需重新启动即可。这就是我们处理“必须运行”的进程时所做的。用户可能会对其进行干扰。 - mj2008
9
我有一个建议:请不要这样做。 - Leonardo Herrera
2
如果有人想编写一个病毒,并上StackOverflow寻求帮助使其更加恶劣,我们是否应该帮助他? - Warren P
5
那么这不是一个技术问题,而是一个社会/教育问题。解决方法是确保用户知道这是一个合法的过程,他们不应该去关闭它。加入类似病毒的行为只会让精明的用户更加怀疑。 - Mason Wheeler
显示剩余2条评论
6个回答

14

正如Kornel所说,存在着以用户为界限隔离进程的操作系统级别的保护。但一般而言,没有办法阻止有权限的用户终止您的进程。而且,一个用户有权限终止正在以该用户身份运行的进程。

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

如果开发人员可以编写无法终止的应用程序,那么对最终用户来说将是非常糟糕的情况。如果这是内部应用程序,您可以在Server Fault上查看是否有通过组策略实现的方法。


11

像卡巴斯基这样的杀毒软件可能会使用驱动程序和挂钩来防止被终止。

在您的情况下,我建议在进程上设置ACL,这可以防止使用任务管理器或命令行工具终止进程(如果用户没有调试特权)。当然,用户始终可以使用像Process Explorer这样的工具,获取进程的所有权,设置新的ACL并终止进程。

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

使用Jedi Windows安全库非常容易设置进程ACL,就像这个示例所示。


1
oaky Remko, 这个库让我很满意,正如示例所示,它可以满足我的需求,因为我只想要一些新手无法“杀死”的东西(使用和任务管理器!!) - djiga4me
@JoshEinstein 现在这才是文明。对于评论和你的回答加一分。 - Camilo Martin

5

这是一个非常糟糕的想法。如果你的程序在别人的计算机上运行,那么它就在他们的财产上而不是你的,需要像客人一样表现得有礼貌。这意味着你不能像你拥有这个地方一样行动,当然也不能告诉计算机的所有者他不能做什么,比如杀死他不想运行的任务。如果你这样做,那么你的程序就和恶意软件没有什么区别,并且很可能被当作恶意软件处理。


4
计算机可能不属于他们的财产。例如,帮助台,经理必须监督操作员,特别是当他们可以访问敏感数据时。操作系统并不涉及道德问题,它只涉及编程问题。 - Andriy Tylychko
1
@Andy:在这种情况下,管理层有适当的政策编辑工具来处理这些情况。如果你认为伦理可以与编程分离,请不要再碰编译器了。我不想冒险让你写的东西出现在我的机器上。 - Mason Wheeler
为什么不详细描述这个问题?OP已经在评论中表示这不是关于恶意软件的问题。 - Andriy Tylychko
@Andy:也许是这样,但这并不能阻止其他试图编写恶意软件的人找到这个页面。 - Mason Wheeler
2
我认为知识应该是公开的,你有不同的看法。这就是为什么我建议在其他地方讨论此类问题,以避免在 Stack Overflow 上引起争执。如果你认为 OP 不配得到他所询问的非常危险的信息,请不要给他。我希望其他人有不同的想法。 - Andriy Tylychko

3
我认为你提出了一个错误的问题。
你试图以错误的方式解决“如果在与服务器聊天时连接中断会怎样”的问题。答案不是“拒绝进程终止”,而是“预见连接问题并编写错误回退代码”!
为什么?因为显然,连接终止可能是由于网络问题引起的(你不能拒绝用户从网络上拔掉机器),而不是客户端的终止! 为什么无法捕获TerminateProcess? 如果你担心应用程序崩溃——只需使用应用程序重新启动和恢复API即可。

0
最简单的方法:您可以启动2个进程并让它们“相互监视”。 如果其中一个被关闭,请让另一个进程重新启动它。这将防止新手(如您所说)关闭该进程。 抱歉,但我认为您的“服务器/客户端应用程序”具有特洛伊木马/后门功能。“客户端应用程序发送一些有用的数据”,“无法终止的进程”(在您的评论中)对我来说看起来太可疑了。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接