10

有什么办法可以制作一个不能被中断的程序(不间断的程序)?我的意思是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.所以我想一些解决方案可以用低级语言来解决。也许通过覆盖中断向量表。

我们可以使用 TSRs(Hooking) 编写一个不间断的程序吗?因为只有在重新启动计算机或明确从内存中删除 TSR 时才能删除 TSR。我对么?

我在谷歌上找不到任何东西。

4

3 回答 3

4

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

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

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

于 2012-09-15T13:13:33.247 回答
4

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

  1. 成为init(PID 1)。init忽略它没有捕获的所有信号,即使是通常不可阻塞的信号,例如SIGSTOPand SIGKILL
  2. 触发内核错误,并使您的程序陷入D(不间断等待)状态。

对于2.,结束D状态的一种常见方法是尝试访问一些没有响应的硬件。特别是在旧版本的 Linux 上,进程会卡在内核模式下,并且在内核放弃硬件之前不会响应任何信号(这可能需要相当长的时间!)。当然,当你的程序被这样卡住时,它不能做任何其他事情,所以它比有用更烦人,并且较新版本的 Linux 开始通过将D状态划分为可杀死状态(在哪里SIGKILL工作)和不可杀死状态来纠正这个问题(所有信号都被阻塞)。

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

于 2012-10-05T07:22:29.607 回答
2

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

于 2012-09-15T17:36:18.067 回答