如何保护(我的进程)线程免于终止

时间:2017-12-18 21:46:30

标签: c# multithreading security winapi

我编写了一项关键工作的Windows服务。 我的程序有5个执行关键任务的线程,我不希望它们被终止。

我使用进程黑客,在线程选项卡中我可以终止任何5个线程而不会导致整个程序被终止(因为程序只是容器) 当用户或黑客(我的程序是一个安全程序而用户可能想让它不起作用)终止一个线程时(如果它们被暂停但是没有策略阻止或修复终止,我恢复线程)并没有完成关键工作线程)

如何保护这5个线程不被终止? (我已经让程序本身很关键,但是当线程可以轻松终止时它没有任何价值)

1 个答案:

答案 0 :(得分:-2)

我找到了解决问题的方法。

首先让我解释我是如何实现这一目标的:

我做了 2个看门狗线程,第一个重新创建 5个线程和WatchDogThread2终止时,第二个对看门狗1 这让我很长,因为Thread.IsAlive总是返回true,即使终止线程最终使用Thread.Join()并且加入正在工作)。

当其中一个监视程序线程在终止后运行时,重新创建丢失的一个。但是在10-30秒后,异常被抛入与监督者无关的部分。

我多次重试并做了一些调试。 在30-50次尝试和编辑之后,我看到异常特定部分随机部分中抛出。

所以我开始研究例外

ExecutionEngineException

我发现当代码中的某些内容出错时,CRL会抛出此内容。 首先,我认为这个问题是由一个看门狗推动的,所以我改了几次但错误仍然存在(只是时间到了它被抛出一点点) 所以我完全删除了并启动了程序并终止了5个帖子 这次没有发生了。
我通过一些编辑多次执行此操作,并且看到此异常发生时不使用看门狗在看门狗之后2-3分钟而不是10-30秒之后发生异常。

我再次研究,微软在MSDN上写道,如果垃圾收集完成,有时会发生这种情况。我禁用垃圾整理并收到不再例外。

我写了另一个线程,迫使Garbage整理每一个 0.5秒并在线程终止后看到程序收到ExecutionEngineException并崩溃。

这是垃圾分类的解决方案,因此整个过程崩溃并重启/ BSOD发生。

最终解决方案

如果线程终止并且垃圾收集触发,则CRL抛出ExecutionEngineException
只需每0.5秒做一次手动垃圾清理,这样程序就会崩溃并重新启动。

代码:

Thread t1 = new Thread(delegate () {  
    while (true) { 
        System.GC.Collect(); 
        Thread.Sleep(500); 
    } 
}); 

t1.Start();

您可以启动其中两个线程以获得更高的安全性(如果用户终止t1,将在0-10分钟后触发垃圾收集,此时他将执行您想要的任何操作。)< / em>的