Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

La Temible Sección de Importaciones

De acuerdo, esta será la última entrada en la que se analiza el código de la nota ¡Al fin un código en Ensamblador! Y viene la parte mas dificil. Aunque el análisis lo haré linea por linea, voy a tratar de no confundirlos con terminología demasiado complicada. Primero va una breve explicación de lo que es una sección de importaciones:

Hace mucho tiempo, cuando la información se almacenaba en medios magnéticos y los monitores eran jorobados, no existía el concepto de multitarea, las computadoras ejecutaban un solo programa a la vez. A algún ocioso se le ocurrió que había funciones que todos los programas usaban y creo un concepto llamado bibliotecas. Que son unos archivos con esas funciones que todos necesitaban. Bueno. En la época antigua, donde solo se ejecutaba un programa a la vez, cada uno de estos recibía su propia copia. Esto funcionó hasta que llegaron los sistemas multitarea. Pues se tenían muchos programas con las mismas funciones. Esto trajo problemas como la sobresaturación de la memoria y dificultad para hacer actualizaciones rápidas. A otro ocioso se le ocurrió que en lugar de que en lugar de que todos tuvieran una copia propia, pudieran utilizar todos la misma, así no habia limite en cuantos programas pudieran usarla y todos eran actualizados de un golpe si ese archivo se cambiaba. La desventaja era que si uno de esos archivos se arruinaba, todos los que de él dependían se iban al demonio. En la sección de Importaciones, nuestra aplicación le dice al Windows que necesitamos las funciones MessageBoxA y ExitProcess que se encuentran en los archivos USER32.DLL y KERNEL32.DLL respectivamente.

Sabiendo esos pequeños detalles, allá vamos:

linea#21

section ‘.idata’ import data readable writeable

*Aquí iniciamos la sección de importaciones. Dice que la sección se llama .idata, que es de importación y que podemos leer y escribir en ella.

Linea #22

dd 0,0,0,RVA kernel_name,RVA kernel_table

*esta es la primera entrada de la tabla de importaciones, dd significa que los datos son de 32 bits, también llamados DWORDS (Double Words) en Intel. Los 3 primeros ceros son usados por el sistema para poner sus propios datos, kernel_name y kernel_table son las posiciones de memoria de otras 2 estructuras que definen que funciones están en que DLL’s. El acrónimo RVA significa Relative Virtual Address y es una posición virtual de memoria usada por un programa cuando se está ejecutando. Antes de investigar la memoria virtual, hay que hablar primero lo que es una posición de memoria.

Linea#23

dd 0,0,0,RVA user_name,RVA user_table

*Lo mismo que la anterior, solo que aquí se dan los datos referentes a USER32.DLL y su respectiva función ExitProcess.

Linea#24

dd 0,0,0,0,0

El directorio de la sección de importaciones acaba con una entrada hecha de 5 Dwords en cero.

Linea#26

kernel_table:

Esta es la etiqueta que indica la tabla de funciones cuyo acceso solicitamos a Kernel32.dll. Cada entrada de esta tabla contiene un DWORD que contiene la posición virtual relativa RVA de una cadena ASCII-Z que el windows usa para saber exactamente que funciones queremos.

Linea#27

ExitProcess dd RVA _ExitProcess

La Etiqueta ExitProcess hace referencia al RVA ExitProcess, esta es la primera entrada de la tabla kernel_table.

Linea#28

dd 0

Un DWORD inicializado en cero. Las tablas de funciones se finalizan con una entrada vacía al igual que el directorio de importaciones.

Lineas #29 a la 31

*Esta es otra tabla de funciones, es exactamente igual que la anterior pero para USER32.DLL y MessageBoxA. También es finalizada con una entrada en cero.

Linea#32

kernel_name db ‘KERNEL32.DLL’,0

*Este el el nombre del archivo DLL que necesitamos, es el que en el directorio de importación hace referencia kernel_name. Recuerden que el cero final es porque es una cadena ascii-z y que los elementos de una cadena ascii son todos de un byte(8 bits).

Linea#33

user_name db ‘USER32.DLL’,0

*Lo mismo que la linea anterior pero aquí el show es con USER32.DLL

Linea#34 y #35

_ExitProcess dw 0

db ‘ExitProcess’,0

Estas dos lineas representan una entrada en el directorio de funciones. No recuerdo de momento el nombre exacto, pero cada entrada consta de un WORD (Dato de 16 bits) seguido inmediatamente de una cadena ascii-z. Lo mismo aplica para las lineas 36 y 37.

Ultima linea:

section ‘.reloc’ fixups data readable discardable ; needed for Win32s

Esta es una de las secciones mas extrañas. Indica que se inicia la seccion de relocaciones. Esa sección se llama .reloc, y sus propiedades son fixups, datos, lectura y escritura. Esto tiene que ver con la forma como se acomoda un programa a la hora de ser ‘digerido’ por el windows. En pocas palabras, el programa es desarmado, reacomodado y la sección de importaciones es reescrita y los valores son sustituidos por las verdaderas posiciones usadas por el sistema. La sección de realojamiento hace compatible el ejecutable con casi todos los windows.

Y eso es todo por hoy, pero nuestro querido programa PEDEMO.exe no ha terminado. (Les recuerdo que yo no soy el autor original de ese programa)En notas subsiguientes explicaré con pelos y señales conceptos necesarios para entender este humilde programa. Cuando haya explicado con peras y manzanas conceptos tan peligrosos como el STACK, Stack Frame, Addressing y Virtualización de Memoria, estaremos en condiciones de ver un programa en ensamblador para Windows mas serio. Y porque no, si todo sale bien, hasta algo de DirectX para aquellos lamers que tienen miedo de no graduarse porque no encuentran de donde volarse un código de un juego en Ensamblador. Y, para ese que buscó __Ensamblador para tontos__. Quiero decirle que su muestra de humildad es apreciada. Pero que si realmente quiere programar, ¡Que recuerde que el Lenguaje Ensamblador no es para Dummies!

Anuncios

diciembre 26, 2008 - Posted by | Uncategorized | , ,

1 comentario »

  1. El juego ha sido originalmente creado por un equipo de desarrolladores llamado Col Dev, y aunque usan un motor de creación del vieojuego que ya existe, el agregan un toque muy personalizado al nuevo juego de Super Mario Bros que han nombrado Colombian Lands.

    Comentario por saul | diciembre 27, 2008 | Responder


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: