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