3

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

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

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

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

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

权限更新:防病毒进程 AvastSvc.exe 归“系统”帐户所有。但是,我有“系统”帐户拥有的其他进程,它们是可杀死的,而杀毒软件则不是。另外,我比较了防病毒进程和可杀进程的可执行权限和所有者,我看不出有什么区别。

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

4

3 回答 3

6

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

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

Windows 不允许应用程序对计算机施加比用户更多的权力。如果你拥有这台机器并拥有适当的权限,你可以做任何你想做的事情,包括终止正在运行的进程。值得庆幸的是,作为开发人员,您无法阻止此操作。

用户始终处于最终控制之中。试图创造另一种情况是病毒和其他恶意软件开发人员定期进行的一场战斗 - 并且失败了。由于我对帮助任何人编写恶意软件不感兴趣,这就是我要说的全部内容。

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

于 2012-05-08T07:56:08.183 回答
1

我发现防止用户进程被进程资源管理器中的“结束进程”杀死中提供的函数 ProtectProcess()完全符合我正在寻找的效果。

于 2012-05-13T15:24:08.073 回答
0
  1. 通过从 eprocess 结构中删除它来隐藏您的进程
  2. 发出无法被其他进程取消或完成的持久 I/O 请求
  3. 创建线程来调试你自己的进程
  4. 从内存中创建单独的进程/es 来监视主进程并在被另一个进程终止后从内存中重新启动它
于 2015-08-10T09:47:10.917 回答