如何让 windows 服务难以停止?

How to make a windows service hard to stop?

我正在为 children 开发 windows 生产力和监控工具。我尝试创建一个尽可能难以被用户停止的 C# windows 服务。如果用户不是管理员,那很容易——服务无法停止。问题是当用户具有管理员权限时。不幸的是,这种情况经常发生,因为孩子们拥有管理员权限,因此他们可以自己安装应用程序和游戏。

目前我的服务在本地系统下运行,并在开机后自动启动。理想情况下,该服务应该仅通过软件卸载、重新安装或 windows 关闭或重启等方式停止。

现在我使用某种 hack/workaround。我创建了两个服务,它们定期(每 1-2 秒)相互检查另一个服务是否仍然 运行 并在它不是时重新启动它。这是一个丑陋的解决方案,绝对不是万无一失的。如果您的速度足够快,可以停止服务,这可能会导致卸载或重新启动计算机时出现问题。这就是为什么我正在寻找更好的解决方案。

最好的情况我想要类似于即使管理员也无法停止的防病毒软件服务的行为。我知道这是不可能的。我意识到他们可能有一些来自 microsoft industry collaboration program 的特殊 API 权限。但我不想走这么远。我认为这有点矫枉过正。我不从事防病毒应用程序工作。

我知道管理员用户总能找到停止进程或服务的方法。我只想实现一些至少可以在大多数常见 "child" 攻击中幸存下来的东西。或者至少,终止服务会带来很多痛苦或工作,以至于用户最终会放弃。

如何让服务难以停止?

非常感谢您的建议。

不参与关于这个的辩论...

程序可以尝试让自己更难被杀死(拒绝 PROCESS_TERMINATE 访问,拒绝 PROCESS_CREATE_THREAD 访问,这样人们就不能 CreateRemoteThread(EndProcess),拒绝 PROCESS_VM_WRITE 这样人们就可以不要乱写你的堆栈,让你双重错误,拒绝 PROCESS_SUSPEND_RESUME 这样他们就不能暂停你),但最终你无法阻止他们,比如说,提升到调试权限,调试你的进程,并移动EIP 到 "ExitProcess".

终究万物皆可杀

您可能想读一读:

http://csharptest.net/1043/how-to-prevent-users-from-killing-your-service-process/

https://blogs.msdn.microsoft.com/oldnewthing/20040216-00/?p=40603/