You are on page 1of 9

Introducción a la programación de virus en ASM – zeroPad

capítulo 2

Capítulo 2 Temas básicos de Windows
En este capítulo vamos a ver algunos conceptos que hay que tener bien claros antes de comenzar a programar nuestro código. Vamos a ver como hace Windows para e ecutar un programa y como sería el !ormato b"sico de un programa en #$%#. Como siempre vamos a ver lo b"sico y le de o a cada uno la tarea de pro!undizar cada tema. $unque parezca menos importante& si realmente queremos programar virus de calidad es necesario que se entiendan determinadas cosas. Empecemos. Vamos a realizar nuestro primer programa en assembler para e'plicar todo sobre el. (o que va a hacer nuestro programa es simplemente mostrar un mensa e en una ventana. )ara esto vamos a abrir el *ad$%# y seleccionamos $rchivo +, -uevo archivo y nos va a de ar una pantalla vacía para que comencemos a escribir nuestro código. .entro de esta ventana copiamos lo siguiente/ .012 .model !lat& stdcall option casemap/none include windows.inc include user02.inc include 3ernel02.inc includelib user02.lib includelib 3ernel02.lib .data mensa e titulo .code codigo/ push push push push call #6789 : #67;C8-;-<8*#$=;8o!!set titulo o!!set mensa e 5 #essage6o' db 4)rimer programa de prueba4& 5 db 4%ector Virus4& 5

push 5 call E'it)rocess end codigo

zeroPad2000@gmail.com

pág 1

Windows utiliza parte de la *$# y parte del disco rígido para e ecutar los programas de acuerdo al requerimiento de memoria que tenga& a este m?todo se lo denomina Dmemoria virtualE& obviamente no utiliza disco rígido a menos que sea absolutamente necesario ya que la velocidad de acceso es mucho menor.asm.Introducción a la programación de virus en ASM – zeroPad capítulo 2 $ntes que nada vamos a guardarlo& para esto hacemos clic en $rchivo +.H12p& etc. $hora veamos r"pidamente que es cada cosa/ . >uardar archivo y seleccionamos donde guardarlo.com pág 2 .model flat. Bo le puse asm55C. .I12. )or Altimo le damos a e ecutar y voil"& nos muestra la !amosa ventanita con el mensa e que le pusimos. )odemos crear una carpeta donde iremos poniendo nuestro código generado& por e emplo yo cre? la carpeta C/@(aboratorio& y le ponemos algAn nombre. zeroPad2000@gmail.model especi!ica el modelo de memoria del programa& en Win02 hay un solo tipo de memoria& la plana F!latG.H12& .386 Esto le dice al ensamblador que vamos a usar el con unto de instrucciones del 15012& tambi?n podemos usar . $hora hay que compilarlo y luego generar el e ecutable para poder correrlo& para esto hacemos clic primero en el icono que dice DEnsamblarE y luego sobre el que dice DEstructurarE Fpre!iero como se dice en ingl?s& D(in3E y D6uildEG.& . Cuando e ecutemos nuestro programa vamos a ver esos H >b de memoria& lo cual no signi!ica que tengamos H >b de memoria *$# disponible. Con este modelo de memoria es como si tuvi?ramos H >b de memoria disponible para nuestro programa F2J02 K H2LHL2M2L2& ya que estamos traba ando en 02 bitsG. stdcall .

)ara poder mane ar este esquema utiliza unas tablas denominadas Dtablas de p"ginasE por medio de las cuales relaciona secciones de esa memoria que nosotros utilizamos con memoria !ísica real.nter!ace de )rogramación de $plicacionesE.&/. stdcall .= F.8equ 05h #essage6o'$ )*8=8 /.incG que incluyen variables& estructuras y de!iniciones de !unciones para luego poder utilizarlas& por e emplo/ #67.((sG como son 3ernel02.dll& user02.mport $ddress =ableG. Cuidado con esto que a veces nos olvidamos y nos genera varios dolores de cabeza.W8*.ndica al ensamblador el orden que debe seguirse para pasar par"metros& Dizquierda a derechaE o Dderecha a izquierdaE option casemap:none Esto simplemente le indica al compilador que sea sensible a mayAsculas y minAsculas& o sea que no es lo mismo poner messagebo' que #essage6o'.com pág 3 .$= F..W8*.C8-ENC($#$=. Estas !unciones no se incluyen directamente en nuestro programa& sino que en el mismo se generan referencias para que en el momento de su e ecución las pueda utilizar y sepa donde encontrarlas. En caso de que no sea así genera lo que se llama un D!allo de p"ginaE y la carga en memoria *$# para que la podamos utilizar. Veamos un poco m"s que es esto de librerías y !unciones.dll& etc. includelib %irve para indicarle al compilador que librerías necesitamos que nos importe para poder e ecutar nuestro programa.Introducción a la programación de virus en ASM – zeroPad capítulo 2 El %8 Fsistema operativoG& para optimizar el proceso de mane o de memoria la !ragmenta en bloques& a los cuales llama Dp"ginas de memoriaE& esta DpaginaE representa el bloque mínimo de memoria a leer o a escribir& normalmente en Windows es de H9b. Cuando re!erenciamos una dirección de memoria& Windows traduce la dirección virtual en una real& luego veri!ica si est" cargada en memoria.W8*. zeroPad2000@gmail. En el primer caso se trata de la declaración de una constante& el segundo caso es la de!inición del prototipo de una $).s F$pplication )rogramming . include Este comando sirve para ad untar dentro de nuestro código otros archivos Fgeneralmente con e'tensión .&/.nter!aceG& o sea D.&/.W8*.mport =ableG e . Estas !unciones residen en librerías de enlace din"mico F. Esto proceso se realiza por medio de unas tabla que se incluyen en nuestros programas denominadas . )ara que podamos e ecutar nuestros programas& Windows nos provee una colección de !unciones que se denominan $).

6> y abramos el programa que acabamos de crear.code Esto determina las secciones que va a tener nuestro programa.dataO para las variables no inicializadas Fse reserva un espacio de memoria pero no se determina su valor inicialG. . ! mensaje %eguimos con el programa& esta línea lo que hace es de!inir una variable llamada Dmensa eE del tipo byte Fdb K data byteG inicializada como Q)rimer programa de pruebaR y terminada en 5& a estas cadenas se las denomina asciiz& son strings terminados en cero& para indicar donde terminan. Esto es así para que nuestro programa pueda ser e ecutado en distintas )Cs o con distintos sistemas operativos& e incluso con distintas versiones del mismo %8& las cuales a veces cargan las !unciones en distintas zonas de memoria. Esta mec"nica garantiza la compatibilidad entre los distintos %8.data / . la la la la primera indica la dirección a partir de la cual comienza ese bloque de memoria segunda indica el tamaPo que ocupa tercera el nombre del programa que la est" utilizando cuarta el nombre de la sección& ac" vemos las dos que de!inimos m"s una tercera llamada . )odemos tener varias secciones mas como puede ser . (uego presionamos sobre el icono que nos muestra la memoria F#G/ 8lly nos muestra un mapa de memoria en donde veremos los segmentos que tiene asignado nuestro programa.code para alo ar el código e ecutable de nuestro programa.Introducción a la programación de virus en ASM – zeroPad capítulo 2 6"sicamente& cuando Windows carga nuestro programa para e ecutarlo lo que hace es ver esas tablas para saber que !unciones necesita y llena las mismas con las direcciones en memoria donde residen estas !unciones.rdata donde tenemos el detalle de las !unciones importadas& y una que dice )E header& esto lo vamos a ver luego mas detalladamente db "Primer pro rama de prueba". $parte de datos del tipo byte FdbG& tenemos/ dw/ data word FC2 bytesG dd/ data double word F02 bytesG zeroPad2000@gmail.const para las constantes o .data es para declarar variables y . (o que hace esto es dividir nuestro código en segmentos lógicos& cada uno de los cuales va a tener un !in especí!ico& por e emplo . . #as adelante vamos a ver esto con un poco m"s de pro!undidad& ya que es un tema b"sico para la creación de nuestros especimenes.com pág 4 . . . $c" vamos a distinguir/ . )ara ver esto un poco me or e ecutemos el 8lly.

.. .. !! handle of o"ner "indo" #$%T&T' lpText.. !! address of text in message box #$%T&T' lp%aption.. Veamos un e emplo.... displays..s... The message box contains an application-defined message and title....... zeroPad2000@gmail..... pus" ! call #$itProcess Esta es una llamada típica a una $)... En este caso la !unción es E'it)rocess con el par"metro cero& la cual termina nuestro programa Fy le devuelve el control al %8G con el valor que queremos que retorne& en este caso cero.& primero se empu an a la pila los par"metros necesarios Fya vamos a ver de que se trata esto de la pila mas detalladamenteG y luego se llama a la !unción..end virus o lo que quisi?ramos.S()& bueno en ?l est"n las de!iniciones de las $). -os mostrar" el detalle de la !unción& los par"metros que hay que pasarle y los valores que devuelve/ The MessageBox function creates... ...Introducción a la programación de virus en ASM – zeroPad capítulo 2 codi o: . and operates a message box. Veamos algo& cuando instalamos los programas ba amos un archivo llamado W.com pág 5 ... !! address of title of message box ()NT uType !! style of message box *+ . plus any combination of predefined icons and push buttons. $brimos *ad$%#& y presionamos $yuda +.-02. Win02 $pi/ En la bAsqueda tipeamos #essage6o' y presionamos el botón D#ostrarE.. end codi o Esto indica donde comienza y termina nuestro código& el nombre es arbitrario& y le podríamos haber puesto virus.......... int MessageBox( HWN hWnd.

%i quieren verlo est" dentro de C/@masm02@include. . Vemos que nos muestra el mensa e que habíamos puesto.-. / MB. )or este motivo los par"metros que empu amos a la pila antes de llamar a la !unción se colocan en orden inverso a como lo vemos en la ayuda Fo o con estoG. $lgo m"s que vemos en el código que generamos es el operador offset& el cual es usado para pasar la dirección de una etiqueta a una !unción& o o& no el valor& sino la dirección donde se encuentra en memoria.ntroducimos H505C$ y le damos D89E. -os paramos sobre la ventana de dump Fvolcado de memoriaG y presionamos Ctrl+>& este comando es para buscar una dirección de memoria. %e basa en una metodología denominada (. =engamos bien presente esto ya que es b"sico& no pasamos el mensa e en sí& sino una re!erencia al mismo. %tac& (a pila o stac3 es un "rea de memoria usada por el programa para guardar variables temporales& argumentos de !unciones& direcciones de memoria& etc. )ara entender me or esto imaginemos una pila de libros& donde vamos poniendo uno encima del otro y cuando queremos sacar uno empezamos siempre por el que tenemos en la parte superior. Veamos en el segundo push& lo que hace es empu ar en la pila el valor H505C$ Tqu? es estoO -ada m"s ni nada menos que la dirección de nuestra variable DtituloE en memoria& esto lo podemos ver en la ventana dump.com pág 6 .-.Introducción a la programación de virus en ASM – zeroPad capítulo 2 )ara usarla en nuestro código tenemos que poner en la pila Fstac3G los par"metros y luego llamamos a la !unción con el comando call/ push push push push call MB.)%-N)N0-'M1T)-N offset titulo offset mensa2e 3 MessageBox MB. Vemos que el 8lly detecta autom"ticamente la llamada a #essage6o' y nos pone un detalle de los par"metros que le pasamos. $bramos el 8lly y carguemos el programa.inc que incluímos anteriormente. zeroPad2000@gmail. y MB.)%-N)N0-'M1T)-N son dos constantes que est"n de!inidas en el archivo windows.<8 Flast in& !irst outG& o sea que el Altimo en entrar ser" el primero en salir.

com pág 7 .6 F=hread . *ecordemos que estamos en un entorno multiproceso por eso Windows debe mantener varios procesos e ecut"ndose a la vez Fpara de!inir proceso digamos que es un programa en e ecuciónG. (os hilos permiten dividir un programa en m"s de una tarea para que corran simult"neamente FmultiprogramaciónG. )ara mane ar esta in!ormación el %8 mantiene una estructura llamada =. )or cada proceso tenemos por lo menos uno. )resionemos sobre la opción D%how threadsE F=G/ B veremos los hilos de e ecución de nuestro proceso. El %8 lleva una tabla por cada proceso en e ecución llamada )E6 F)rocess Environment 6loc3G donde contiene datos del proceso para luego retomar su e ecución. (os threads comparten la C)V de la misma !orma que lo hacen los procesos& sin embargo los threads de un proceso no son independientes ya que todos comparten el mismo espacio de direcciones& las mismas variables globales& el mismo con unto de archivos abiertos& los procesos hi os& etc. =ambi?n podemos ver todos los procesos en e ecución en este momento en nuestra computadora& si en Windows presionamos Ctrl+$lt+%upr y elegimos la opción D$dministrador de tareasE& y luego vamos a la solapa que dice D)rocesosE/ zeroPad2000@gmail. Cuando nuestro programa est" en disco no puede realizar ninguna acción& para que esto suceda el %8 operativo tiene que De ecutarloE& b"sicamente lo que hace el %8 como vimos antes es crear un espacio de memoria para alo arlo y crea tambi?n unas estructuras para poder correrlo.6> y llamemos nuevamente a nuestro programa.Introducción a la programación de virus en ASM – zeroPad capítulo 2 $ntes de continuar veamos unos conceptos que tambi?n son importantes.n!ormation 6loc3G. En este caso tenemos solo un proceso con un Anico hilo pero segAn el programa ac" podemos tener varios. $dem"s de procesos tenemos algo llamado threads& esto b"sicamente signi!ica Uhilo de e ecuciónE. $bramos nuestro querido 8lly.

(( por sí mismo no es un módulo& el cargador FloaderG lo tiene que cargar primero en memoria. Vn ENE o un . . Como siempre& veamos esto en 8lly.Introducción a la programación de virus en ASM – zeroPad capítulo 2 )ara terminar& veamos que son los DmódulosE de un programa. Estos recursos son los módulos& y van a estar compuestos por el propio programa y todas las librerías que necesite F3ernel02.dll& user02.com pág 8 . $bramos nuevamente nuestro programa y presionemos sobre el icono D%how modulesE FEG/ Vamos a ver los módulos que utiliza nuestro programa/ (a in!ormación que nos muestra es la siguiente/ . base de la memoria a partir de la cual es cargado tamaPo punto de entrada FE) K entry pointG& esto lo vamos a ver mas adelante nombre versión del archivo ruta en el disco y nombre del programa zeroPad2000@gmail. .dll& etc. . Cuando Win02 carga el programa para ser e ecutado necesita de ciertos recursos que el %8 pone a su disposición.G. . . Cada módulo en memoria se correlaciona directamente con un archivo en alguna parte del disco.

$%# de $lan #oreno y *edSWw3 Fcapítulo 2G .com pág 9 . =utorial de $%# de .Introducción a la programación de virus en ASM – zeroPad capítulo 2 6ueno& esto es todo por ahora. )rogramación con #$%#:*$. *e!erencias . // zero)ad // $bril de 255M zeroPad2000@gmail. %e que la introducción se est" haciendo larga& pero es importante ver estos temas y tenerlos bien claros para que luego se entienda lo que viene.czelion Fparte C y 2G 6ueno& se !ue la segunda entrega& nos vemos en la pró'ima.