c# - 如何使 Windows 服务难以停止?
问题描述
我致力于为儿童开发 Windows 生产力和监控工具。我尝试创建一个 C# Windows 服务,尽可能让用户难以停止。如果用户不是管理员,这很容易 - 服务无法停止。问题是当用户具有管理员权限时。不幸的是,情况往往如此,因为孩子们拥有管理员权限,因此他们可以自己安装应用程序和游戏。
目前我的服务在本地系统下运行并在启动后自动启动。理想情况下,该服务应该仅通过软件卸载、重新安装或 Windows 关闭或重新启动等来停止。
现在我使用某种黑客/解决方法。我创建了两个服务,它们定期(每 1-2 秒)互相检查另一个服务是否仍在运行,并在没有时重新启动它。这是一个丑陋的解决方案,绝对不是万无一失的。如果您的速度足够快,则可以停止服务,并且可能会在卸载或计算机重新启动过程中导致问题。这就是为什么我正在寻找更好的解决方案。
最好的情况是我想要类似于防病毒软件服务的行为,即使管理员也无法停止。我知道这是不可能的。我意识到他们可能有一些来自微软行业协作计划的特殊 API 权限。但我不想走这么远。我认为这有点矫枉过正。我不从事防病毒应用程序。
我知道管理员用户总是能够找到停止进程或服务的方法。我只是想实现一些至少可以在大多数常见的“儿童”攻击中幸存下来的东西。或者至少,杀死服务以使用户最终放弃会是很多痛苦或工作。
如何使服务难以停止?
非常感谢您的建议。
解决方案
没有进入关于这个的辩论......
程序可以尝试让自己更难被杀死(拒绝 PROCESS_TERMINATE 访问,拒绝 PROCESS_CREATE_THREAD 访问,这样人们就不能 CreateRemoteThread(EndProcess),拒绝 PROCESS_VM_WRITE 所以人们不能乱写你的堆栈并让你犯双重错误,拒绝 PROCESS_SUSPEND_RESUME,所以他们可以' t 暂停你),但最终你无法阻止他们,比如说,提升到调试权限,调试你的进程,以及将 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/
推荐阅读
- c# - 从一个点放大缩小 mchart
- android - 在 android studio 中插入在 sqlite 中不起作用的信息以进行练习
- sas - 如何将柱网放入原始数据文件中
- c++ - 错误的加密(QT c++ OpenSSL AES 256 CBC)
- jtag - 使用 TRACE32 调试 Linux 内核源时显示 HLL C
- python - Python在单独的线程中执行playsound
- sql-server - 如何总结 SQL Server 数据库中给定日期的 **ALL** 值?
- android - 如何在子 POJO 中使用 @Bindable?
- asp.net-web-api - 通过 FireBase 触发从 ASP.Net Api 到 Xamarin.Android 应用程序的推送通知
- sql - 如何在查询之间设置多个