Autor Tema: Ensamblador  (Leído 2211 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado TXS

  • Administrador
  • Miembro Activo
  • *****
  • Mensajes: 1460
  • #include <threat>
    • Infierno Hacker
Ensamblador
« : 21/12/2009, 07:02:52 pm »
ENSAMBLADOR

FAMILIA INTEL X86 (8086)


1º PARTE


* INTRODUCCION:

El ensamblador, es un lenguaje de programación de bajo nivel muy apegado a la maquina.
Hoy en dia, algunas empresas de antivirus y videojuegos, siguen programando pequeñas rutinas en ensamblador por su rapidez y apegamiento al computador. Esto es debido, a que un programa en ensamblador, es ejecutado casi directamente por el computador, ya que hablan casi "el mismo idioma".

Programar en ensamblador, es un oficio minucioso de artesanía... seria como el carpintero de lapiz en oreja que va al bosque, tala el árbol, lo lleva al taller, lo pule, lima, da forma y saca el mueble.

Conocer algunos conceptos básicos del lenguaje ensamblador creo que es esencial para cualquier informático... acabado este pequeño curso, sabrán un poco mas, y tendrán otra visión de como funciona internamente un lenguaje de programación.

* INTEL 8086 Y 8088

Los intel 8086 y 8088 son dos microprocesadores creados en el año 1978 de 16 bits.
Pueden encontrar mas información sobre ellos en el siguiente enlace:
You are not allowed to view links. Register or Login

En una primera instancia comenzaremos trabajando con este modelo de 8 y 16 bits de memoria, empleando sus segmentos, registros...

* TURBO ASSEMBLER

Sera el programa que vamos a utilizar. Pueden descargarlo de el siguiente enlace:
You are not allowed to view links. Register or Login

La instalación es sencilla, pueden ver aqui los pasos:

You are not allowed to view links. Register or Login

You are not allowed to view links. Register or Login

You are not allowed to view links. Register or Login

You are not allowed to view links. Register or Login

Si todo sale bien, tendremos en INICIO > TODOS LOS PROGRAMAS > instalado el BORLAND TASM.


* NUESTRO PRIMER PROGRAMA

Para crear nuestro primer programa, emplearemos el bloc de notas, aunque mas adelante pueden descargarse si quieren otro editor como el notepad++ que la verdad esta bastante bien.

- Abrimos el block de notas y tecleamos el siguiente codigo:

Código: You are not allowed to view links. Register or Login
.model tiny
.stack
.data
Message db "hola$"
.code

start:
mov dx,OFFSET Message
mov ax, SEG Message
mov ds,ax
mov ah,9
int 21h

mov ax,4C00h
int 21h
END start

You are not allowed to view links. Register or Login

A continuación, hacemos clic en ARCHIVO > GUARDAR COMO y vamos a la ruta siguiente C:\TASM\BIN\ y lo guardamos como nombre.asm (en mi caso prc1.asm)

You are not allowed to view links. Register or Login

Hasta aquí, tenemos el código en ensamblador ya escrito. Ahora solo nos falta crear el .obj y linkarlo para obtener el .exe

Lo que haremos siempre que vayamos a general el .exe de algún código .asm sera lo siguiente:

- INICIO > EJECUTAR > CMD (se nos abrira la consola msdos)

- (Vamos a la ruta TASM/BIN). En mi caso, para llegar are:

Código: You are not allowed to view links. Register or Login
cd..
cd..
cd tasm
cd bin

You are not allowed to view links. Register or Login

- Ahora que estamos en el directorio donde tenemos nuestro codigo, (el prc1.asm) pasaremos a crear el .obj y linkarlo. Para ello usaremos los comandos:

Código: You are not allowed to view links. Register or Login
tasm prc1
tlink prc1

Si todo sale bien y no se produce ningun error, nos mostrara los mensajes de la imagen:

You are not allowed to view links. Register or Login

Ahora, ya tenemos generado nuestro prc1.exe

Sin cerrar la ventana del dos, escriban prc1 y se ejecutara el programa. Les mostrara por pantalla el mensaje ("hola") que habíamos escrito.

You are not allowed to view links. Register or Login

:) Ya tenemos nuestro primer programa en ensamblador!!


2º PARTE


Ahora que tenemos nuestro programa, vamos a pasar a ver que es todo eso que hemos escrito. Puede que al principio les resulte un poco lioso el tema de los bits, los segmentos... etc. Intentare explicar tan solo lo mas importante y de la forma mas entendible que me sea posible. Mas adelante profundizaremos mas en algunas cosas que por ahora tan solo are mención.

* RECORDANDO EL BINARIO

Antes de pasar a ver lo que es el lenguaje ensamblador en 80x86, vamos a recordar como se representan los números en una CPU.

La CPU es la Unidad Central de Proceso dentro de un microprocesador, tal informaron en la CPU se representa en binario, usando base 2. Un bit, es el elemento que representa el elemento basico unidad. Asi tenemos:

1 nibble > 0000 > 4 bits
1 byte > 0000 0000 > 8 bits o 2 nibbles
1 word > 0000 0000 0000 0000 > 16 bits, 2 bytes o 4 nibbles.

* REGISTROS

Los registros son los principales elementos de almacenamiento de la CPU. En INTEL, existen tres tamaños de registros:

De 8 bits.
De 16 bits.
De 32 bits para versiones superiores al 386.

Además, se especifican 4 tipos de registros básicos y registros de control.

- REGISTROS DE PROPOSITO GENERAL:

Son cuatro registros de propósito general:

AX – acumulador
BX – base
CX – contador   
DX – datos

Estos registros son de 16 bits, que se dividen en registros de 8 bits etiquetados como AH que contiene el byte alto y AL que contiene el byte bajo. A partir del 386 hay registros de 32 bits que conservan el mismo nombre y una E que le precede, esto seria EAX. Estos registros se pueden usar indistintamente como AL, AH, AX y EAX.

- REGISTROS DE INDICE Y REGISTROS DE PILA:

Los registros de indice son de 16 bits, tambien llamados registros de punteros. Los registros de control de pila, BP y SP se usan cuando manejamos una pila (snack). Estos registros les veremos mas adelante...

- REGISTOS DE SEGMENTOS Y OFFSET:

En los orígenes del 80x86 se pensó que nadie usaría mas de 1 MByte de memoria, tal que los primeros micros no permitían direccionar mas allá de este numero, es decir, se utilizan 20 bits de direcciones, tal que si queremos mas direccionamiento se podrian usar 2 registros de 16 bits. Esto da un numero binario de 32 bits. Sin embargo, esto es demasiado, por eso se crearon los segmentos y el desplazamiento (offset). Este modo de operación es el denominado modo real y se genero de la siguiente manera:

Dos registros de 16 bits, uno que contiene el segmento y otro el offset. Generan una dirección fisica de 20 bits, para ello, se colocan en posición tal que el registro segmento se mueve 4 posiciones a la izquierda y el offset a la derecha, también 4 posiciones dejando 4 bits a 0 respectivamente. Si se unen, se suman los 2 registros y se obtiene una dirección de 20 bits que nos da la dirección física en memoria.

Por ahora dejaremos esto aqui. Cuando trabajen con los segmentos y los offset entenderán mejor esto que les acabo de contar.

* ENTENDIENDO UN POCO MEJOR NUESTRO PROGRAMA

Muestro a continuación nuestro programa:

Código: You are not allowed to view links. Register or Login
.model tiny
.stack
.data
Message db "hola$"
.code

start:
mov dx,OFFSET Message
mov ax, SEG Message
mov ds,ax
mov ah,9
int 21h
mov ax,4C00h
int 21h
END start

Iremos viéndolo linea a linea:

Código: You are not allowed to view links. Register or Login
.model tinyEs la directiva de modelo de programación. Por ahora comenzaremos siempre el programa asi.

Código: You are not allowed to view links. Register or Login
.stackEs la directiva de asignacion de segmento. Por ahora siempre lo escribiremos.

Código: You are not allowed to view links. Register or Login
.dataEs la directiva de asignacion de datos, a partir de aqui, asignaremos las variables que vayamos a utilizar, que en nuestro caso es una:

Código: You are not allowed to view links. Register or Login
Message db "hola$"Message contiene el mensaje que mostraremos en pantalla. El simbolo del dolar ($) indica el fin de la cadena, y siempre deberemos de tenerlo.

Código: You are not allowed to view links. Register or Login
.codeEs la directiva para el segmento de codigo.

Código: You are not allowed to view links. Register or Login
start:Indica el inicio del programa.

Código: You are not allowed to view links. Register or Login
mov dx,OFFSET Message
mov ax, SEG Message
La instruccion mov funciona de la siguiente forma:

mov destino, origen

De esta forma, moveremos a dx el offset de mensaje, y a ax el segmento de mensaje. Ya iran entendiendo el porque de todo esto.

Código: You are not allowed to view links. Register or Login
mov ds,axDS:DX apunta al mensaje.

Hasta este punto podemos quedarnos con el siguiente concepto:

Código: You are not allowed to view links. Register or Login
mov dx,OFFSET Message
mov ax, SEG Message
mov ds,ax

que estas tres lineas de codigo, "sirven para guardar nuestro mensaje y posteriormente pueda ser mostrado.

Continuemos;

Código: You are not allowed to view links. Register or Login
mov ah,9
int 21h

Entra en juego una INSTRUCCION, en este caso, la instruccion 21h.

La int 21h, sirve para "mostrar cosas por pantalla". Para que funcione, es necesario que en AH este el numero de la funcion a llamar. En nuestro caso, para mostrar nuestro mensaje deberemos pasar a AH la función numero 9, por eso, antes de invocar la instruccion 21h, hacemos un mov ah,9.

Código: You are not allowed to view links. Register or Login
mov ax,4C00h
int 21h
Es la instrucción de comparación para volver al DOS. De momento no veremos mas de estas dos lineas, pero las incluiremos siempre al final de nuestro codigo.

Código: You are not allowed to view links. Register or Login
END startFin

Con esta breve explicación, es mas que suficiente por ahora. Pasemos ahora a ver unos cuantos ejemplos de programas en ensamblador, que a base de practicar es como mejor se aprende.


3º PARTE


* PRACTICAS

PRACTICA 1:

Crearemos un programa que nos muestre dos mensajes por pantalla. Abra que incluir un salto de linea entre ambos mensajes.

- Este programa es similar al programa de ejemplo que vimos en el 1º capitulo, pero en esta ocasión tenemos que crear dos mensajes y poner un salto de linea.

Comenzaremos nuestro código como casi siempre aremos, definiendo en .data los mensajes:

Código: You are not allowed to view links. Register or Login
.model tiny
.stack
.data
   Mensaje1 db "estoy aqui",10,13,"$"
   Mensaje2 db "ahora salte$"
.code

En el Mensaje1, aparece entre la cadena y el dolar ($) un "10,13". Esto indica salto de linea. Seria como un "<<endl;" en C++, o mas claro, como si pulsásemos el INTRO en el M.Word.

A continuación, mostramos los dos mensajes como ya sabemos, dentro del start:

Código: You are not allowed to view links. Register or Login
start:
mov dx,OFFSET Mensaje1
mov ax, SEG Mensaje1
mov ds,ax
mov ah,9
int 21h

mov dx,OFFSET Mensaje2
mov ax, SEG Mensaje2
mov ds,ax
mov ah,9
int 21h

mov ax,4C00h
int 21h
END start

Como vemos, tenemos las dos partes de codigo iguales (una para mostrar cada mensaje) y despues el 4C00h para cerrar bien el programa.

Con esto, ya tendriamos creada nuestra 2º practica. El codigo final seria este:

Código: You are not allowed to view links. Register or Login
.model tiny
.stack
.data
Message db "hola",10,13,"$"
Message2 db "salto$"
.code

start:
mov dx,OFFSET Message
mov ax, SEG Message
mov ds,ax
mov ah,9
int 21h

mov dx,OFFSET Message2
mov ax, SEG Message2
mov ds,ax
mov ah,9
int 21h

mov ax,4C00h
int 21h
END start



PRACTICA 2:

En la siguiente practica crearemos un programa que nos detecte una tecla pulsada y nos la muestre:

Comenzaremos de la misma forma de siempre:

Código: You are not allowed to view links. Register or Login
.model tiny
.stack
.data
  Teclea db "Teclea una letra: $"
.code

Seguimos con el start y mostrando nuestro mensaje por pantalla:

Código: You are not allowed to view links. Register or Login
start:

mov dx,OFFSET Teclea
mov ax, SEG Teclea
mov ds,ax
mov ah,9
int 21h

Ahora, tenemos que leer una pulsación de teclado. Para ello, existe otra instrucción que es la "int 16h". Para que la instrucción 16h lea un carácter de pantalla, en AH tiene que haber 0. El codigo ascii de la tecla pulsada, se almacena en AL. Podéis ver mas sobre esta instrucción en el siguiente enlace: You are not allowed to view links. Register or Login aunque mas adelante iran saliendo ejemplos diferentes y veremos mas de ella.

Por lo tanto, la complejidad de leer una pulsación teclado radica en meter un 0 en AH, invocar la instruccion 16h, y la pulsación quedara almacenada en AL (posteriormente la usaremos)

El codigo es este:
Código: You are not allowed to view links. Register or Login
xor ah,ah
int 16h

AH por defecto tendra un valor desconocido, lo que es igual a basura. Para meten en AH un 0, tenemos 2 opciones.

1º: hacer un mov ah,0 (para dejar en ah un 0)

2º: hacer un XOR de ah,ah para dejar 0 en AH. Esta es la manera mas pulcra de dejar a 0 cualquier variable. Si saben algo de puertas lógicas lo entenderán. La puerta XOR, tambien llamada oexcluiva, mirando su tabla de la verdad, vemos que cuando en A tenemos lo mismo que en B, el resultado sera 0. Para quien le quede dudas, puede ver la tabla de verdad de la puerta XOR en: You are not allowed to view links. Register or Login

Pues bien, despues del xor ah,ah, tendremos un 0 en ah, de esa forma ahora llamamos a int 16h y nos guardara una tecla pulsada.

Después de que el usuario puse la tecla, dijimos que quedaba almacenada en AL.

Ahora, para poder mostrar ese carácter pulsado, y que esta almacenado en AL tenemos que hacer lo siguiente:

Código: You are not allowed to view links. Register or Login
mov dl,al
mov ah,02h
int 21h

Para mostrar un carácter, usaremos la misma instrucción que para mostrar una cadena. La instrucción 21h (int 21h), pero no es lo mismo mostrar un mensaje que un caracter.

Para mostrar un carácter con la instrucción 21h deberemos hacer lo siguiente:

  - Meter en AH el numero (la función) 02h (mostrar un solo caracter)
  - La función 02h muestra el carácter que este en DL, por lo tanto, mover el dato a mostrar a DL.

Por esta razón que en el código moviese a dl el valor de al, y luego en ah metiese el 02h. Luego llamando a int 21h nos muestra el caracter.

Finalizamos el codigo asi:

Código: You are not allowed to view links. Register or Login
mov ax,4C00h
int 21h
END start

Aqui tenemos el algoritmo completo de nuestra 2º practica:

Código: You are not allowed to view links. Register or Login
.model tiny
.stack
.data
Teclea db "Teclea una letra: $"
.code

start:

mov dx,OFFSET Teclea
mov ax, SEG Teclea
mov ds,ax
mov ah,9
int 21h                ;hasta aquí mostramos el mensaje

xor ah,ah             ;con esto pongo ah en 0
int 16h                ;detectar una pulsacion

mov dl,al             ;estas tres lineas nos permiten mostrar el caracter de pantalla
mov ah,02h
int 21h

mov ax,4C00h
int 21h
END start

* Se me habia olvidado decir hasta ahora, que para los comentarios en ensamblador se usa el "punto y coma" (;)



Mañana mas ejemplos y programas.... ;)
« Última Modificación: 22/12/2009, 07:03:07 pm por TXS »
La gloria de un pueblo, no reside en el poder del gobernante para mandarlos a la muerte segura, sino en saber que el rey muera con su pueblo ante cualquier guerra.

Desconectado KilerSys

  • Moderadores
  • Hell user
  • *****
  • Mensajes: 359
  • Sexo: Masculino
    • Spanish Security Group
Re: Ensamblador
« Respuesta #1 : 21/12/2009, 10:36:06 pm »
Hay que decir que es interesante saber programar en ASM, pero da pereza por el mucho código que necesita para una pequeñez. Aún así quiero aprender por los componentes. :P
You are not allowed to view links. Register or Login

Desconectado pasqui

  • Administrador
  • Residente
  • *****
  • Mensajes: 3288
  • El saber no es suficiente, tenemos que aplicarlo
Re: Ensamblador
« Respuesta #2 : 22/12/2009, 04:19:48 am »
amigo, esta fue mi asignatura pendiente, y me tengo que quitar la espinillita que tengo clavada, please te lo pide tu viejo amigo pasqui, montemos, una sección o tutoriales para este lenguaje,

ensamblador,

tengo que poder con él, gracias TXS

saludos,


You are not allowed to view links. Register or Login

Desconectado RedAssSam

  • Recien llegado
  • *
  • Mensajes: 41
Re: Ensamblador
« Respuesta #3 : 22/12/2009, 05:34:12 am »
Llevaba tiempo pensando aprender ASM, pero se me hacía siempre muy complicado. A ver que tal ando esta vez...  :P

Por cierto, lo visto aquí se aplica a Windows, ¿funcionaría también sobre Linux?
Bombing for the peace is like fucking for virginity.

Desconectado KilerSys

  • Moderadores
  • Hell user
  • *****
  • Mensajes: 359
  • Sexo: Masculino
    • Spanish Security Group
Re: Ensamblador
« Respuesta #4 : 22/12/2009, 08:20:19 am »
Eso iba a preguntar yo ahora jajaja. ¿Para los Linuxeros qué?
You are not allowed to view links. Register or Login

Desconectado Skywalker

  • Administrador
  • Residente
  • *****
  • Mensajes: 6380
  • Sexo: Masculino
  • Skywalker hack
    • Infierno Hacker
Re: Ensamblador
« Respuesta #5 : 22/12/2009, 10:31:52 am »
You are not allowed to view links. Register or Login
Eso iba a preguntar yo ahora jajaja. ¿Para los Linuxeros qué?
Pues assembler no tiene nada que ver con el SO por asi decirlo. Sino que maneja el hardware. Pues funcionaria en todos los SO siempre y cuando exista el debido compilador para cada SO.
Para linux puedes usar GCC y trabajar igual que en win, solo que las llamadas del sistema y manejo de datos en la memoria lo harias diferente. Con este tuto aprendi yo:

You are not allowed to view links. Register or Login

Saludos
You are not allowed to view links. Register or Login
"Lo único que nunca podrán quitarnos serán nuestras mentes"

Desconectado KilerSys

  • Moderadores
  • Hell user
  • *****
  • Mensajes: 359
  • Sexo: Masculino
    • Spanish Security Group
Re: Ensamblador
« Respuesta #6 : 23/12/2009, 04:25:28 pm »
Bien, muchas gracias Sky. ;)
You are not allowed to view links. Register or Login

Desconectado RedAssSam

  • Recien llegado
  • *
  • Mensajes: 41
Re: Ensamblador
« Respuesta #7 : 25/12/2009, 09:09:32 am »
 ;) Gracias Sky.
Bombing for the peace is like fucking for virginity.

Desconectado d4rk_dn4

  • Moderadores
  • User Infernal
  • *****
  • Mensajes: 646
  • Sexo: Masculino
  • You may be a lover but you ain't no dancer
    • El blog de d4rk_dn4
Re: Ensamblador
« Respuesta #8 : 25/12/2009, 11:05:47 am »
Muy bueno TxS  ;)
Espero la proxima parte  ;D

You are not allowed to view links. Register or Login
La resignacion est un suicide quotidien
Excuse me while I kiss the sky.

Desconectado d33k40

  • User Infernal
  • ****
  • Mensajes: 740
  • Sexo: Masculino
  • En la tierra de los ciegos, el tuerto es el rey.
Re: Ensamblador
« Respuesta #9 : 25/12/2009, 11:41:40 am »
Gracias por esto TXS  ;D se agradece.

Saludos.
dεεk4Θ

⠠⠵


Desconectado DLD

  • Leecher
  • *
  • Mensajes: 1
Re: Ensamblador
« Respuesta #10 : 09/07/2010, 11:07:27 pm »
Supongo que estó ya no va a seguir, o si?  ::)

Saludos.

Desconectado TXS

  • Administrador
  • Miembro Activo
  • *****
  • Mensajes: 1460
  • #include <threat>
    • Infierno Hacker
Re: Ensamblador
« Respuesta #11 : 10/07/2010, 04:03:58 am »
You are not allowed to view links. Register or Login
Supongo que estó ya no va a seguir, o si?  ::)

Saludos.

Espero continuar con ello un poco mas. Necesito sacar tiempo para eyo!
Algo mas abra.

Saludos.
La gloria de un pueblo, no reside en el poder del gobernante para mandarlos a la muerte segura, sino en saber que el rey muera con su pueblo ante cualquier guerra.

Desconectado Mkdir

  • Moderadores
  • Usuario guru
  • *****
  • Mensajes: 1733
  • Sexo: Masculino
  • ...
    • Linux en vivo
Re: Ensamblador
« Respuesta #12 : 01/08/2010, 09:41:57 pm »
¡Bastante interesante!
You are not allowed to view links. Register or Login

Desconectado kevin11

  • Leecher
  • *
  • Mensajes: 1
  • Sexo: Masculino
Re:Ensamblador
« Respuesta #13 : 03/09/2011, 08:18:14 pm »
MUY BIEN !!  :8:

Desconectado hackw32

  • Hell user
  • ****
  • Mensajes: 285
  • Sexo: Masculino
  • BlackHat Hackw32
    • Hackw32
Re:Ensamblador
« Respuesta #14 : 25/12/2011, 03:53:19 am »
excelente tutorial , útil para la Ingeniería Inversa


You are not allowed to view links. Register or Login - You are not allowed to view links. Register or Login - You are not allowed to view links. Register or Login - You are not allowed to view links. Register or Login