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.ので、低水準言語で何らかの解決策が可能だと思います。おそらく、Interrupt Vector Table をオーバーライドすることによって可能です。

TSR(Hooking)を使って中断のないプログラムを書くことはできますか? TSR は、コンピューターの再起動時、または TSR がメモリから明示的に削除された場合にのみ削除できるためです。私は正しいですか?

Googleで何も見つかりませんでした。

4

3 に答える 3

4

おそらく、SIGQUIT や SIGHUP などのほとんどのシグナルに応答しないプログラムを作成することもできます。それぞれの種類の「kill」は、実際にはカーネルによってプログラムに送信される一種のシグナルです。立ち往生し、殺されるべきです。実際、唯一の殺せないプログラムはカーネル自体であり、 init ( PID 1 ) でさえ HUP ( reload を意味する) で「殺す」ことができます。

kill -l (シグナルのリスト) コマンドから始めて、シグナル処理の詳細を学んでください。

Windows(「アンチウイルス」タグに基づく)-実際にはLinuxにも適用されます-一部のアンチウイルスユーザーを実行する必要がある場合、スキップ/クローズできません。これは権限の問題です。つまり、システムによって開始されたプログラムであり、管理者以外のユーザーです。それを殺す許可がなければ、とにかくそれを閉じたり終了したりすることはできません。世界中の Windows の不自由なユーザーは、可能であれば、最初にアンチウイルスを閉じようとすることで、問題を「解決」し始めると思います :)

于 2012-09-15T13:13:33.247 に答える
4

Linux では、次の 2 つの方法のいずれかで強制終了を回避できます。

  1. init(PID 1) となります。initは、キャッチできないすべてのシグナルを無視しSIGSTOPますSIGKILL
  2. カーネル バグを引き起こし、プログラムをD(割り込み不可の待機) 状態に陥らせます。

の場合、状態2.になる一般的な方法の 1 つDは、応答していないハードウェアにアクセスしようとすることです。特に古いバージョンの Linux では、プロセスがカーネル モードでスタックし、カーネルがハードウェアを放棄するまでシグナルに応答しません (かなり時間がかかります)。もちろん、あなたのプログラムはこのようにスタックしている間は他に何もできないので、役に立つというより面倒です. Linux の新しいバージョンでは、D状態を kill 可能な状態 (SIGKILL動作する場所) とkill できない状態に分割することで、この問題を修正し始めています。 (すべての信号がブロックされている場所)。

もちろん、コードをカーネル モジュールとしてロードすることもできます。カーネル モジュールは「強制終了」できず、アンロードのみ可能です。また、カーネル モジュール自体がアンロードできる場合に限ります。

于 2012-10-05T07:22:29.607 に答える
2

ほとんどすべてのシグナルまたは入力をキャッチし、それを介して生き続けることができますが、主な例外は SIGKILL です。それがあなたを殺すのを防ぐことは可能ですが、initを置き換える必要があります(そして再起動して新しいinitになります)。PID 0 は、KILL できない唯一のものであるという点で、ほとんどの Unix で特別です。

于 2012-09-15T17:36:18.067 に答える