Windows(或Linux)中的不间断进程?

时间:2012-09-15 13:09:54

标签: c hook signal-processing interrupt interrupt-handling

有没有办法让一个程序无法中断(一个不间断的程序)?我的意思是a process that can't be terminated by any signal, kill command, or any other key combinations在任何系统中:Linux,Windows等。

首先,我有兴趣知道它是否可能。如果是,那么可能的范围是什么?

我主要用C,C ++和python编写代码;但是我不知道这些编程语言中有任何这样的命令。

汇编语言是否可行,&怎么样 ?或者使用嵌入式汇编代码(内联汇编)的高级语言c?

我知道有些信号可以捕获,有些信号不像SIGKILL和SIGSTOP。

我记得,当我习惯使用Windows-XP时,some viruses couldn't be terminated even from Task Manager.所以我想在低级语言中可能有一些解决方案。也许是通过覆盖中断向量表。

我们可以使用TSR编写一个不间断的程序(挂钩)吗?因为TSR只能在重新启动计算机时删除,或者TSR明确地从内存中删除。 我是否正确?

我在Google上找不到任何东西。

3 个答案:

答案 0 :(得分:4)

好吧,可能有人可以编写一个对大多数信号没有响应的程序,如SIGQUIT,SIGHUP等。 - 每种“kill”实际上是一种由内核发送给程序的信号,一些信号意味着内核该计划被卡住,应该被杀死。 实际上唯一不可杀死的程序是内核本身,甚至init(PID 1)也可以用HUP“杀死”(这意味着重新加载)。

了解有关信号处理的更多信息,从kill -l(列表信号)命令开始。

关于Windows(基于“防病毒”标签) - 实际上也适用于linux - 如果你只是需要运行一些防病毒用户无法跳过/关闭,它的权限问题,我的意思是程序由系统启动,而非没有权限杀死它的管理用户无论如何都无法关闭/退出它。我想全世界的Windows上的lameusers会先尝试关闭防病毒软件,然后开始“解决”他们遇到的任何问题,只要它有可能:)

答案 1 :(得分:4)

在Linux上,可以避免被以下两种方式之一杀死:

  1. 成为init(PID 1)。 init会忽略所有无法捕获的信号,即使是SIGSTOPSIGKILL等通常无法阻止的信号。
  2. 触发内核错误,让您的程序陷入D(不间断等待)状态。
  3. 对于2.,最终处于D状态的一种常见方法是尝试访问某些未响应的硬件。特别是在旧版本的Linux上,该过程将陷入内核模式,并且在内核放弃硬件之前不会响应任何信号(这可能需要相当长的时间!)。当然,你的程序在这样的情况下不能做任何其他事情,所以它比有用更麻烦,更新版本的Linux开始通过将D状态划分为可填充状态来解决这个问题(其中{ {1}}工作)和不可杀戮状态(所有信号都被阻止)。

    或者,当然,您可以简单地将代码加载为内核模块。内核模块不能被“杀死”,只能卸载 - 并且只有当它们允许自己卸载时才会被“杀死”。

答案 2 :(得分:2)

你可以捕捉到任何信号或输入,并通过它保持活力,主要的例外是SIGKILL。可以防止它杀死你,但你必须替换init(并重新启动成为新的init)。 PID 0在大多数Unix上都是特殊的,因为它是唯一不能被杀死的东西。