sábado, 5 de marzo de 2011

ENSAMBLADOR & DESENSAMBLADO

ENSAMBLADOR


A la hora de crackear hay que tener unos conocimientos basicos de ASM, mientras mas mejor. Los programas son un listado de ordenes que se reproducen en lenguaje maquina, pero que para poder realizarlos tenemos este lenguaje que consiste en una serie de mnemotecnicos que facilitan su interpretacion, cada una de las instrucciones se codifican en una serie de numeros binarios, a traves de un compilador, que lo que hace es traducir una serie de instrucciones dando igual si se programaron en C, C++, pascal, a unos y ceros.... Espero que te hayas bajado los tutoriales que te recomende en el primer capitulo, porque lo que voy a hacer aqui es una breve introduccion a la forma de trabajo y a sus principales instrucciones.

Este lenguaje consta de una instruccion y dos operandos llamados registros en los que se almacenan las cosas, osea que un registro es igual a una variable en otro lenguaje.

Los registros


- AX BX CX DX

Voy a explicar el primero por que los otros tres, quitando algunas particularidades que sirven a la hora de programar son basicamente igual.AX: AX es un registro de 16 bits (16 unos o ceros, o dos bytes) se divide a su vez en otros dos de ocho AL (Low) y AH (High), esto era principalmente en ordenadores anteriores al 386 ya que a partir de estos se expandio creando el registro EAX (Extended) de tamaño 32 bits (Ademas, hoy en dia ¿quien tiene menos de un 486?). Veamoslo graficamente:

Creo que se entiende.


La funcion basica de AX es la de ACUMULADOR en diversas operaciones como MUL o DIV

Hay otras funciones, como la de indicar la funcion de cada interrupcion, pero esto no nos interesa para nuestro proposito ya que es para la programacion en DOS

BX Tambien se divide en EBX, BX, BH y BL y el nombre del registro es BASE

CX Se divide igual que los anteriores, el interes de este radica en que se usa como el numero de repeticiones en los contadores.

DX Uno de los usos mas comunes del registro de Datos, es cuando al realizar un MUL o un DIV el resultado no cabe en AX y se guarda en DX:AX

Ahora vamos a ver los Registros Indices:

          SI           DI           BP           SP.


SI Source Index, Indice Fuente

DI Indice Destino

BP Base pointer, Puntero Base

SP Stack Pointer, puntero de la pila

Los 4 son registros de 16 bits y no se dividen en una parte alta y otra baja


Registros de Segmento:

          CS           DS           SS           ES.

CS: Code segment, o segmento de Codigo, indica donde se halla el programa que se esta ejecutando

DS: Data Segment, o segmento de datos, indica donde lee y escribe el programa los datos por defecto

SS: Stack Segment, segmento de la pila, indica el lugar de la pila

ES: Extra Segment, segmento extra. Es una extension de DS.

Puntero de instruccion: IP (16 bits)

Instruction Pointer, Indica la siguiente instruccion a ejecutar, se encuentra en el segmento especificado por CS

CS e IP en Forman la direcci¢n real de la siguiente instruccion

FLAGS

Bueno, yo creo que con esto andamos sobrados de registros :)

Ahora vamos a ver otra de las cosas importantes y mas sencillas, los FLAGS o BANDERAS. Existe un regitro de 16 bits de tamaño de los cuales 7 no se usan

y que guardan todos los flags

* * * * * * * O D I T S Z A C

Estas son las iniciales, quedate con que cada uno de ellos puede tener un valor, segun la logica booleana un 1 o un 0 y que en funcion de este se produciran distintos eventos.

LA PILA

La pila es un lugar donde se almacenan variables para poder usarlas posteriormente, su modo de funcionamiento corresponde a las siglas inglesas LIFO (Last Input First Output, o lo que es lo mismo ultima entrada primera salida, pero UEPS no queda muy bien ;)) Para entenderlo piensa en lo siguiente, una pila de platos, no puedes sacar el de abajo del todo, que es el primero que hemos puesto porque se romperia todo, tendremos que coger el ultimo que hemos puesto. Los comandos para usar la pila son

PUSH registro

POP registro

Simplemente PUSH pone un valor y POP lo saca

Bueno pues ahora vamos a ver las Ordenes rapidamente, para empezar cuanto antes a desensamblar:

MOV


Sintaxis MOV destino, fuente

El proposito de esta orden es obviamente el de mover un valor de sitio a otro, se copia el termino de mas a la derecha sobre el del centro

Vamos a ver unos ejemplos:

mov ax,bx           ;copia el valor de bx en ax

mov ax,5           ;copia el valor 5 decimal en ax

mov ax,05h           ;copia el valor 5 hexadecimal en ax (5 decimal = 5 hexadecimal)

mov ax,0Eh           ;copia el valor E hexadecimal en ax (E = 14)

mov ax,[bx]           ;copia el valor del offset de bx a ax

CALL


Un call simplemente "llama" a una direccion para continuar con la ejecucion del programa desde alli y hasta encontrar un ret en el que se regresaria al punto anterior:

Se puede hacer un call a una etiqueta o a una direccion, a la hora de crackear nos vamos a encontrar con lo segundo, un ejemplo:

111:110           mov ax, 08h

111:111           call 116

saltariamos a

111:116           mov bx, 0f9H

111:117           ret

ahora continuarimos en

111:112           lo que fuera

Espero que se entienda. Un call lo que hace es romper la ejecucion lineal del programa dando un salto a otro lado.

LOOP


Esto es un bucle, repite un numero de veces (Especificado en CX) una serie de operaciones.

ejemplo:

mov ax,01h           ;AX = 1

mov cx,05h           ;CX = 5 numero de veces a repetir el bucle

XX:

cmp ax,04h           ;Compara AX con 4

je end                   ;Si AX es igual a 4 saltara a END

inc ax                    ;Sino le sumamos uno

LOOP XX           ;y volvemos a realizar el bucle

JUMP (Salto Incondicional)


Esto es un salto, simplemente, como un goto en otros lenguajes

Se puede usar como un salto a una etiqueta o a una direccion, tambien hay saltos lejanos y cercanos, pero no nos interesa mucho.

SALTOS CONDICIONALES

Si no habiais entendido bien el sentido de los FLAGS ahora lo hareis

A diferencia de un JUMP aqui se solo se produce el salto si se cumple una determinada condicion, seria algo asi como un IF... THE ... ELSE en PASCAL

Hay una gran cantidad de saltos y en muchos casos dos o mas son equivalentes aqui va una lista de ellos

JA, JAE JB JBE JNA JNAE JNB JNBE JZ JE JNZ JNE JG JGE JL JLE JNG JNGE

JNL JNLE JC JNC JO JNO JP JNP JPE JPO JS JNS

Bueno, he contado unos 30 pero quedaros de momento con estos dos basicamente


- JZ jump zero, salta cuando el resultado de una operacion es igual

- JNZ jump not zero Lo contrario a lo anterior

- JE igual a JZ

- JNZ jeje, tu mismo :)


MUL

Esta operacion realiza una multiplicacion de un operando por AX y lo guarda aqui, o si excede de tamaño en DX:AX

ejemplo

Tomamos AX con valor 4 y CX con valor 2

pues un MUL CX daria como resultado AX = 8


DIV Similar a MUL pero con la division

IMUL Multiplicacion con signo

IDIV Division con signo

ADD

Su funcion es la de sumar dos terminos,

Si bx = 11010111

y cx = 00110100 un haria esto ADD bx,cx

-----------

100001011 y lo almacenaria en bx

SUB Igual a ADD pero con la resta

DEC

El proposito es el de restar una unidad a un registro

si cx = 09h un DEC CX dejaria las cosas asi: CX=08h

INC

Igual que DEC pero en lugar de restar 1 ud. sumandola

NOP

Esta es la mejor de todas :) Simplemente, no hace nada NO OPERATING

XCHG

Esto intercambia el contenido de dos registros

Tenemos ax=2 y bx=4

XCHG ax,bx ahora ax=4 y bx=2. Facil ¿no?

CMP

Otra de las ordenes principales para nuestro proposito, compara dos registros o un registro y un valor o dos valores....

NOT

Niega el contenido de un registro

Si AX = 01010101 NOT AX => 10101010

AND

Una de las operaciones logicas, actuaria según la siguiente tabla de la verdad

0 comentarios:

Publicar un comentario