制作应用程序/服务以尝试在任务管理器中结束/终止其进程将导致“无法终止进程”

时间:2012-05-08 07:46:23

标签: c++ windows winapi windows-7

我有一个Avast防病毒软件,它有一个进程“AvastSvc.exe”。如果我尝试在Windows任务管理器中结束/终止该进程,则会出现带有以下消息的窗口:“无法终止进程”,“操作无法完成。”,“访问被拒绝”。试图结束某些系统Windows进程(如winlogon.exe)可能具有相同的行为(虽然我曾设法杀死winlogon.exe并让我的机器挂起!)。

我希望我的应用程序(可能转换为服务)的行为方式相同。我怎么能这样做?

Disable Windows Task Manager so he cant kill my process是一个类似的问题,它有许多有趣的答案,但它们似乎没有使用上述防病毒软件使用的技术,导致“无法终止进程”消息。

http://forums.codeguru.com/showthread.php?t=503337有一个关于如何阻止停止服务的解决方案(例如,通过services.msc控制台),但我需要阻止结束/终止任务管理器中的过程。

我在Windows 7下用C ++ / winapi编写应用程序,没有CLR / .Net。

权限更新: 防病毒进程AvastSvc.exe归“系统”帐户所有。但是,我有“系统”帐户拥有的其他进程,它们是可以杀死的,而防病毒则不是。此外,我比较了可执行权限和防病毒进程的所有者以及可杀戮进程的所有者,我没有看到任何差异。

更新用户控制和软件用途: 软件功能介于系统和商业软件之间。软件的性质要求它永久运行。应用程序本身将有一个“关闭”操作,我们希望鼓励用户使用它并阻止它们杀死进程(它类似于防病毒软件的工作)。我知道不可能完全阻止用户杀死它,但我想让它变得更难。这个问题具体关于上述方法(“无法终止进程”),某些服务(如Avast)使用这种方法来防止查杀进程。对我来说,实现同样的行为就足够了。此外,如果用户不喜欢/不再需要它,用户将能够卸载该软件。

3 个答案:

答案 0 :(得分:7)

这不是通过代码实现的(好吧,它可能适用于关键的Windows系统进程,但您[可能]不是在编写操作系统的组件),而是通过访问权限。

您可以通过提升为管理员然后尝试杀死Avast的进程来证明这一点。它应该这次成功。或者,您可以获取可执行文件的所有权(可能还包括它所在的文件夹),然后尝试终止该进程。再次,它应该是成功的。

Windows不允许应用程序通过计算机施加比用户更多的电源。如果您拥有该计算机并具有相应的权限,则可以执行任何操作,包括终止正在运行的进程。值得庆幸的是,作为开发人员,你无法阻止这一点。

用户始终处于最终控制之下。尝试创建另一种情况是病毒和其他恶意软件开发人员争夺和定期失败的战斗。由于我对帮助任何人编写恶意软件不感兴趣,所以我就此对此进行说明。

除了编写恶意软件之外,我无法想象应用程序中这个“功能”的动机是什么。如果您只是试图阻止常规用户查杀对业务系统至关重要的进程,那么您应该降低标准用户帐户的权限,以便他们无法篡改此类内容。因此,这可能是组策略的工作,而不是代码。

答案 1 :(得分:1)

我发现Prevent user process from being killed with "End Process" from Process Explorer中提供的函数ProtectProcess()完全符合我要求的效果。

答案 2 :(得分:0)

  1. 通过从流程结构中删除流程来隐藏您的流程
  2. 发出无法由其他进程取消或完成的持久性I / O请求
  3. 创建线程以调试您自己的进程
  4. 从监视主进程的内存创建单独的进程/ es,并在被另一进程终止后从内存重新启动它