有没有办法保护我的 Delphi 应用程序免受 Windows 任务管理器(或其他类似的工具,如 Process Explorer)的结束?
我认为 Windows 消息可以做到这一点(通过挂钩并拦截 TerminateProcess 消息)。
我想要一个此保护的例子。卡巴斯基杀毒软件就是这样的,我们无法在任务管理器中结束它们的进程。
有没有办法保护我的 Delphi 应用程序免受 Windows 任务管理器(或其他类似的工具,如 Process Explorer)的结束?
我认为 Windows 消息可以做到这一点(通过挂钩并拦截 TerminateProcess 消息)。
我想要一个此保护的例子。卡巴斯基杀毒软件就是这样的,我们无法在任务管理器中结束它们的进程。
正如Kornel所说,存在着以用户为界限隔离进程的操作系统级别的保护。但一般而言,没有办法阻止有权限的用户终止您的进程。而且,一个用户有权限终止正在以该用户身份运行的进程。
即使您想将其作为SYSTEM运行,您也无法使用此进程与已登录的用户进行交互。您需要将其运行为服务,并且它将没有GUI。您可以尝试其他方法,例如将DLL加载到不希望停止的进程(如Explorer.exe)中,但这只是滥用。
如果开发人员可以编写无法终止的应用程序,那么对最终用户来说将是非常糟糕的情况。如果这是内部应用程序,您可以在Server Fault上查看是否有通过组策略实现的方法。
像卡巴斯基这样的杀毒软件可能会使用驱动程序和挂钩来防止被终止。
在您的情况下,我建议在进程上设置ACL,这可以防止使用任务管理器或命令行工具终止进程(如果用户没有调试特权)。当然,用户始终可以使用像Process Explorer这样的工具,获取进程的所有权,设置新的ACL并终止进程。
如果用户不是管理员,则足以在不同的用户上下文中运行进程(例如从服务启动它)。
使用Jedi Windows安全库非常容易设置进程ACL,就像这个示例所示。
这是一个非常糟糕的想法。如果你的程序在别人的计算机上运行,那么它就在他们的财产上而不是你的,需要像客人一样表现得有礼貌。这意味着你不能像你拥有这个地方一样行动,当然也不能告诉计算机的所有者他不能做什么,比如杀死他不想运行的任务。如果你这样做,那么你的程序就和恶意软件没有什么区别,并且很可能被当作恶意软件处理。