|
||||||||||||||||||||||||||||||||||||||||||||
|
L'objectif de cet article Le mois dernier, nous nous sommes entretenus des exceptions du 68000 pouvant être déclenchées par programmation. Aujourd'hui, nous allons aborder un autre type d'exception : les interruptions. Il n'est pas question de traiter exhaustivement des interruptions dans le cadre d'un petit article comme celui-ci car ce sujet est immense dans le cas de l'Amiga. Nous allons simplement expliquer brièvement ce qu'est une interruption, comment ajouter un serveur d'interruption au système et illustrer ceci par quelques exemples dont un utilitaire... utile. Qu'est-ce qu'une interruption et à quoi ça sert ? Vu de l'extérieur, quand un ordinateur exécute un programme, on a l'impression qu'il se consacre totalement et uniquement à ce programme, mais ceci n'est pas vrai, même dans le cas d'une toute petite calculatrice comme l'Atari ST par exemple. En effet, tout ordinateur a besoin périodiquement de reprendre la main sur le programme qu'il exécute. En ce qui concerne notre Amiga, ceci est nécessaire afin que soient traités convenablement certains événements comme :
Peut-être savez-vous que l'Amiga utilise en fait 15 niveaux d'interruption. De ce fait, les signaux issus des différents composants électroniques ne sont pas envoyés directement sur le 68000, mais d'abord regroupés en 7 niveaux par Paula. Lorsque le 68000 reçoit un signal d'interruption, il :
Mes explications pourront peut-être paraître sibyllines, mais je ne peux pas entrer dans les détails faute de place. Programmation d'une routine d'interruption Comme pour les exceptions, il y a ici deux méthodes : la bonne et la mauvaise. Voyons d'abord la mauvaise. Elle consiste à détourner le vecteur en bas de mémoire sur une routine personnelle, puis à la fin de celle-ci sauter à l'adresse initialement prévue. Cette méthode n'est pas bonne car si plusieurs programmes tentent de faire de même, le chaînage des routines risque d'apporter quelques surprises désagréables. Par contre, cette méthode sauvage conviendra parfaitement aux programmeurs fous qui ne jurent que par les mégas-démos. La bonne méthode maintenant : programmer un gestionnaire (handler) ou un serveur d'interruption. Nous ne verrons que le cas du serveur, utilisé par les interruptions CIA, Copper, blanc vertical, Blitter, non masquables. Pas de panique, la programmation d'un gestionnaire est identique à celle d'un serveur à quelques détails près. Reportez-vous à la documentation pour en savoir plus. Une interruption dépend de la structure suivante :
Il faut en outre savoir que si l'on quitte notre routine avec le drapeau Z mis, Exec passera ensuite la main aux serveurs de priorité (de noeud) inférieure pour une même interruption. Si Z n'est pas mis, Exec considère que le traitement de l'interruption est terminé et retourne au mode normal. Pour placer le drapeau Z, il suffit de faire un moveq #0,D0 avant de quitter. Une routine d'interruption doit se terminer par RTS et non par RTE car c'est Exec qui se chargera de repasser en mode User. Le premier programme Le principal étant maintenant dit, nous allons passer tout de suite à la pratique avec le programme Crazy Led. Le seul intérêt de ce programme est de permettre la visualisation des interruptions. Déroulement du programme :
Encore un antivirus pensez-vous ? N'y en a-t-il pas suffisamment dans le domaine public ? Eh bien non, car, ici aussi, il est intéressant de repenser le problème et pour éviter que certains ne me lancent le clavier de leur Amiga flambant neuf en pleine figure, je précise tout de suite que finalement ce n'est pas un antivirus "classique" que je vous propose. Analysons la situation : Les virus Tous les virus que je connais se "reproduisent" par l'intermédiaire de la réinitialisation de façon à infecter les disquettes de manière inaperçue. Ces programmes s'implantent soit sur le vecteur ColdCapture, soit sur le vecteur CoolCapture, soit installent un module résident (Cf. article Boot Allocator) dans exec.library. Je ne connais pas de virus s'installant sur le vecteur WarmCapture de la même exec.library, mais il est tout à fait possible et facile de surveiller également ce vecteur de la même façon que les autres. Les premiers virus étaient facilement détectables car présents à un endroit bien précis des disquettes infectées : le bloc d'amorce. Malheureusement, les nouveaux virus dit virus "coquilles" se greffent sur n'importe quel fichier exécutable, ne sont donc pas limités en taille et ne sont pas détectables tant que le virus est inconnu des programmeurs d'antivirus. Toutefois, les virus coquilles doivent, lorsqu'ils sont chargés, s'installer eux aussi sur la réinitialisation afin de pouvoir se reproduire ultérieurement. Là est leur point faible. Un virus régénérant ses propres vecteurs de réinitialisation sous interruption deviendra difficile à tuer. Un tel virus existe : le très redoutable et dévastateur "Lamer Revenge Virus" par exemple. Attention, ce virus est capable d'attaquer férocement votre disque dur et de vous en effacer tout un répertoire sans coup férir (à vous les erreurs de lecture/écriture !). Les antivirus Tous les antivirus de ma connaissance semblent souffrir du même cruel manque d'imagination : ils s'efforcent seulement de détecter les virus déjà connus. Il est certes très intéressant de savoir de quel virus il s'agit, mais évidemment lorsqu'un nouveau virus apparaît, il n'est pas détecté. On se rappelle le désespoir de quelques-uns qui ont été infectés par le "Lamer Exterminator" lors de sa sortie. Les antivirus connaissant les caractéristiques des virus qu'ils recherchent, examinent quels vecteurs de sauts de bibliothèques ou quels vecteurs de sauts d'interruption ont bien pu être détournés ou encore examinent le haut de la mémoire Chip, car beaucoup de virus s'implantent à adresses fixes à cet endroit. Il y a un hic : certains programmeurs de virus savent programmer correctement un serveur d'interruption, donc sans détourner bestialement les vecteurs. C'est ici encore le cas du "Lamer Revenge Virus". Si l'on utilise par exemple les antivirus : VirusX et Master Virus Killer qui se veulent pourtant être les meilleurs antivirus du moment, on verra que VirusX sait reconnaître la présence du "Lamer Revenge Virus" mais est incapable de le tuer et que le "Master Virus Killer" nous annonce "virus inconnu en mémoire", ne comprend rien à ce qui se passe car il ne fait qu'examiner la table de sauts d'interruption sans détecter un éventuel serveur suspect, boucle (sans possibilité de reprendre la main) sur son test, et est bien sûr totalement incapable de tuer le virus. L'auteur nous dit même dans sa documentation que pour tuer un tel virus, le mieux est encore d'éteindre la machine (!?). Ceci condidéré, je vous propose une sentinelle. Sentinelle Ce programme a pour vocation de combattre les pires virus avec leurs propres armes, non pas en nettoyant les disques infectés comme un antivirus classique, mais en empêchant le virus de s'installer en mémoire. Pour cela, il installe un serveur d'interruption sur le blanc vertical, dont la mission est de vérifier périodiquement (50 fois par seconde) que les vecteurs de réinitialisation (reset) sont inoccupés. En cas d'occupation d'un vecteur Reset, ce serveur nettoie ledit vecteur et envoie un signal afin de réveiller sa tâche mère. Celle-ci enverra alors une alerte destinée à prévenir l'utilisateur. La sentinelle peut tuer En effet, si l'alerte apparaît, il y a deux possibilités :
Un virus peut-il déjouer la sentinelle ? Un virus "normal" ne le peut pas. Toutefois, un virus spécialement conçu pour attaquer la sentinelle peut-être embêtant sauf si l'on prend quelques précautions.
Un virus peut-il interdire les interruptions ? Non, car cela provoquerait un plantage. C'est d'ailleurs pour cela que la sentinelle s'installe sur le blanc vertical car un programme tentant d'interdire ce niveau d'interruption se fera immédiatement remarquer. Un virus peut-il éviter de "rendre la main" au serveur de la sentinelle en omettant de positionner le drapeau Z ? Non, car le serveur de la sentinelle est au niveau de priorité maximum et ne pas lui passer la main équivaudrait pratiquement à interdire le blanc vertical ce qui ne passerait pas vraiment inaperçu... Un virus peut-il détourner un saut d'interruption à son seul profit ? Non, car il devra obligatoirement "sauter" tôt ou tard dans le vecteur légal ce qui va alerter immédiatement la sentinelle... L'union fait la force La sentinelle, protection idéale contre les virus coquilles, n'est toutefois pas un antivirus. Vous pouvez, si le coeur vous en dit, la rendre telle en ajoutant les routines que bon vous semblera au programme. Par exemple, vous pouvez activer le drapeau DISKREMOVE de la fenêtre afin d'être prévenu de l'insertion d'une disquette et de pouvoir aller tester son bloc d'amorce, etc. Toutefois, donner libre cours à sa paresse n'est pas vraiment désagréable. Les VirusX de Steve Tibett étant très bien programmés, je me permets de vous recommander d'en utiliser la dernière version conjointement avec la sentinelle. Ces deux programmes sont tous les deux en état d'attente et leur présence ne se remarque même pas du point de vue du ralentissement de l'ordinateur. Par contre, cette combinaison est remarquablement efficace car à ce jour pas un virus n'a pu me faire le moindre dégât et pourtant ce n'est pas faute d'avoir essayé. Rien ne doit passer C'est pour cela que la sentinelle vous tuera impitoyablement le RAD: que vous auriez décidé d'installer. Vous pouvez très facilement modifier la sentinelle si vous voulez qu'elle ne tue pas le RAD: car celui-ci s'installe toujours à la même adresse. Toutefois, vous risquez ainsi de laisser passer un virus qui "imiterait" le RAD:... Mise en oeuvre de la sentinelle C'est un programme assembleur qui pourra être lancé à partir du Workbench à condition d'ajouter : include "misc/easystart.i" à la suite des autres instructions include. Néanmoins, il est plus intéressant de pouvoir le lancer en tâche de fond à partir d'un CLI et donc dans une startup-sequence. Pour cela, vous devrez relier les programmes sentinelle.c, sentinelle-asm et le cback du Lattice C ensemble. Je vous expliquerai prochainement comment lancer un programme assembleur en le décrochant du CLI, mais il y a là matière à un article entier. C'est tout pour cette année.
|