lundi 27 août 2012

Un virus système



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