【问题标题】:Making an app/service such that trying to end/kill its process in Task Manager would result in "Unable to Terminate Process"使应用程序/服务尝试在任务管理器中结束/终止其进程将导致“无法终止进程”
【发布时间】:2012-05-08 07:46:23
【问题描述】:

我有一个 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)用来防止终止其进程的上述方式(“无法终止进程”)。对我来说,实现相同的行为就足够了。此外,如果用户不喜欢该软件/不再需要该软件,他们也可以直接将其卸载。

【问题讨论】:

标签: c++ windows winapi windows-7


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 1) 我对我的问题进行了一些更新。 2)我实际上不知道它是在代码中还是在其他地方完成的。 3)“降低标准用户帐户的权限”:我们将无法访问用户计算机,并且我们不希望他们对其计算机进行额外的更改。用户将下载安装程序,并像使用防病毒软件一样安装它。
  • 啊,所以不是你的机器。那么实际上,无论动机如何,您都没有业务或权利为自己的目的征用它。您的意图与恶意软件没有区别,您保证它持续存在的唯一合法方案是在您自己的硬件上运行它并给予他们的(非持久性)远程访问。
  • 这种方法不满足的一些场景(例如在线管理测试和需要监控测试者的计算机活动)显然是合法的。然而,它们远不如保持基本安全模型的完整性重要,其首要责任是维护计算机所有者的(法律)意图,远高于其他所有意图。关于我提出的特定场景,我之前曾因为那种(惊喜)面试步骤而拒绝了一份工作。我严重怀疑您的情况是否会带来比这更高的风险。
【解决方案2】:

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

【讨论】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 2018-03-30
    • 1970-01-01
    相关资源
    最近更新 更多