Home
Download 1
Bug Exploit
Derechos C
Curso Hack
Sistemas O
Programación
Winlinux
CoreLinux
MP3
Bleem! CVGS
Y2K
Crack Warez
Video Hack
Foto Sony
Programación

Programacion en ASMa (el lenguaje de los virus y el unix)

LECCION 1:
CONOCIENDO LA MAQUINA.

Esta primera leccion va a ser sobre todo teorica.
No se puede programar en ensamblador sin tener un conocimiento mas o
menos profundo acerca de las  peculiaridades de la maquina que vamos a
programar. Esto es obvio, ya que en ensamblador tenemos un control total del sistema, por tanto, cuanto mas sepamos acerca de ‚l, mas provecho podremos sacar del mismo, y  mejores resultados obtendremos.

En primer lugar debemos saber con que‚ estamos trabajando, y no me refiero al lenguaje en si, sino a la computadora en cuestion. Tendremos que conocer de que partes consta, como se  comunican entre si, etc.
Esta parte teorica es casi imprescindible para poder entender ciertas tecnicas de programacion.

Vamos a estudiar la Pc en general, no distinguiremos entre distintas familias de procesadores  (8086,286,386,etc) ya que vamos a utilizar ensamblador del 8086. En realidad es el ensamblador que yo utilizo. Por tanto, aunque estemos programando sobre un 80586 o un 80486, desarrollaremos codigo ejecutable para la  familia 80x86 en general.
Cualquier exposicion que haga ser valida para toda la familia Pc.


Una Pc esta compuesta principalmente por procesador, chips de memoria, varios chips inteligentes o programables, y el  bus de datos y direcciones.
Junto con todo esto, nos encontramos los perifericos como son monitor,
disqueteras, teclado, etc, que se comunican con el procesador.
Esto (la comunicacion del procesador con  perifiricos) se vera mas adelante.

El procesador:

Es el chip que ejecuta los programas. El procesador o CPU,
lleva a cabo una gran variedad de calculos, comparaciones numericas y
transferencias de datos como  respuesta a las peticiones de los programas que estan siendo ejecutados en memoria.

La CPU controla las operaciones basicas de la pc enviando y recibiendo señales de control, direcciones de memoria y datos de un lugar  a otro de la maquina a traves de un grupo de 'sendas electronicas' llamadas BUS.
Localizadas a lo largo de este bus estan las puertas de entrada y salida
(E/S en castellano o I/O en ingles), las cuales conectan a  la memoria y a
los chips de apoyo al bus. Los datos pasan a traves de estas puertas de E/S
mientras viajan desde y hasta la CPU y otras partes del ordenador.

Como les dec¡a antes, trataremos el procesador 8086,  siendo valido todo lo
que digamos para el resto de procesadores de la familia PC.

El procesador 8086 es un procesador de 16 bits.
Esto quiere decir entre otras cosas, que el procesador va a manipular
en una  sola operacion datos de hasta 16 bits. Es decir, cuando transfiera
datos a la memoria o los traiga desde ella, lo podra hacer de 16 bits en
16 bits. Aqu¡ juega un papel decisivo el BUS de datos, ya que es por el  por
donde circulan los datos en las transferencias. Mas detalles unas cuantas
lineas mas abajo.

El procesador cuenta con una serie de registros usados para realizar
las operaciones de calculo, y como almacenamiento de datos.
Para que te hagas una idea, un registro del procesador es algo as¡ como
una zona de memoria dentro del procesador donde se puede almacenar
informacion, de forma que el acceso a esta informacion es instantaneo,
ya que no hay que utilizar el bus de datos que conecta el procesador con
la memoria para obtener dichos datos.

 Estos registros se dividen en 5 grupos, segun sus funciones:

1. Registros de datos: AX, BX, CX y DX.

Se usan para calculo y almacenamiento de proposito general. Son utilizados
por los programas para realizar  calculos, as¡ como para transferir datos
de una posicion de memoria a otra, ya que no se puede hacer de forma
directa.
Es decir, que no podemos transferir un dato de la posicion de memoria
X a la posicion Y  sin antes depositar ese dato temporalmente en un
registro del procesador.

Estos registros tienen una longitud de 16 bits, pero podemos
descomponerlos cuando nos interese en un par de registros de 8 bits.
Quedando de la forma siguiente:

AX = AH + AL
Siendo AX el registro de 16 bits, compuesto por la conjuncion (que no la
suma) de el registro AH de 8 bits (los 8 bits m s signiicativos o de mas
a la izquierda) y el registro AL de 8 bits (los 8 bits menos
significativos o de mas a la derecha).

BX = BH + BL
CX = CH + CL
DX = DH + DL

Para estos tres registros se aplica lo mismo que para el registro  AX.

Cada uno de estos registros tiene funciones especiales que es interesante
conocer. Por ejemplo el registro AX es el llamado acumulador, hace que
muchas operaciones tengan una forma mas corta, ya que lo  especifican
impl¡citamente. Es decir, que hay operaciones que actuan sobre el
registro AX en particular.
BX se suele utilizar en muchas instrucciones como registro base, sobre
todo en transeferencias de datos entre memoria y procesador.
CX es el registro contador, muchas instrucciones lo utilizan para hacer
incrementos o decrementos automaticos, para realizar bucles, etc.
DX es el  registro de datos, se suele utilizar para operaciones de 32 bits,
para almacenar los 16 bits (o palabra) mas significativos.

2. Registros Indice: SI, DI, BP y SP.

Se utilizan para acceder a memoria cuando se  establece el modo de
direccionamiento mediante indexacion o con punteros.
SI y DI indican el ¡ndice fuente y destino respectivamente.
BP y SP indican el puntero base y el puntero de la pila respectivamenete.
Mas adelante hablaremos de la pila (que es un tipo de datos estructurado).

Estos 4 registros son de 16 bits, y no pueden ser utilizados como
registros dobles de 8 bits.

3. Registros de Segmento: CS, DS, SS y ES.

 Estos registros apuntan al principio de un bloque de 64 ks de memoria o
segmento, de ah¡ lo de la 'S' con la que finalizan todos los registros:
CS: registro segmento de codigo. Establece al area donde se halla el
programa en ejecucion.
DS: registro segmento de datos. Especifica la zona donde el programa
lee y escribe los datos por defecto.
SS: registro segmento de pila. Especifica el area donde se encuentra la
pila del sistema.
ES: registro segmento extra. Se utiliza como una extension del segmento
de datos. Es decir, indica otra area de datos aparte del especificado
por DS.

4. Puntero de instruccion: IP.

 Su longitud es de 16 bits como el resto de registros.
Indica la direccion de la siguiente instruccion a ejecutar, y su valor es
ajustado durante la ejecucion de la instruccion en curso.
Esta direccion est en el  area de 64 ks de direcciones especificado
por CS.

CS e IP en conjuncion conforman la direccion f¡sica real de la siguiente
instruccion a ejecutar.
Mas adelante detallaremos este asunto.

 5.Registro FLAGS. O banderas de estado.

Su longitud es de 16 bits. Cada uno de estos bits contiene cierta
informacion booleano (verdadero o falso). Segun el valor de cada uno de
estos bits sea 1(verdadero) o  0(falso), informar del estado de alguna
situacion en particular.

Dentro del registro de FLAGS hay 7 bits que no se utilizan. Los nombres
de los utilizados son: Of, Df, If, Tf, Sf, Zf, Af, Pf y Cf.

 Estos bits se clasifican en dos grupos:
Flags de estado (Cf, Af, Of, Zf, Pf y Sf): muestran el estado del
procesador.
Flags de control ( Df, If, Tf): determinan como el procesador responder
a determinadas  situaciones. El programador manipular estos bits para
controlar el modo de ejecucion de algunas instrucciones.

A continuacion se muestra el significado de cada uno de los flags:

Cf: Bit de Carry (acarreo), se  activa (se pone a 1) si se produce acarreo
en una operacion aritmetica.
Pf: Bit de paridad, se activa si el resultado de una operacion tiene
paridad par, es decir, si el resultado tiene un par de unos.
Af:  Bit de carry auxiliar, se activa si una operacion aritmetica produce
acarreo de peso 16.
Zf: Bit de cero, se activa si una operacion produce 0 como resultado.
Suele ser el mas utilizado(mas consultado) por los  programadores,
por lo menos por mi . Se utiliza para comparaciones de datos
y para otras muchas cosas como ciertos bucles,etc.
Sf: Bit de signo, se activa si el bit m s significativo de un resultado
es 1. Por convencion cuando se opera con numeros negativos, se
utiliza el bit de mayor peso para indicar el signo: si el bit es cero,
entonces se trata de un numero positivo, si es 1, se trata de numero
negativo.
Tf: Bit trap o desv¡o. Si Tf=1, el procesador ejecuta las instrucciones
una a una bajo control del usuario. Se pone a 1 este bit para realizar
depuraciones del codigo que se est ejecutando. De esta  forma se puede
seguir el flujo del programa.
If: Bit de interrupcion, si vale 1, las interrupciones estan permitidas,
y si vale 0, no.
Df: Se usa en las instrucciones que manipulan cadenas de bytes.
Segun coloque el programador este bit, a '0' o a '1', las cadenas
de bytes seran tratadas en sentido de direcciones crecientes o
decrecientes.
Of: Bit de overflow, indica desbordamiento en una operacion  aritmetica.


La Memoria:
Los chips de memoria se dedican meramente a almacenar la informacion
hasta que se necesita.
El numero y la capacidad de almacenamiento de estos chips  que hay dentro
del pc determinan la cantidad de memoria que podremos utilizar
para los programas y los datos.
Normalmente la memoria siempre se ha dividido en dos tipos principales,
como son la RAM y la ROM.
De todos sera conocida esta distincion y sus carateristicas, as¡ que no
entro en el tema. Si alguien tiene alguna duda, que lo diga.
ok, en principio, nosotros vamos a trabajar con el rango de memoria
0  1048576, es decir, vamos a trabajar con el primer Mb(megabyte).
Existen tecnicas para tratar la memoria que hay en direcciones superiores
a estas, pero eso ya se vera despues.

Pues bien, en ese Megabyte inicial,  tenemos tanto RAM como ROM.
La memoria RAM que es la que usamos para almacenar tanto programas como
datos empieza en las direcciones bajas y llega hasta el inicio de la ROM.
La ROM, evidentemente est situada en  las posiciones altas de memoria, y
es ah¡ donde se almacenan las rutinas mas basicas de la pc, como
las rutinas de acceso a discos, pantalla, etc.

Un tema muy importante en el mundo del PC es la denominada  barrera de los
640 Ks que seguro habras oido hablar.
Esto quiere decir que aunque tengamos instalados 8 Megabytes en unuestra
pc, solo podremos ejecutar nuestro programa en las primeras 640 kb

Para poder  acceder a los 7 Megabytes restantes debemos utilizar funciones
especiales de manejo de memoria extendida, expandida, etc.
Pero bueno, eso no nos interesa ahora en absoluto.

Chips inteligentes:
Se trata de chips de apoyo, de los que  se sirve el procesador o el usuario.
Estos chips existen debido a que el procesador no puede controlar toda la
pc sin ayuda. Al delegar ciertas funciones de control a otros chips,
le queda mas tiempo libre para atender a su propio trabajo.
Estos chips de apoyo pueden ser responsables de procesos tales como el
flujo de informacion a trav‚s de la circuiter¡a interna(como el controlador
de  interrupciones y el controlador DMA) y controlar el flujo de informacion
de uno a otro dispositivo(como un monitor o una unidad de disco) concectado
a la pc.
En resumen, estos chips estan ah¡ para librar de  trabajo al procesador.


Bus de direcciones:
El bus de direcciones del Pc utiliza 20 l¡neas de señal para transmitir
las direcciones de memoria y de los dispositivos conectados al bus.
Como a trav‚s de cada  una de esas 20 lineas pueden viajar dos posibles
valores(0 o 1, es decir tens¡on alta o tension baja), el pc puede
especificar 2^20 (2 elevado a 20) direcciones. Es decir puede direccionar
1 Megabyte. Estamos  hablando del 8086 con un bus de direcciones de 20 bits.
Modelos superiores como el 80386 o el pentium direccionan muchisimo mas,
tanto como les permite su bus: 32 bits en el caso del 386 y 64 bits en el
caso  del pentium. Es decir, 2^32 y 2^64 direcciones respectivamente.


Bus de datos:
El bus de datos trabaja con el bus de direcciones para transportar los datos
a traves de la pc. Este bus de datos es de 16 bits, al igual que el
tamaño de registro. Aunque no tiene que coincidir, como sucede con el
procesador 8088, el cual tiene un tamaño de registro de 16 bits y un bus
de datos de 8 bits. Esto es as¡ por simple econom¡a. Por ahorrar costes.
Claro que tiene su parte mala, y es que es mas lento al realizar
transferencias de datos.

Bueno, bueno, bueno... Todo esto que parece muy  chamuyo es muy importante.
No es lo mismo programar sabiendo con que se trabaja ,que programar a ciegas.
Muchas veces es imprescindible recrear graficamente ciertas instrucciones,
para darse cuenta de un fallo en el programa.

 

Last update Marzo 5  del 2001

Copyright © by Hackersdark HACKSTORE. All Rights Reserved. 2001