Obligement - L'Amiga au maximum

Lundi 25 juin 2018 - 04:27  

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 in other languages


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 (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 devices 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 devices. 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 devices, 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 l'offset 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 à l'offset 40 de la structure I/O. Ensuite, on veut transférer 1 ko, valeur qu'on communique (en octets) à l'offset 36. Enfin, l'offset 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 l'offset 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, d'offset 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 (d'Offset 46) sur notre routine, car ainsi elle est appelée après les initialisations. Enfin Chksum (d'offset 82) doit comporter la somme des octets compris entre les offsets 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...

assembleur
assembleur
assembleur

assembleur


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