如何为Windows编写一个不可杀死的进程?

时间:2009-06-14 11:38:55

标签: c++ windows

我正在寻找一种编写应用程序的方法。我使用Visual C ++ 6.0。

我需要阻止用户通过任务管理器关闭此过程。

11 个答案:

答案 0 :(得分:34)

你不能这样做。

答案 1 :(得分:18)

Raymond Chen,为什么这是一个坏主意:

http://blogs.msdn.com/oldnewthing/archive/2004/02/16/73780.aspx

答案 2 :(得分:16)

你可以制作一个不可杀戮的过程,但是当它不可杀戮时它将无法完成任何有用的东西。例如,使进程不可杀死的一种方法是让它向永远无法完成的驱动程序发出同步I / O请求(例如,故意编写有缺陷的驱动程序)。在I / O请求完成之前,内核不允许进程终止。

因此,有些人说,你“做不到”并不完全正确。但你无论如何都不想要。

答案 3 :(得分:7)

这一切都取决于谁不应该杀死这个过程。您通常有一个交互式登录用户。在该上下文中运行该进程将使用户杀死它。这是她的过程所以她可以杀死它,这并不奇怪。

如果您的用户具有有限的权限,您始终可以以其他用户身份启动该过程。用户不能杀死属于另一个用户的进程(管理员除外),这里也不会感到惊讶。

您还可以尝试使用本地系统权限运行您的进程,我认为即使管理员也可以杀死它(即使他可以获得这样做的权限,也可以使用iirc)。

总的来说,这是一个非常糟糕的主意。用户没有拥有该机器的进程。我所知道的计算机上唯一不可杀死的进程是操作系统,这是正确的。你必须确保你不能占用资源(由于你是不可杀戮而无法释放)和其他恶意副作用。通常这样的东西不是正常应用程序的领域,他们应该远离这个原因。

答案 4 :(得分:3)

取决于用户权限。如果以管理员身份运行程序,普通用户将没有足够的权限来终止您的进程。如果管理员试图杀死该进程,他将在大多数情况下成功。如果你真的想要有人不杀你的过程你应该看看Windows系统服务和驱动程序开发。在任何情况下,请注意,如果用户无法杀死进程,他会坚持使用它,即使它表现异常错误的错误!您将在法律上找到大量这类程序/示例!网站rootkit.com。请尊重用户。

答案 5 :(得分:3)

我从恶意软件中学到了什么:

  • 创建一个产生十几个人的过程
  • 每当你发现一个人丢失(它被杀死)时,会产生十几个。
  • 每个应该是一个唯一的进程名称,以便批处理过程不能轻易地按名称
  • 终止所有这些名称
  • 按顺序关闭并重新启动某些进程以保持pid更改,这也可以防止批量终止

答案 6 :(得分:2)

这是几十年来的Win32常见问题解答。请参阅Google网上论坛和Und。众所周知的方法板(挂钩和其他......) 回答“你不能做到”的Noobs对Win32编程一无所知:你可以用Win32 api做一切 ......

答案 7 :(得分:1)

没有100%万无一失的方法,但应该可以通过这种方式保护流程。不幸的是,它需要比我现在更多的Windows安全系统API知识,但原理很简单:让应用程序在不同的(管理员)帐户下运行,并将进程对象的安全属性设置为最大值。 (拒绝所有其他用户关闭进程的权限,因此只有特殊管理员帐户才能关闭它。) 设置辅助服务并使其作为流程监护人运行。它应该具有受保护应用程序的生命线,并且当该生命线被切断(应用程序关闭)时,它应该再次重新启动该过程。 (这条生命线将是任何类型的进程间通信。) 但是,仍然有办法杀死这种不可杀戮的过程。但这确实需要大多数用户并不真正了解的知识,因此大约85%的用户都没有线索来阻止您的流程。

请记住,创建这样的应用程序可能会产生法律后果。例如,索尼创建了一个rootkit应用程序,当人们在他们的计算机中插入索尼音乐CD或游戏CD时,该应用程序会自动安装。这是他们的DRM解决方案的一部分。不幸的是,杀死这个应用程序非常困难,安装时没有任何警告给用户。更糟糕的是,它有一些弱点,可以为黑客提供其他方法来访问这些系统,从而使其中的一些系统受到感染。索尼不得不赔偿很多人的赔偿金,不得不支付巨额罚款。 (然后我甚至不会提到它对声誉的影响。)

当您在自己的计算机上安装此应用程序时,我会认为此类应用程序是合法的 。如果您计划将此应用程序出售给其他人,则必须告诉这些买家如何在需要时杀死该进程。我知道赛门铁克正在做与他们的软件类似的事情,这正是我不再使用他们的软件的原因。这是我的电脑,所以我应该能够杀死任何我喜欢的过程。

答案 8 :(得分:1)

答案 9 :(得分:0)

世界上最古老的想法,两个相互重生的过程?

答案 10 :(得分:0)

我在试图找到解决我自己(无意识的)无法解决的流程问题的过程中偶然发现了这篇文章。也许我的问题将是你的解决方案。

  1. 使用jboss Web Native安装将运行批处理文件的服务(修改service.bat以便它调用您自己的批处理文件)
  2. 在您自己的批处理文件中,调用执行您要保留的任何任务的java进程
  3. 启动服务。如果您在流程资源管理器中查看流程,生成的树将如下所示:
  4. jbosssvc.exe - > cmd.exe - >的java.exe

    1. 从管理命令提示符处使用taskkill来终止cmd.exe。 Jbosssvc.exe将终止,并且java.exe将是一个孤立的运行进程(据我所知)不能被杀死。到目前为止,我已经尝试过使用Taskmanager,进程资源管理器(以管理员身份运行)和taskkill无效。
    2. 免责声明:正如其他人所说的那样,很少有人这样做是个好主意。

相关问题