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 (organigramme)
(Article écrit par Little Zeus et extrait d'Amiga News Tech - janvier 1990)
|
|
Rappelons brièvement ce que nous avons déjà fait dans les deux numéros précédents : nous avons décidé
de créer un antivirus offrant quelques particularités intéressantes. Ainsi, il veille dès son implantation
en mémoire. Si vous insérez une quelconque disquette infectée, que ce soit après une réinitialisation
ou non, l'antivirus s'empresse de proposer à l'utilisateur sa destruction. Si celui-ci acquiesce, l'antivirus
enchaînera trois étapes dont deux simultanées : tout d'abord, le virus est effacé de la mémoire, puis
du bloc d'amorce de la disquette infectée, et l'antivirus se reproduit. Ainsi, à chaque nouveau chargement
de la disquette anciennement contaminée, l'antivirus se mettra en action.
Comme convenu le mois dernier, nous vous proposons un
organigramme. Celui-ci présente le programme et sa structure d'une manière simplifiée. Il
vous permettra (normalement) une plus grande compréhension du fonctionnement de l'antivirus.
Notons qu'on y retrouve les trois modes d'accès à la routine : par un autochargement, une
réinitialisation ou par l'insertion d'une disquette alors qu'un programme est en cours.
Nous allons profiter de la dernière partie de la routine de l'antivirus pour étudier le
trackdisk.device et la bibliothèque Intuition.
Nous avions étudié les périphériques logiques d'une manière très générale il y a de cela
deux mois. Rappelons seulement que ce sont des routines
en ROM (NDLR : ou chargées en mémoire depuis le répertoire Devs: de la disquette Workbench)
assez puissantes, qui s'occupent de divers tâches. Le trackdisk.device est une sous-partie
de ces périphériques logiques. Comme son nom l'indique, il permet l'accès aux disquettes. C'est-à-dire que
grâce à lui, on peut par exemple lire une partie de la disquette. Dans le cadre de notre programme,
nous l'utilisons pour recopier l'antivirus sur le bloc d'amorce. Le trackdisk.device
offre 18 commandes dont voici les plus importantes :
Nom |
Numéro |
Fonction |
READ |
2 |
Lecture de n secteur |
WRITE |
3 |
Écriture de n secteur |
UPDATE |
4 |
Report du tampon de piste sur la disquette |
CLEAR |
5 |
Annonce l'invalidité du tampon de piste |
MOTOR |
9 |
Allumage/extinction du moteur du lecteur |
SEEK |
10 |
Déplacement de la tête de lecture |
FORMAT |
11 |
Nombre de pistes à initialiser |
CHANGENIM |
13 |
Indication du nombre de changements de disquettes |
CHANGESTATE |
14 |
Vérifie que la disquette est insérée |
PROSTATUS |
15 |
Vérifie si la disquette est protégée |
GETDRIVETYPE |
18 |
Indique le type de lecteur utilisé |
GETNUMTRACKS |
19 |
Donne le nombre de pistes que contient la disquette |
ADDCHANGEINT |
20 |
Installation d'une routine d'interruption appelée à chaque insertion d'une nouvelle disquette |
REMCHANGEINT |
21 |
Annulation de cette interruption |
LASTCOMM |
22 |
Envoie la dernière commande |
Il s'agit maintenant d'utiliser ces valeurs ; rappelez-vous que pour utiliser les périphériques logiques,
il faut absolument faire appel à DoIO. Cependant, l'utilisation de DoIO
nécessite une structure I/O. N'oublions pas que notre antivirus ruse à mort pour ne pas
s'ennuyer à créer une telle structure : il utilise celle déjà conçue par le programme
principal. Comme vous pouvez le remarquer dans la routine, on transfère le contenu de A1
au label diskio pour sauvegarder l'adresse de base de la structure I/O. Ensuite, il
suffit de savoir que le décalage 28 doit contenir le numéro de la commande à effectuer.
En l'occurrence, nous devons y "poker" la valeur 3 qui correspond à l'écriture. La zone
mémoire que nous désirons sauver étant notre programme lui-même, son adresse de base est
Deb. On "poke" donc cette valeur au décalage 40 de la structure I/O. Ensuite,
on veut transférer 1 ko, valeur qu'on communique (en octets) au décalage 36. Enfin,
le décalage 44 contient le numéro de l'octet à partir duquel les données doivent être sauvées.
Bibliothèque
Nous allons profiter d'une partie de la routine de ce mois-ci faisant appel à Intuition
pour examiner cette bibliothèque. Expliquons tout d'abord mais succinctement, ce cher
Max l'ayant déjà fait plus d'une fois, ce qu'est une bibliothèque. Que
ce soit en ROM ou sur disquette (cela dépend de la version de l'Amiga) il existe
des ensembles de routines classées par genre sous forme de bibliothèques. Ainsi, l'ensemble
des routines travaillant avec les disques seront présentes en dos.library, celles animant
les objets graphiques en graphics.library, etc. L'intuition.library concerne le
traitement des fenêtres. Bien que nous ayons toujours évité au maximum l'utilisation
des bibliothèques à cause de la lenteur d'exécution de leurs routines, nous faisons
exception cette fois-ci dans la mesure où le temps n'est pas un facteur important.
Effectivement, nous utilisons Intuition pour afficher un message d'alerte avec une
alternative à la clef : tuer ou non le virus résident. Comme le programme s'interrompt
dans l'attente d'une réponse, le temps d'exécution n'intervient plus ! Il est donc
inutile de faire compliquer en programmant directement les processeurs, alors qu'Intuition
le fait directement modulo quelques données.
Première chose à laquelle il faut procéder afin d'utiliser une quelconque routine
d'une bibliothèque, l'ouvrir. Ouvrir une bibliothèque signifie qu'elle doit être
chargée en mémoire. C'est-à-dire que si vous possédez un Amiga 500 ou 2000, l'ouverture
consistera à recopier depuis la ROM vers la mémoire vive la bibliothèque
qui vous intéresse. Ceci se fait au moyen de OpenLibrary(), routine de l'exec.library.
Vous savez déjà certainement que l'exec.library est toujours ouverte.
Examinons maintenant le déroulement même des opérations. Notons tout d'abord que l'accès
aux routines des différentes bibliothèques se fait grâce à l'instruction
JSR Offset(a6) où "Offset" est le décalage négatif de la fonction à appeler, calculé à
partir d'une adresse de base correspondant à la fin de la bibliothèque concernée. Remarquez
que nous ne nous ennuyons pas à initialiser A6 en ExecBase car en interceptant DoIO,
la routine LTZ conserve la valeur de A6 (DoIO est une routine de l'exec.library).
Ensuite, il suffit de savoir qu'OpenLibrary() renvoie en D0 la valeur de base de la
bibliothèque ouverte. Ainsi, en copiant le contenu de D0 dans A6, on pourra faire appel
aux routines de la bibliothèque ouverte. DisplayAlert requiert deux paramètres : les
dimensions de la fenêtre à afficher, et le pointeur sur le début du message.
La réinitialisation
Il reste maintenant à comprendre le fonctionnement de la réinitialisation. En bref, seuls
trois vecteurs nous intéressent. Tout d'abord le vecteur ColdCapture, de décalage 42 par rapport
à ExecBase, sert à intercepter le redémarrage "à froid", c'est-à-dire avant toute initialisation.
Ceci est source de bogue, par conséquent nous le mettons à 0, ce qui signifie qu'aussitôt
après une réinitialisation, il n'y aura aucun saut à une routine personnelle. Nous vectorisons
ensuite CoolCapture (de décalage 46) sur notre routine, car ainsi elle est appelée après les
initialisations. Enfin Chksum (de décalage 82) doit comporter la somme des octets compris entre
les décalages 34 et 78.
Install
Avant de nous quitter, il pourrait être intéressant d'insister sur Install. Imaginons le
cas suivant : notre antivirus est en mémoire, on procède à la réinitialisation
d'une disquette infectée. La réinitialisation étant vectorisée sur la partie de notre
antivirus concernant l'initialisation, au premier retour de notre routine, l'antivirus
n'a pas encore connaissance de la présence du virus. Ensuite, la première piste qui contient
le virus est lue et chargée en mémoire. On intercepte alors DoIO et on élimine le virus
du bloc d'amorce. Cependant, si nous en restions là, après être retourné au système
d'exploitation, l'antivirus s'exécuterait. Afin d'empêcher ceci, on remplace le programme
du virus par un programme inerte.
La fin
Ainsi s'achève notre antivirus. La forme sous laquelle il a été présenté dans ces trois
numéros permet à la routine de fonctionner uniquement sous Kickstart 1.2. En ce qui concerne le 1.3,
il faudrait changer l'adresse de DoIO. Il ne tient qu'à vous d'explorer la machine.
La première fois que vous désirez copier l'antivirus sur disquette, assemblez-le sous Seka
et chargez-le à partir d'un moniteur qui vous permet d'avoir le contrôle de somme
du bloc d'amorce. Vous retenez cette valeur que vous placez au label "checksum" après avoir
rechargé le source de l'antivirus sous K-Seka. Enfin, vous le lancez par un "jsr init" en
ayant pris soin au préalable d'avoir inséré une disquette infectée dans l'un des lecteurs.
Sur ce, je vous quitte et vous donne rendez-vous dans le prochain numéro avec un retour au
graphisme et donc aux démos - mais cette fois-ci, nous ferons appel au Blitter...
|