Suivez-nous sur X

|
|
|
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,
ALL
|
|
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
|
|
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
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
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émarrage". 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.
|