Você está na página 1de 13

1

[RVLCN]

C L A SE S de P r og r a m a c i On C ON M A SM + Ra da sm
C a pi tu l o I I :N u e str a Pr i me r a A p l i c ac i o n. Escrito por: ^A|An M0r3N0^
Consejero: RedH@wk
DESCARGO LEGAL

El presente escrito, creado para fines educacionales e investigacion. Es de libre distribucion, siempre que se conserve intacto el contenido y se precise derechos de autor.

[RVLCN]

[ Estructura de nuestros Programas]


Para crear un programa en MASM32 se debe seguir una estructura que pueda entender nuestro compilador por ejemplo: .386 .model flat, stdcall option casemap:none include windows.inc include kernel32.inc includelib kernel32.lib .data .code Prog001: invoke ExitProcess,0 end Prog001 Con ese c digo ya hemos creado un programa que pueda entender nuestro compilador y as crear nuestra aplicaci n, ahora explicare para que sirve cada una de las secciones del c digo: .386.- Esta directiva sirve para establecer el tipo de procesador y sus instrucciones con lo que se va a trabajar, en esta caso 80386. .model flat, stdcall.- Aquestablecemos el modelo de memoria requerido para nuestros programas de 32 bits. option casemap:none.- Esta opci n hace sensible las may sculas de las min sculas es decir que por ejemplo Z es diferente a z. Include y Includelib.- MASM32 incluye archivos y librer as para manejar un gran numero de funciones que existen en Windows, a estas funciones se les llama APi, como por ejemplo la API ExitProcess que esta en nuestro c digo. El include se utiliza para agregar archivos con extensi n .inc y .asm El includelib se utiliza para agregar librer as con extensi n .lib MASM32 tambi n incluye el archivo window.inc donde encontramos un gran numero de constantes y estructuras usadas por las funciones de Windows (API). .data.- Existen dos tipos de informaci n, la informaci n inicializada y la no inicializada (.data?).

[RVLCN]

1.- Informaci n Inicializada (.data).- En esta secci n declararemos los datos que conocemos con los que inicia nuestro programa por ejemplo: .data Etiqueta MsgTexto Valor_1 Tipo de variable db dd Datos inicializados BiENVENIDO AL CURSO DE MASM + RADASM,0 7

2.- Informaci n No Inicializada (.data?).- En esta Secci n declararemos los datos que no conocemos o que vamos a escribir cuando el programa se ejecute usualmente lo utilizamos para almacenar datos, por ejemplo: .data? Etiqueta Buffer Valor_1 Tipo de variable db dd Datos No inicializados 128 dup (?) ?

.code.- Despu s de la secci n de datos debes indicar a MASM32 donde empieza el c digo del programa y tambi n donde termina, para ello he puesto la etiqueta Prog001 seguido de :, para indicarle que abajo empieza el c digo de nuestro programa, y al terminar el c digo del programa se escribe end mas la etiqueta que hemos declarado quedando de esta manera: end Prog001.

[ Programando en RadAsm]
1.- A nuestro c digo anterior implementaremos una nueva funci n para que muestre una ventana que nos de la bienvenida, para ello abrimos el RadAsm.exe, y comencemos programar como muestra el video:

Prog001.exe

[RVLCN]

[ Explicando el video Prog001.exe]


En nuestro programa que hemos desarrollado se ha utilizado 2 funciones: MessageBox ExitProcess Si abrimos nuestra documentaci n de las Apis de Windows (Win32 programmer s Reference) y buscamos la funci n MessageBox encontramos lo siguiente: int MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType ); HWND.- Este parmetro sirve para identificar el manejador de la ventana padre, nuestro caso colocamos NULL 0 por que no tiene manejador (handle). LpText.- Aqucolocamos la direcci n donde se encuentra nuestro mensaje. LpCaption.- En este parmetro funciona igual que lpText la diferencia que este es el titulo del mensaje uType.- Este parmetro es muy til al momento de crear nuestra ventana sirve para personalizar nuestro mensaje. Podemos especificar que tipo de botones deseamos y tambi n el icono, por ejemplo en nuestro programa se ha puesto las siguientes constantes: Botones Icono Estas constantes estn declaradas en el archivo window.inc MB_OK MB_ICONINFORMATION Para saber ms sobre esta funci n le sugiero que revise la documentaci n que mencione anteriormente. Todo programa que escribimos en MASM32 debemos colocarle la siguiente funci n: VOID ExitProcess( UINT uExitCode );

[RVLCN]

Con esta funci n cerramos nuestro programa, en el parmetro uExitCode se especifica el c digo de salida, en nuestro caso se ha puesto 0. invoke.- MASM32 tambi n tiene un sintaxis de alto nivel, que nos facilita llamar a nuestras funciones de forma correcta, es decir que al momento de compilar MASM32 comprobara si los parmetros de nuestra funci n son los correctos y se emplea de esta manera: INVOKE FUNCION, Argumentos FUNCION.- Es aqudonde escribiremos el nombre de la funci n que se va ah utilizar. Argumentos.- Los argumentos son los parmetros de las funciones y estn separadas por comas ,. 1.-Operadores en el archivo prog001.asm: addr.- Este operador sirve para pasar la direcci n de nuestra etiqueta hacia nuestra funci n por ejemplo las etiquetas MsgTexto y MsgTitulo. offset.- Es similar al addr pero con algunas diferencias como muestra el siguiente cuadro. addr No puede ser utilizado con instrucciones mnemonic Trabaja Solo con referencias que est n delante del c digo. Puede operar con estructuras. 2.-Operadores en el archivo prog001.inc: Windows tiene una gran cantidad de APi en nuestro sistema que son empleados por todos los programas de Windows, y estas APi o funciones la encontramos en las librer as de enlace dinmico (dynamic-linked libraries DLL), como por ejemplo: user32.DLL, kernel32.DLL, shell32.DLL, y nosotros para poder usar las funciones en nuestros programas necesitamos agregar 2 archivos para cada librer a: user32.inc y kernel.inc.- En estos archivos encontramos todas las funciones declaradas que pertenecen a user32.dll y kernel32.dll respectivamente, esto nos ahorra tiempo al momento de programar por que nos evita estar declarando las funciones que vamos a emplear, pero observemos su contenido para ver que contiene, para ello debemos abrimos los archivos .inc: Para abrir el archivo se alamos el nombre del archivo .inc que queremos abrir y presionamos el bot n derecho del Mouse, se despliega un men contextual donde hacemos clic a la opci n Abrir, como muestra la siguiente imagen: offset Se utiliza con instrucciones mnemonic Trabaja con referencias que est n delante y atrs del c digo. No puede operar con estructuras.

[RVLCN]

Fig. 1 Luego se abre una nueva ventanita en el RadAsm mostrando lo siguiente:

Fig. 2

[RVLCN]

Buscaremos nuestra API MessageBox presionando las teclas CTRL + F y escribimos la funci n que vamos a buscar, como muestra la siguiente imagen:

Fig. 3 Luego damos clic en el bot n hallar y encontramos lo siguiente:

Fig. 4 Ya hemos encontrado nuestra funci n y comprobado que esta API esta declarado en el user32.inc, si buscamos la otra API que hemos utilizado ExitProcess no lo encontraremos por que esa API esta en Kernel.inc. user32.lib y kernel.lib.- Para que nuestro programa se pueda enlazar a las librer as de uso dinmico de Windows, necesita informaciones como el nombre de la funci n y la direcci n donde se encuentra, para que al momento de ejecutar nuestro programa cargue la Liberia inmediatamente. Esta informaci n que he mencionado se encuentra en los archivos .lib.

[ Variables ]
Tipo BYTE WORD DWORD FWORD REAL4 QWORD REAL8 TBYTE REAL10 Tipos de Variables Abreviatura Espacio DB 1 byte 8 bits DW 2 bytes 16 bits DD 4 bytes o 32 bits DF 6 bytes o 48 bits DQ 8 bytes o 64 bits DT 10 bytes o 80 bits Descripci n Cadenas de texto y caracteres Valor entero en el rango: -32, 786 a +65, 535 Valor entero en el rango: -2gb a +4gb 48 bit con punto flotante 64 bit con punto flotante 80 bit con punto flotante

[RVLCN]

Veamos unos ejemplos de c mo se debe declarar las variables ( en la secci n .data y en .data?): EJEMPLO EN DATOS INICIALIZADOS .data Cadena db Valor dd Punto df .data Cadena Valor Punto BiENVENIDO AL CURSO DE MASM + RADASM,0 77 4.575 Que viene hacer lo mismo : BiENVENIDO AL CURSO DE MASM + RADASM,0 77 4.575

BYTE DWORD REAL4

EJEMPLO EN DATOS NO INICIALIZADOS .data? Acumulador db Contador dd FlotanteP df .data? Acumulador Contador FlotanteP ? ? ? Que viene hacer lo mismo : BYTE DWORD REAL4 ? ? ?

[ Creando plantilla en RaDAsm ]


El programador de Radasm ah pensado en todo y para no volver a escribir toda la estructura de nuestros programas cada vez que queremos programar, crearemos una plantilla como lo hago en el siguiente video:

[RVLCN]

Creando Plantilla.exe Si queremos ir a la carpeta donde esta nuestro c digo fuente abrimos el men Proyecto/Explorar Path como muestra la imagen:

Fig. 4 Y abre la carpeta donde tenemos nuestro c digo fuente:

10

[RVLCN]

Fig.5 2.- En el ejercicio anterior se ha utilizado los datos inicializados, ahora falta crear un ejemplo utilizando los datos no inicializados:

Prog001a.exe Se ha utilizado en el ejemplo Prog001a la funci n GetModuleFileName y se declara de la siguiente manera: Librer a Kernel32.lib

GetModuleFileName,NULL,addr Buffer,225
Esta funci n extrae el directorio ms el nombre de la aplicaci n, y la devolver en la variable Buffer, si ya fue ocupada la modificara y pondr nuevos caracteres, el valor 225 significa la longitud mxima de caracteres que va a devolver. Buffer cumple la funci n de almacenador de datos, donde almacenara la cadena de texto devuelta por la funci n que sea utilizado.

11

[RVLCN]

3.- Hagamos nuestro programa ms grande y un poco ms complejo para el siguiente ejemplo, para ello utilizaremos la librer a masm32.lib. Masm32 tiene su propia librer a donde podemos encontrar muchas funciones tiles que muchas veces necesitamos y no la tomamos en cuenta, en el siguiente video utilizaremos algunas de estas funciones, para ello Vamos a Crear un programa que muestre el directorio en un mensaje y en otro mensaje el nombre de la aplicaci n que se esta ejecutando:

prog002.exe

[ Funciones Utilizadas video prog002.exe ]


Librer a MAsm32.lib

GetAppPath,addr Buffer
Esta funci n devuelve el directorio de la aplicaci n y lo ara en la variable que hemos puesto en este caso Buffer y se quedara almacenado hasta que otra funci n remplace el dato que contiene la variable. Librer a MAsm32.lib

NameFromPath,addr Buffer,addr NombreApp


Como sabemos Buffer contiene el nombre mas el directorio de la aplicaci n por que ya fue utilizada por la API GetModuleFileName , y la funci n NameFromPath extraer solo el nombre y la almacenara en la variable NombreApp.

12

[RVLCN]

Operador DUP.- significa duplicaci n, se utiliza para separar espacios en la memoria y su sintaxis es de esta manera: Sintaxis: Contador dup (valor inicial) En contador escribimos el tama o que vamos a duplicar, y el valor inicial lo escribimos dentro del par ntesis si se pone el signo ? significa que es un valor indefinido. En nuestro c digo se ha declarado de la siguiente manera: Etiqueta Buffer NombreApp Variable db db Contador 225 50 DUP dup dup Valor Inicial (?) (?)

Y significa lo siguiente: En la variable Buffer se ha separado 225 bytes en la memoria y en la Variable NombreApp se ha separado 50 bytes en la memoria. Recomiendo que si se va ha utilizar una variable para almacenar todo tipo de cadenas de texto devueltas por las funciones, las variables declaradas tengan un espacio considerable a lo que se va obtener. Te preguntaras por que se hace esto, pues cuando utilices ms variables en tu c digo, si no le has separado un espacio considerable en la memoria a dicha variable que vas ha utilizar, la cadena de texto devuelta muchas veces invade las otras variables y esto te puede ocasionar problemas.

[ Ejercicio ]
Utilizando la ayuda Win32 programmer s Reference, para saber el uso y parmetros que corresponden a las funciones haga estos ejercicios: 1.- Crear nuevos mensajes, utilizando la API MessageBox, ejemplo prog001a:

Fig.6 2.- En el programa anterior agr gale la API MessageBeep, en el lugar donde usted quiera.

13

[RVLCN]

3.- Cree un programa que muestre el directorio de Windows en un mensaje y


despu s debe mostrar el directorio del sistema en otro mensaje, utilice las funciones: GetWindowsDirectory y GetSystemDirectory

[ Vocabulario ]
API (Application Programming Interface).- Interfaz de Programaci n de Aplicaciones, son funciones de uso general que se encuentran en nuestro sistema Windows, y estn almacenadas en librer as como por ejemplo user32.dll y kernel32.dll. Sintaxis.- Es una forma de combinaci n de las palabras seg n las reglas establecidas por el lenguaje de programaci n. Mnemonic (Nem nico).- En el lenguaje ensamblador, las instrucciones se representan por nem nicos o combinaciones de las letras que recuerdan el significado de la instrucci n en ingles.

[ Recordatorio ]
No olvidar preguntar en la lista MASM32-RadASM, las soluciones de estos ejercicios sern enviados a la lista dentro de una semana, tambi n puedes enviar tus propias soluciones. Si tienes Dudas, sugerencias, otros, tambi n hacerlas en lista.

[ El autor puede ser contactado ]


eMail: AlanStr@gmail.com Oberon@rvlcnsecurity.com Lista MASM32-RadASM http://groups.google.es/group/MASM32-RadASM www: http://RVLCN.com http://RVLCNsecurity.com http://beam.to/RVLCN http://beam.to/REVOLUCION

Julio-2006
Copyright(c) 2005-2006 RVLCN

Você também pode gostar