Processus ininterrompu sous Windows (ou Linux)?

Est-il possible de créer un programme qui ne peut pas être interrompu (un programme ininterrompu)? J’entends par là a process that can't be terminated by any signal, kill command, or any other key combinations dans aucun système: Linux, Windows, etc.

Premièrement, je voudrais savoir si c’est possible ou non. Et si oui, dans quelle mesure est-il possible?

J’écris principalement du code en C, C ++ et python; mais je ne connais aucune commande de ce type disponible dans ces langages de programmation.

Est-ce possible avec le langage d’assemblage, et comment? Ou en langage de haut niveau c avec code d’assemblage intégré (assemblage en ligne)?

Je sais que certains signaux sont captables, certains ne sont pas comme SIGKILL et SIGSTOP.

Je me souviens que lorsque j’étais habitué à travailler sous Windows-XP, some viruses couldn't be terminated even from Task Manager. Donc, je suppose qu’une solution est possible dans les langages de bas niveau. peut-être en annulant la table des vecteurs d’interruption.

Pouvons-nous écrire un programme ininterrompu en utilisant des TSR (Hooking)? Parce que TSR ne peut être supprimé que lorsque l’ordinateur est redémarré ou si le TSR est explicitement supprimé de la mémoire. Ai-je raison?

Je n’ai rien trouvé sur Google.

Eh bien, on peut éventuellement écrire un programme qui ne répond pas à la plupart des signaux tels que SIGQUIT, SIGHUP, etc. – chaque type de “kill” est en fait une sorte de signal envoyé au programme par le kernel, certains signaux signifiant pour le kernel que le programme est coincé et devrait être tué. En réalité, le seul programme qui ne peut pas être détruit est le kernel lui-même, même init (PID 1) peut être “tué” avec HUP (ce qui signifie recharger).

En savoir plus sur la gestion des signaux, en commençant par la commande kill -l (list signaux).

En ce qui concerne Windows (en se basant sur la balise “antivirus”) – qui s’applique également à Linux – si vous avez juste besoin d’exécuter un antivirus, vous ne pouvez pas ignorer / fermer, c’est un problème d’autorisation, je veux dire un programme démarré par le système et un utilisateur non administrateur sans la permission de le tuer, ne sera pas capable de le fermer de toute façon. J’imagine que les utilisateurs de Windows dans le monde entier commenceraient à “résoudre” leurs problèmes en essayant tout d’abord de fermer l’antivirus, si cela était possible 🙂

Sous Linux, il est possible d’éviter d’être tué de deux manières:

  1. Devenez init (PID 1). init ignore tous les signaux qu’il ne capte pas, même ceux normalement bloquables comme SIGSTOP et SIGKILL .
  2. Déclenchez un bogue dans le kernel et bloquez votre programme dans l’état D (attente ininterruptible).

Pour 2. , un moyen courant de se retrouver dans l’état D consiste à tenter d’accéder à du matériel qui ne répond pas. Sur les anciennes versions de Linux en particulier, le processus restrait bloqué en mode kernel et ne réagirait à aucun signal tant que le kernel n’aurait pas abandonné le matériel (ce qui peut prendre un certain temps!). Bien sûr, votre programme ne peut rien faire d’autre tant qu’il est bloqué. C’est donc plus ennuyeux qu’utile, et les versions les plus récentes de Linux commencent à rectifier ce problème en divisant l’état D en un état killable (où SIGKILL fonctionne) et un état non destructible (où tous les signaux sont bloqués).

Ou bien entendu, vous pouvez simplement charger votre code en tant que module du kernel. Les modules du kernel ne peuvent pas être “tués”, seulement déchargés – et seulement s’ils se laissent décharger.

Vous pouvez capturer à peu près n’importe quel signal ou entrée et y restr en vie, la principale exception étant SIGKILL. Il est possible d’empêcher cela de vous tuer, mais vous devrez remplacer init (et redémarrer pour devenir le nouvel init). Le PID 0 est spécial sur la plupart des Unix, en ce sens que c’est la seule chose qui ne peut pas être tué.