On appellera virus système, sur la HP, un
virus qui sera exécuté au moment du démarrage de la machine, indépendamment du
fait qu’il infecte ou non des fichiers systèmes. En effet, il n’y a pas de
fichiers système proprement dit sur une HP48.
Ce virus est une librairie qui s’installe
dans le port 0 et détourne des instructions d’affichage et de gestion de la
mémoire pour se camoufler. Pour cela, elle substitue à la Main Loop de la HP48
sa propre Main Loop, qui lui donne le contrôle de la calculatrice. De plus,
elle détourne la fonction de transfert infrarouge de la calculatrice pour
pouvoir se répandre d’une machine à l’autre. De ce fait, ce virus est baptisé
LiPA, pour Librairie Parasite Autopropageable. Nous allons en détailler le
fonctionnement, mais nous ne donnerons pas son listing, qu’il serait trop long
de rendre compréhensible.
4.1.
Fonctionnement du reset de
la HP48 et de sa Main Loop
A chaque reset
de la machine, la CPU exécute le programme situé à l’adresse #00000. Celui-ci
réinitialise toute la RAM, à l’exception de la zone qui contient les variables
utilisateurs et du Port 0, et reconstruit les zones de la RAM où sont
conservées les données du système (RAM réservée). Ce programme installe ensuite
le mécanisme d’interprétation du RPL étendu, puis il exécute, entre autres, les
Config Object de toutes les librairies recensées en ROM et en RAM.
Classiquement, le Config Object contient une instruction attachant la librairie
au répertoire maître, et éventuellement une instruction d’affichage signalant à
l’utilisateur la présence de la librairie.
A la fin de son
exécution, le programme de reset lit dans un champ spécifique de la RAM réservée
l’adresse à laquelle se trouve la Main Loop qui est la boucle qui gère le
fonctionnement de la HP48. Il exécute alors cette Main Loop. Il s’agit d’une
boucle sans fin, située à l’adresse #385A7 en ROM et programmée en RPL étendu..
Elle contient successivement un appel à un programme de rafraîchissement de
l’affichage et un programme de gestion du clavier, qui exécute l’ordre
correspondant à une pression de touche en effectuant un contrôle d’erreur.
C’est cette Main Loop qui définit le fonctionnement de la HP48 dans son usage
courant.
Notons que le
fonctionnement du reset et de la Main Loop n’est référencé dans aucun livre,
mais il est possible de l’analyser en fouinant dans la ROM. Or, sa connaissance
est nécessaire pour écrire un virus système sur HP48. Ceci est une bonne
illustration d’un phénomène fréquent pour les virus informatique : leur
conception nécessite de trouver des failles dans le système informatique,
lesquelles ne sont souvent découvertes qu’en tâtonnant et par hasard.
4.2.
Fonctionnement de LiPA
LiPA tire
profit de ces deux mécanismes pour prendre le contrôle de la HP48.
LiPA est une
librairie et possède donc un Config Object. Celui-ci contient une séquence de
langage machine (objet code) qui remplace l’adresse de la Main Loop contenue
dans le champ précité de la RAM, par l’adresse d’une Main Loop modifiée
contenue dans la librairie. Ainsi, à la fin du reset, le contrôle de la HP48
sera assuré par la Main Loop de LiPA et non par le système original. La Main
Loop de LiPA est identique à celle de la HP, à quelques ajouts prés. En effet,
LiPA effectue deux types de taches : elle se camoufle aux yeux de
l’utilisateurs, et elle assure son auto-propagation. Pour cela, il faut
détourner le sens de certaines combinaisons de touches au clavier, et remplacer
certaines instructions du langage RPL.
Il est en effet
possible de remplacer une instruction RPL par un programme ayant une action
différente. La HP48 dans sa démarche pour interpréter une instruction depuis
l’éditeur de texte de la ligne de commande commence par chercher si c’est le
nom d’un programme contenu dans une librairie, grâce aux Hash Table. Et sa
recherche débute par les librairies situées en RAM. Ainsi, si il existe deux
programmes portant le même nom, l’un en ROM et l’autre en RAM, c’est ce dernier
qui sera exécuté. Comme LiPA est une librairie, il est possible de redéfinir
ainsi plusieurs des instructions de la HP48.
Les astuces
employées dans LiPA étant toutes expliquées, nous allons maintenant détailler
en deux temps la façon dont LiPA se camoufle et se propage.
4.2.1.
Système d’auto-camouflage de
LiPA
Pour s’auto-camoufler, LiPA doit détourner
deux types d’instructions : les instructions éditées en ligne de commande,
et celles tapées par des raccourcis clavier, grâce au système de menu déroulant
de la calculatrice.
Il n’y a qu’une
instruction éditée à redéfinir : c’est la fonction PVARS qui met sur la
pile de travail une liste contenant la description de toutes les librairies
présentes dans un port. Il suffit donc de mettre dans LiPA un programme appelé
PVARS, qui effectue le vrai PVARS par un appel direct en ROM, puis ôte de la
liste obtenue les paramètres décrivant LiPA lorsqu’ils y sont.
La tache pour
les raccourcis clavier est plus délicate : il faut inclure dans la Main
Loop de LiPA un test pour savoir si l’effet de la touche enfoncée correspond à
la demande d’affichage dans la zone d’écran des menus du contenu du Port 0. Si
tel est le cas, il faut exécuter un programme qui reconstruit le graphique des
menus qui s’affiche en bas d’écran, pour en enlever la case désignant LiPA.
4.2.2.
Système d’auto-propagation
de LiPA
LiPA détourne
la liaison infrarouge série de la HP48 pour se propager d’une machine à
l’autre. En effet, la HP48 possède une interface infrarouge permettant
l’émission réception avec une autre HP48, selon le protocole RS232. Il existe
donc un menu et un jeu d’instruction permettant d’émettre et de recevoir des
données (programmes, librairies…) par infrarouge. C’est même le mode de
transmission le plus utilisé, les deux autres modes possibles étant le câble de
transmission et les modules mémoires enfichables.
Le menu de
gestion de l’interface infrarouge se présente sous la forme d’un menu déroulant
offrant plusieurs options : ‘send to HP48’, ‘get from HP48’, ‘print
display’, ‘print’, ‘transfer’ et ‘start server’. Nous souhaitons détourner
l’option ’send to HP48’, et pour cela il n’existe pas d’autre moyen que de
réécrire entièrement le programme d’affichage du menu, pour qu’il puisse
appeler un programme d’infection lorsque l’option ‘send to HP48’ aura été
sélectionnée. Ce programme d’infection affiche l’écran normal de saisie du nom
de l’objet à transmettre, puis, au lieu de l’émettre immédiatement, teste si il
s’agit d’un programme. Si c’est un programme et qu’il est assez gros pour que
l’ajout de LiPA dans son corps ne soit pas trop visible, alors il modifie ce
programme pour y inclure LiPA et des instructions d’installation de LiPA,
lesquelles seront exécutées en même temps que le programme support sur la
machine receveuse. Elles copieront LiPA dans le Port 0 de la machine receveuse
et enlèveront LiPA du programme support.
Pour effectuer
l’ensemble de ces opérations, il faut réécrire l’ensemble des programmes
d’affichage du menu et d’exécution de ‘send to HP48’, et les évaluer dans la
Main Loop de LiPA lorsqu’un appel au menu de l’interface infrarouge aura été
fait par un appui de touche. Le programme qui effectue ces opérations est situé
dans une librairie de la ROM, et la partie qui nous est utile fait environ 500
octets de long. On en créé donc une copie modifiée que l’on inclut dans la Main
Loop de LiPA.
Il reste encore
à détourner l’instruction SEND, éditable dans la ligne de commande, et qui sert
à transférer un objet par la liaison infrarouge. Comme précédemment, on écrit
un programme nommé SEND qui effectue le programme d’infection décrit plus haut,
puis fait un appel au SEND véritable, en ROM.
4.3.
Conclusion sur LiPA
L’intérêt de ce
virus réside dans les idées qui permettent de le concevoir. Sur la base de ces
idées, on pourrait le faire évoluer pour écrire des versions beaucoup plus
efficace que celle-ci, qui est déplorable.
LiPA mesure 1
Ko, ce qui est non négligeable dans une RAM parfois limitée à 32 Ko. Sa Main
Loop est légèrement plus lente que celle de la HP, à cause des tests
supplémentaires, mais c’est peu sensible. Ses défauts majeurs viennent des
techniques de camouflage et de reproduction employées.
En effet, avec
ses deux précautions de camouflage, LiPA peut passer inaperçue d’un utilisateur
peu expérimenté. Cependant un utilisateur avertit, utilisant le RPL étendu,
s’apercevra immédiatement du problème. Il ne pourra effacer LiPA directement,
puisqu’elle contient la Main Loop active, et aura donc quelques difficultés à
la désinstaller, mais y parviendra. Dans l’optique d’un bon virus, LiPA est
donc un échec, car trop voyant.
En outre, la
technique employée par LiPA pour s’installer sur une autre machine est à la
fois incertaine et très voyante. En effet, il est rare de communiquer par
infrarouge un programme de taille assez importante pour que LiPA s’y fixe,
compte tenu du faible débit de cette liaison (9600 baud). D’autre part, une
fois LiPA installée dans le Port 0 de l’autre machine, celle-ci va
automatiquement provoquer un reset pour enregistrer les paramètres de cette
nouvelle librairie. N’importe quel utilisateur en déduira la présence d’une
nouvelle librairie et la recherchera.
Cependant, on peut imaginer des méthodes de
propagation beaucoup plus sûres. On pourrait par exemple inclure LiPA dans une
librairie à transmettre, ce qui serait plus discret, notamment au niveau du
reset qui serait alors provoqué par la librairie porteuse, mais cela
demanderait d’écrire un code en langage machine pour modifier la structure de
la librairie porteuse. On pourrait également perfectionner les techniques de
camouflage en assurant un contrôle plus précis des opérations effectuées par
l’utilisateur. Une fois encore, libre court est laissé à l’imagination du
programmeur pour perfectionner le virus.
Aucun commentaire:
Enregistrer un commentaire