Obligement - L'Amiga au maximum

Mercredi 18 juillet 2018 - 10:31  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Articles divers

 · Articles in english
 · Articles en d'autres langues


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Logiciels
 · Jeux
 · Scène démo
 · Divers


Jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Contact

David Brunet

Courriel

 


Programmation : Assembleur - Créer un antivirus (mise en marche après réinitialisation)
(Article écrit par Little Zeus et extrait d'Amiga News Tech - décembre 1989)


La dernière fois, nous avions laisse en suspend le fonctionnement global de notre antivirus. Rappelons ses caractéristiques : nous avons affaire à un antivirus, c'est-à-dire que dès que celui-ci détecte un quelconque élément gênant, il s'empresse de proposer à l'utilisateur sa suppression. Si ce dernier l'accepte, l'antivirus nettoie l'intrus de la mémoire et s'auto-reproduit sur le bloc d'amorce de la disquette infectée. Par conséquent, à chaque démarrage sur cette disquette, notre antivirus s'actionnera et guêtra. Cependant, il reste un problème, à savoir la mise en marche de notre routine après une réinitialisation.

Ainsi, nous comptons trois entrées différentes à notre programme : par amorce automatique, par réinitialisation ou par introduction d'une disquette contaminée alors que le programme principal se déroule.

L'amorce automatique

Nous admettons que notre antivirus est déjà implanté sur le bloc d'amorce de la disquette. Les deux premiers blocs contiennent les données suivantes : tout d'abord, le mot "DOS" (en majuscules), puis la somme de contrôle des deux premiers blocs, suivi du numéro du bloc contenant le répertoire et enfin d'un programme de démarrage (ici, notre antivirus). Attention, les deux premiers blocs font exception à la règle ; habituellement, chaque bloc comprend sa propre somme de contrôle plus un grand nombre de données concernant le ou les fichiers qu'il contient... La somme de contrôle d'un cylindre correspond à un calcul sur l'ensemble de ses octets. La tête de lecture lit donc tranquillement ces neuf premiers octets. En arrivant à notre antivirus, elle l'exécute.

Cependant, deux grandes difficultés apparaissent ; premièrement, le programme ne doit jamais être physiquement altéré, la somme de contrôle en deviendrait erronée et la disquette se retrouverait dans l'incapacité de démarrer. Seconde difficulté : les adresses du programme. Effectivement, si vous laissez libre choix à la machine d'implanter le programme où bon lui semble dans la mémoire, vos instructions "jmp" n'auront plus aucune signification. Il est clair que si la routine a été assemblée en $7f000, elle ne pourra jamais être exécutée en $300000. Cela serait par contre possible s'il n'y avait ni jmp ni jsr. C'est d'ailleurs ce dont nous allons nous servir pour remédier cette seconde difficulté : il suffit tout simplement de mettre en avant du programme une mini-routine recopiant l'antivirus à partir de son adresse normale d'exécution. Cette routine se nomme "Master" dans le listing.

En ce qui concerne la première difficulté, il s'agit d'envisager toutes les possibilités de modification du programme initial. En d'autres mots, nous devons recenser tous les paramètres susceptibles d'être modifiés. Apparaissent tout d'abord, les variables de tests telles AUT, TIME, etc. Ensuite, les messages qui peuvent être modifiés en fonction de la source du virus en l'occurrence, le message relatif au lecteur d'où provient le virus. La suite de la sous-routine de chargement est commune à celle de la réinitialisation.

La réinitialisation

Nous admettons que CoolCapture a été précédemment vectorisé sur Init (voir mois dernier). Rappelons que CoolCapture est un vecteur de l'Amiga correspondant à la réinitialisation. C'est-à-dire que la case mémoire d'adresse CoolCapture contient l'adresse de base de la routine à appeler lorsque les touches Control/Amiga/Amiga sont pressées. Cependant, après chaque réinitialisation, CoolCapture est correctement réinitialisé par le système. Il nous faut donc à nouveau le vectoriser sur Init. D'où un certain cercle vicieux. De la même manière, si l'antivirus a été appelé par une amorce automatique, CoolCapture doit être vectorisé afin de prévoir une future réinitialisation.

Ensuite, il s'agit d'anticiper, en vue d'une possible introduction de disquette infectée dans le lecteur sans qu'il n'y ait eu de réinitialisation. Nous n'allons pas revenir lourdement sur la méthode consistant à détourner DoIO. Rappelons simplement qu'à chaque nouvelle disquette introduite dans l'un des lecteurs, la routine DoIO est appelée par le système d'exploitation et que, par un subtil subterfuge, nous avons réussi à détourner DoIO sur l'antivirus.

Il est intéressant de remarquer qui si bon nous semble, l'antivirus peut être inhibé : il suffit de presser le bouton de la souris à la suite de sa manifestation graphique. D'une manière plus explicite, le virus est signalé par un effet de couleurs ; le fait de presser le bouton rendra notre routine inopérante. Nous reviendrons d'une manière plus détaillée sur ce problème le mois prochain.

Enfin, il suffit d'une petite routine dont nous étudierons le principe la prochaine fois, pour que la disquette dans le lecteur se charge automatiquement. Seulement, vous dites-vous, si la disquette est infectée, l'antivirus laisse le virus se reproduire sans même intervenir. En fait, et heureusement, il n'en est rien. Comme DoIO est détournée sur notre routine LTZ, alors si la disquette contient un quelconque virus, il sera immédiatement détecté.

Précisons l'utilité des deux variables AUT et TIME. Le fait d'avoir mis AUT à 1 signifie que la routine a déjà été appelée. Rappelez-vous que l'Amiga peut fonctionner en multitâche et que par conséquent, si deux disquettes infectées sont insérées en même temps, DoIO est détournée deux fois. Or, les registres du 68000 ne peuvent contenir deux valeurs différentes en même temps et il y a bogue. Cependant, afin d'éviter cet inconvénient fatal, on réduit la puissance du programme, c'est-à-dire que celui-ci ne peut être appelé qu'une seule fois en même temps. Pour ce faire, on utilise AUT, qu'on met à 1 lorsque l'antivirus est appelé, et à 0 sinon. Il émerge donc de ceci que dans le cas de deux disquettes infectées insérées simultanément, seule une sera purgée. Néanmoins la probabilité d'une telle situation est quasiment nulle.

TIME est mis à 1 lorsque l'on vient de faire une réinitialisation ou lorsqu'il y a eu une amorce automatique. De cette manière, pour la valeur de TIME égale à 1, l'antivirus revectorisera CoolCapture sur LTZ et remettra TIME à 0.

Disquette infectée

En fait, le paragraphe pourrait tout aussi bien porter le titre de "insertion d'une disquette sans qu'il y ait démarage". Comme vous pourrez progressivement le remarquer, la routine marche par élimination, et ceci se révèlera encore plus vrai dans ce qui va suivre.

Effectivement, s'il y a chargement d'une disquette contenant l'antivirus, la routine concernant la réinitialisation est appelée ; de même, cette dernière appelle indirectement LTZ en détournant DoIO. Il en découle que, dans tous les cas possibles, le programme passe par la routine LTZ.

Celle-ci procède par élimination. Après une suite de tests, elle sera en mesure de donner le diagnostic de la disquette. Dans un premier temps, il faut s'assurer que LTZ n'est pas en train d'être doublement appelée via DoIO. Rappelons aussi que DoIO sert aux transferts de données entre tous les périphériques et la mémoire. Par conséquent, rien ne nous permet d'affirmer qu'à un instant donné, DoIO assure un transfert de données entre le lecteur et la mémoire ; cela pourrait tout aussi bien être l'imprimante, le modem, etc.

Il se trouve que DoIO requiert un et un seul argument : l'adresse de base de la table des paramètres nécessaires à son bon fonctionnement. L'adresse de base de cette table figure dans a1, ce qui nous permettra de l'explorer pour vérifier que c'est bien une opération sur disquette qui est en cours.

Nous ne verrons cependant pas l'ensemble des données contenues dans la table, mais uniquement celles dont nous nous servirons :
  • En a1 +36 se trouve le nombre d'octets à transférer. Si ce transfert concerne un virus, il ne peut qu'être inférieur au nombre d'octets des deux premiers blocs de la disquette. A fortiori, ce nombre est inférieur à 1025. Si tel est le cas, les tests peuvent se poursuivre.
  • En a1 +44 figure le numéro de la piste concerné. S'il ne s'agit pas de la piste 0, on laisse tomber.
  • a1 +29 et a1 +27 indiquent respectivement s'il y a lecture d'un secteur et si oui, sur quel lecteur.
  • En 40 +a1 se trouve l'adresse à partir de laquelle les données en provenance du lecteur vont être logées en mémoire. On sauvegarde cette valeur en WAIC, car elle nous permettra de connaître la zone comportant le virus. Il sera ainsi facile de l'éliminer de la mémoire.
  • En a1 +31 enfin, est placé un numéro d'erreur éventuelle survenue lors de la lecture ou de l'écriture sur la disquette.
Étant bien entendu que si un quelconque virus est détecté, le programme enchaînera sur le processus de reproduction de l'antivirus, il apparaît évident que DoIO sera directement appelée par notre programme afin d'écrire sur la disquette. Du coup, le message d'erreur peut facilement différer de celui précédemment rencontré. Imaginez la situation : un programme appelle DoIO et du coup passe par l'antivirus (je rappelle que DoIO est détournée sur notre antivirus), qui lui-même appelle pour ses besoins internes la véritable routine DoIO.

Celle-ci place un numéro d'erreur en a1 +31. Seulement voilà, le programme principal n'a rien à faire de notre message d'erreur, il doit retrouver le sien.

C'est pourquoi ce message d'erreur est provisoirement stocké en NERROR afin d'être "repoké" avant le retour au programme principal. Remarquons que la valeur d'erreur n'est stockée qu'après le lancement de la véritable DoIO.

That's all folks

Nous achèverons l'antivirus le mois prochain, en expliquant son installation sur le bloc d'amorce. Nous en profiterons pour étudier précisément le fonctionnement de la réinitialisation et ses possibilités d'utilisation. Nous approfondirons aussi certaines des notions étudiées dans ces pages, en particulier l'amorce automatique.

assembleur
assembleur


[Retour en haut] / [Retour aux articles] [Article précédent] / [Article suivant]