Curso Radasm II

13
1 [RVLCN ] C LA SES de P r ogr a m a c iOn C ON M A SM +Ra da sm C a pitul o I I :N u e s tr a Pr ime r a A plica ci 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.

Transcript of Curso Radasm II

Page 1: Curso Radasm II

1 [RVLCN]

C L A SES de P r og r a m a c iOn C ON M A SM +Ra da sm

C a p itulo I I : N ue str a Pr ime r a A p lica cio 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.

Page 2: Curso Radasm II

2 [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.- Aquí establecemos 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?).

Page 3: Curso Radasm II

3 [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 Tipo de variable Datos inicializados MsgTexto db “BiENVENIDO AL CURSO DE MASM + RADASM”,0 Valor_1 dd 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 Tipo de variable Datos No inicializados Buffer db 128 dup (?) Valor_1 dd ? .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

Page 4: Curso Radasm II

4 [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 parámetro sirve para identificar el manejador de la ventana padre, nuestro caso colocamos NULL ó “0” por que no tiene manejador (handle). LpText.- Aquí colocamos la direcció n donde se encuentra nuestro mensaje. LpCaption.- En este parámetro funciona igual que lpText la diferencia que este es el titulo del mensaje uType.- Este parámetro 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 están declaradas en el archivo window.inc

MB_OK MB_ICONINFORMATION Para saber más 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 );

Page 5: Curso Radasm II

5 [RVLCN]

Con esta funció n cerramos nuestro programa, en el parámetro 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 parámetros de nuestra funció n son los correctos y se emplea de esta manera: INVOKE FUNCION, Argumentos FUNCION.- Es aquí donde escribiremos el nombre de la funció n que se va ah utilizar. Argumentos.- Los argumentos son los parámetros de las funciones y están 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 offset No puede ser utilizado con instrucciones mnemonic

Se utiliza con instrucciones mnemonic

Trabaja Solo con referencias que esté n delante del có digo.

Trabaja con referencias que esté n delante y atrás del có digo.

Puede operar con estructuras. No 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 dinámico (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:

Page 6: Curso Radasm II

6 [RVLCN]

Fig. 1

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

Fig. 2

Page 7: Curso Radasm II

7 [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 dinámico 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 ]

Tipos de Variables Tipo Abreviatura Espacio Descripció n

BYTE DB 1 byte ó 8 bits Cadenas de texto y caracteres WORD DW 2 bytes ó 16

bits Valor entero en el rango: -32,

786 a +65, 535 DWORD DD 4 bytes o 32

bits Valor entero en el rango: -2gb a

+4gb FWORD ó

REAL4 DF 6 bytes o 48

bits 48 bit con punto flotante

QWORD ó REAL8

DQ 8 bytes o 64 bits

64 bit con punto flotante

TBYTE ó REAL10

DT 10 bytes o 80 bits

80 bit con punto flotante

Page 8: Curso Radasm II

8 [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 “BiENVENIDO AL CURSO DE MASM + RADASM”,0 Valor dd 77 Punto df 4.575

Que viene hacer lo mismo : .data Cadena BYTE “BiENVENIDO AL CURSO DE MASM + RADASM”,0 Valor DWORD 77 Punto REAL4 4.575

EJEMPLO EN DATOS NO INICIALIZADOS .data? Acumulador db ? Contador dd ? FlotanteP df ?

Que viene hacer lo mismo : .data? Acumulador BYTE ? Contador DWORD ? FlotanteP 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:

Page 9: Curso Radasm II

9 [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:

Page 10: Curso Radasm II

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 más 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 máxima 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.

Page 11: Curso Radasm II

11 [RVLCN]

3.- Hagamos nuestro programa más grande y un poco más 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.

Page 12: Curso Radasm II

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 Variable Contador DUP Valor Inicial Buffer db 225 dup (?) NombreApp db 50 dup (?) 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 más 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 parámetros 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.

Page 13: Curso Radasm II

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 están 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 serán 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: [email protected] [email protected] 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