如何用C#开发无法通过任务管理器或taskkill终止的程序?求最佳方案
如何开发无法通过任务管理器/taskkill终止的C#应用程序
各方案优缺点分析
1. RegisterServiceProcess
这是仅适用于Windows 9x/NT早期版本的老旧API,当前Win10/11已完全废弃,调用后无任何效果,直接排除。
2. 守护进程(Keep-alive processes)
- 原理:两个进程互相监控,一方被终止时,另一方立即重启它
- 优点:实现简单,无需系统权限,兼容现代Windows版本
- 缺点:用户可通过批量终止操作(如
taskkill /f /im *.exe)同时干掉两个进程;频繁重启会额外消耗系统资源
3. 受保护服务(Protected Services)
- 原理:将程序注册为Windows受保护进程,这类进程仅能被系统级权限进程终止,普通用户甚至无特殊权限的管理员都无法通过任务管理器或taskkill终止
- 优点:系统原生支持,防护强度最高,Win8及以上版本均兼容
- 缺点:需微软认可的代码签名证书(或开启测试模式),配置相对复杂,需系统权限完成安装
推荐方案及最佳实践
优先推荐受保护服务,若无法满足签名要求,可选择守护进程+额外防护作为备选。
受保护服务(首选)
- 代码签名
- 需获取微软信任的EV代码签名证书;测试环境下可通过
bcdedit /set testsigning on开启测试模式,使用自签名证书 - 签名后的服务才能被标记为受保护进程
- 需获取微软信任的EV代码签名证书;测试环境下可通过
- 服务配置
- 将程序注册为Windows服务,通过SC命令设置保护属性:
sc config <服务名> type= own protected= yes,或直接修改注册表对应项 - 确保服务以
LocalSystem账户运行,获取足够系统权限
- 将程序注册为Windows服务,通过SC命令设置保护属性:
- C#实现要点
- 基于
System.ServiceProcess.ServiceBase编写服务程序,重写OnStart和OnStop方法(注意:受保护服务的OnStop无法被普通调用触发,仅能通过系统级命令终止) - 服务避免直接处理UI,如需交互可通过独立UI进程,使用WCF、命名管道等方式与服务通信
- 基于
守护进程方案(备选)
- 互保逻辑设计
- 两个进程通过命名管道或共享内存建立心跳连接,定期检测对方存活状态
- 检测到对方终止时,立即调用
Process.Start()重启目标进程,必要时以管理员权限启动
- 防批量终止优化
- 给两个进程设置不同的进程名和窗口标题,降低被批量选中的概率
- 其中一个进程设置隐藏启动:
ProcessStartInfo.CreateNoWindow = true且WindowStyle = ProcessWindowStyle.Hidden,减少被发现的可能
- C#实现要点
- 启动进程时设置
ProcessStartInfo.UseShellExecute = false,配合隐藏窗口参数实现后台运行 - 监听
Process.Exited事件,触发重启逻辑
- 启动进程时设置
重要注意事项
开发此类程序必须遵守用户授权及法律法规,未经允许阻止用户终止程序可能违反软件使用协议或当地法律;受保护服务的防护并非绝对,拥有内核权限的恶意软件仍可绕过,但足以抵御普通用户的常规终止操作。
内容的提问来源于stack exchange,提问作者Arbelac
相关产品推荐
相关产品推荐

