martes, 2 de octubre de 2012

Introduccion al Cracking desde 0

Introduccion
¿Que es esto ?

Esta Introduccion al Cracking desde 0 va orientado a todas esas personas que tienen muy pocos conocimientos (o ninguno) y que por este motivo no han querido iniciarse en este Arte, que suele ser considerado algo complejo.
Gracias a todos los esfuerzos de los crackers que publican sus tutoriales en la red es que lo he plasmado aqui? en un resumen, por lo tanto este texto va a ir dirigido hacia esa gente sin conocimientos, para que de sus primeros pasos y logre entender los conceptos mas basicos.

Estamos seguros, que a gente avanzada tambien le puede ayudar a recordar, asi que esperamos que les guste y que les pueda ayudar a "empezar a caminar"...

Como todo, hay que empezar por lo mas basico, no podemos hablar de debugger sin conocer nada de ensamblador y no podemos hablar de ensamblador sin ni siquiera saber que es el codigo maquina.



Codigo Maquina

Realmente,  que es lo que entiende un "ordenador"?

El codigo o lenguaje maquina, este consta de cadenas de estos 0 y 1 (bits), que el microprocesador entiende directamente. Una y solo una secuencia de estos 0 y 1 realizar? una determinada operacion.

Programar directamente en este sistema binario, como se puede uno imaginar, puede resultar muy dificil por lo tanto es muy facil equivocarse.

Por este motivo, para facilitar la escritura de programas, podemos ayudarnos de la diversidad de lenguajes que existen , entre ellos tenemos :

Lenguajes de Bajo Nivel :
- Ensamblador

Lenguajes de Medio Nivel :
- C / C++

Lenguajes de Alto Nivel :
- Delphi
- Visual Basic
- Java
- etc...


Lenguaje Ensamblador

Debido a la gran dificultad de escribir programas en codigo maquina , podemos ayudarnos del lenguaje ensamblador (lenguaje de bajo nivel y el que vamos a conocer aqui.), el cual utiliza nemotecnicos (normalmente abreviaturas de palabras en ingles) que se utilizan para definir una determinada instruccion.

¿Que es Ensamblador/ASM?

Segun la Wikipedia :
El lenguaje ensamblador es un tipo de lenguaje de bajo nivel utilizado para escribir programas informaticos, y constituye la representacion mis directa del codigo maquina especifico para cada arquitectura de computadoras legible por un programador.
Fue usado ampliamente en el pasado para el desarrollo de software, pero actualmente solo se utiliza en contadas ocasiones, especialmente cuando se requiere la manipulacion directa del hardware o se pretenden rendimientos inusuales de los equipos.
Enlace : http://es.wikipedia.org/wiki/ASM

¿Por que en la Ingenieria Inversa hay que aprender lenguaje Ensamblador?

Si abrieramos cualquier programa y echaramos una ojeada al codigo, observariamos el lenguaje maquina, independientemente del lenguaje de programacion con que haya sido programado (compilado). Es logico, ya que como se ha explicado, es lo que el microprocesador entiende.
Sin embargo, entender esas secuencias de 0 y 1 que hacen realizar determinadas operaciones, es verdaderamente complicado, por este motivo existen muchos programas que a partir del lenguaje maquina obtienen el lenguaje ensamblador, que ya es mucho mas entendible al ser humano. Estos programas se denominan desensambladores.


Registros del Microprocesador

1.- Tipos de Registros

Al usar ASM nos valemos directamente de los registro de nuestro microprocesador a diferencia de los lenguajes de alto nivel.

  1.1.-Registros de uso General :

  EAX (Acumulador) : Utilizado para operaciones aritmetica (suma,resta,multiplicacion,divisi?n) , la mayoria de funciones despues de 
  ser utilizadas devuelven un valor a EAX .

  EBX (Base) : Se utiliza para direccionar el acceso a datos , situados en la memoria ; tambien se puede utiliza para operaciones 
  arim?ticas .

  ECX (Contador) : Se utiliza como contador por algunas instrucciones ; tambien se puede utiliza para operaciones arim?ticas .

  EDX (Datos) : Algunas operaciones de entrada/salida requieren su uso ; las operaciones de multiplicaci?n y divisi?n con cifras
  grandes suponen al EDX y EAX trabajando juntos .

  1.2.-Registros de Indice :

  ESIy EDI : Son requeridos por algunas operaciones con cadenas de caracteres .

  1.3.-Registros de banderas :

  Se usan para registrar la informaci?n de estado y de control de las operaciones del microprocesador, y son 9 :
  CF, OF, ZF, SF, PF, AF, DF, IF, TF.

  1.4.-Otros Registros Importantes :

  EIP : Este registro contendr? la direcci?n de la siguiente instrucci?n que se ejecutar?.

  EBP : Apunta a la Base de la pila.

  ESP : Apunta a la parte Superior de la pila.


2.- Tamaños de los Registros




Lo que representa la imagen expuesta no solo es aplicable al registro EAX sino que puede ser cambiado por los demas registros de uso general (EAX, EBX, ECX, EDX)

Ejemplo :

12345678 => EAX
12345678 => AX
12345678 => AH
12345678 => AL

Referencias :

DWORD -> EAX
WORD -> AX
BYTE -> AH y AL


La Pila

Segun la Wikipedia :
- Tecnicamente es una estructura de datos, del tipo LIFO (del ingles Last In First Out, ultimo en entrar, primero en salir)
Enlace : http://es.wikipedia.org/wiki/LIFO

¿Que esto de una estructura?.Bien, imaginar que formamos una ventana, o por ejemplo, el tipico mensaje de texto. En este caso es la API MessageBoxA .



Y claro, aqui es donde entra el papel de la pila, antes de invocar a la API MessageBoxA tenemos que indicarle todos estos datos para que nos la forme tal y como nosotros le hemos indicado.

PUSH Titulo
PUSH Cuerpo
PUSH TipodeBotones
CALL MessageBoxA

MessageBoxA es la API encargada de lanzar ese mensaje tipo "caja de texto" que puse en la imagen.

En Ensamblador o en C esto se visualizaria asi :



Practicando el Lenguaje Ensamblador

1.- Instrucciones B?sicas del Microprocesador :

Comenzaremos por las instrucciones m?s b?sicas, con breves explicaciones y ejemplos:


MOV destino, origen :
Sirve para mover informaci?n del origen al destino. Por ejemplo de un registro a otro, de un registro a una variable, etc. Aunque no nos sirve para mover datos entre dos variables.

Ej: MOV A, B => El valor de A pasaria a ser igual que el valor de B.

ADD/SUB Destino, Cantidad
ADD : Suma una determinada cantidad a un registro o variable (destino).

Ej: ADD A, B => Se le suma a A el valor de B y el resultado se guardar?a en A.

SUB : Resta una determinada cantidad a un registro o variable (destino).

Ej: SUB A, B => Se le resta a A el valor de B y el resultado se guardar?a en A.

- Recuerda : No esta permitido sumar o restar datos directamente entre variables.

INC/DEC Variable o registro
INC : Incrementa el valor de una variable o registro en 1.

Ej: INC A => Se incrementar?a el valor de A en 1.

DEC : Decrementa el valor de una variable o registro en 1.

Ej: DEC A => Se decrementar?a el valor de A en 1.

CMP :
Compara el valor de dos registros , en realidad es una instrucci?n SUB que no guarda el resultado en ningun lado sino que su funcion es cambiar los flags (Registros de banderas) , esta instrucci?n trabaja cuando a los saltos al igual que TEST.

Asumiendo A=B
Ej: CMP A, B => Se efect?a una comparaci?n entre A y B (la diferencia de A y B es cero por lo tanto el flag Z se activa)

TEST :
Compara el valor de dos registros , a diferencia de CMP este en realidad es una instruccion AND que no guarda el resultado en ningun lado sino que su funcion es cambiar los flags (Registros de banderas)

Ej: TEST A, B => Se efect?a una comparaci?n entre A y B

PUSH DWORD
PUSH mete un DWORD en la pila. La pila se utiliza por ejemplo para pasar par?metros a las funciones o para utilizar variables locales. Es importante que cada PUSH tenga un POP (ahora lo explico).

Ej: push eax

POP DWORD
POP al contrario que PUSH saca un DWORD de la pila.

Ej: push eax => Guarda a eax en la pila
pop ebx => Saca el ultimo valor metido en la pila (en este caso EAX) y lo guarda en EBX (en este caso)

RET

RET se usa generalmente para regresar de una funci?n. Lo que hace realmente es ?popear? un DWORD de la pila y saltar a ?l. De ah? que en las funciones se meta la direcci?n de retorno en la pila y con el RET contin?e la ejecuci?n del programa donde corresponde.
A los interesados en el Stack Overflow esto les puede interesar bastante

2.- Instrucciones Logicas :

Este tipo de operaciones se realizan a nivel de bits (binario) , los resultados son reemplazados en el operando Destino, si deseas realizar los ejemplos manualmente utiliza la calculadora de Windows en modo cientifica para convertir las cantidades a binario.

AND Destino, Fuente



Ej: 1110 (14 en decimal o E hexadecimal).
1101 (13 en decimal o D hexadecimal).
1100 (12 en decimal o C hexadecimal).

OR Destino, Fuente





Ej: 1110 (14 en decimal o E hexadecimal).
1101 (13 en decimal o D hexadecimal).
1111 (15 en decimal o F hexadecimal).

XOR Destino, Fuente




Ej: 1110 (14 en decimal o E hexadecimal).
1101 (13 en decimal o D hexadecimal).
0011 (3 en decimal).

NOT Destino




Ej: 1101 (13 en decimal o D hexadecimal).
0010 (2 en decimal).

3.- Saltos Condicionales :

Simulan lo que ser?a la estructura IF de un lenguaje de alto nivel .
La forma de todo salto es :

cmp Valor1, Valor2
Salto Direcci?n

Hay muchos tipos, asi que solo citar? los m?s importantes :

JMP - Salta siempre
JE ? Salta si los n?meros comparados son iguales.
JNE ? Salta si no son iguales.
JG ? Salta si Valor1 es mayor que Valor2.
JGE ? Salta si Valor1 es mayor o igual que Valor2.
JB ? Salta si Valor1 es menor que Valor2.
JBE ? Salta si Valor1 es menor o igual que Valor2.

4.- Apis :

Son funciones que pueden ser utilizadas en cualquier programa , para tener que evitar repetir lo mismo en todos los programas.
Aqui pondre las mas usadas en el mundo del cracking :

En construccion


Aprendiendo con OllyDbg

1.- Introduccion :

Habiendo una gran cantidad de debuggers en la actualidad, ?Por qu? vamos a hacer la introducci?n con OllyDBG?
Creo que la mayoria de expertos en el cracking que han utilizado cualquier debugger reconocen que es mas sencillo empezar con OllyDBG, ya que muestra mayor informaci?n y es mas c?modo para aprender, la idea es ingresar al mundo del cracking, por la puerta del OllyDBG, mas adelante cuando uno ya conoce mas sobre el tema del cracking, puede trasladar f?cilmente a cualquier debugger lo aprendido pues cambian las formas de usar de los programas, pero no la esencia.

2.- Presentaci?n de OllyDBG :

OllyDBG es principalmente un debugger para aplicaciones a 32 bits en Microsoft Windows. Es un debugger en Ring3.
Tiene much?simas otras opciones e incluso es posible la utilizaci?n de plugins (o si eres programador hacerlos t? mismo) que hacen de ?l un programa verdaderamente potente.
Para conocer sus caracter?sticas podemos visitar su p?gina Web:
http://www.ollydbg.de/

Para descargar el programa podemos descargar la versi?n 1.10 b?sica, sin ning?n plugin y ninguna modificaci?n desde su p?gina web, aqu?:
http://www.ollydbg.de/odbg110.zip

3.- Interfaz :



3.1.- Desamblado :



- La primera columna "Address" muestra la direcci?n donde se ejecutar? el c?digo.
- La segunda columna "Hex dump" muestra los bytes que forman la instrucci?n que hay a la derecha (columna "Disassembly).
- La tercera columna "Disassembly" indica el desensamblado propiamente dicho.
- La ?ltima columna "Comment" nos puede mostrar: comentarios propios, cadenas de texto, direcciones, nombres de funciones y direcciones, datos que vamos a insertar en la pila a cierta funci?n o API etc... que nos pueden ayudar much?simo.

3.2.- Registros :



3.3.- Dump :



En esta subventana podemos representar los valores hexadecimales, de muchas formas diferentes:
- Podemos ver el car?cter ASCII que representa al valor hex.
- Podemos ver el c?digo UNICODE que representa a los valores hex.
- Podemos ver la representaci?n de punto flotante.
- Podemos ver las direcciones que pueden representar.
- Podemos ver incluso el c?digo desensamblado, aunque para esto ya tenemos nuestra ventana de desensamblado.
- Podemos ver un PE header con todos sus datos.
Y muchas opciones m?s. Una ventana muy ?til, que nos va a ayudar enormemente en nuestra labor.

Normalmente se suele utilizar la apariencia de la imagen anterior, que est? dividida en 3 columnas.
Address --> direcci?n donde se encuentran los bytes
Hex dump --> los valores hexadecimales
ASCII --> el car?cter ASCII del valor hexadecimal


3.4.- Pila :





4.- Lo mas usado en el OllyDbg:

4.1.- Conceptos :

Tracear : Ejecutar linea por linea de su codigo del programa ahi dos formas con F7 y F8

4.2.- Teclas :

F7 : Ejecuta una sola l?nea de c?digo (si estas en un CALL entra al mismo a ejecutarlo por dentro)

F8 : Ejecuta una sola l?nea de c?digo (si estas en un CALL no entra al mismo lo ejecuta completo sin entrar y sigue en la
siguiente l?nea luego del CALL)

Esas dos formas de tracear manualmente son verdaderamente diferentes y seg?n cada caso usaremos F7 o F8 .

F2 : Coloca un Breakpoint COMUN en la l?nea que marcas con el Mouse o esta grisada en el listado, para quitar el BP apretas
nuevamente F2.

F9 : Arrancar el programa (Run)

CTRL+G : Ir hacia un direccion determinada por nosotros

CTRL+N : Listado de Apis (funciones) utilizadas

En Construccion

No hay comentarios: