10

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

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

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

4

6 回答 6

14

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

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

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

于 2009-12-31T02:45:05.480 回答
11

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

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

如本示例所示,使用Jedi Windows 安全库设置进程 ACL 非常简单。

于 2009-12-31T08:05:45.357 回答
5

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

于 2009-12-31T15:52:21.890 回答
3

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

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

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

为什么不能捕获 TerminateProcess?

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

于 2010-06-20T08:44:16.193 回答
0

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

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

于 2013-06-24T10:53:14.070 回答
-1

Create an NT-service project, service processes can't be killed with Process Manager, but are controlled by the internal service manager.

于 2009-12-31T13:35:31.103 回答