< ---------------------------- [ EKO Magazine ] ---------------------------- >
< - [ Manual de Cracking para Novatos ] ------------------------------------ >
< - [ por nicky_ramone ] ---------------------------------------- (EKO 02) - >


[Manual de Cracking para Novatos].

-NOTA DEL AUTOR

Hola, mi nombre es nicky_ramone, y voy a intentar explicarles como se
crackea; pero antes quiero dejar unos puntos claros:
Si no tenes ni idea de lo que es crackear, mejor deja de leer esto porque es
inutil.
Si sabes lo que es, pero no tenes conocimientos de programacion (lo que se
dice nada de nada) y crees que vas a poder estar crackeando programas
comerciales en unos minutos, mierda vas a poder! (Perdon, fue un lapsus).
Si tenes unos pocos conocimientos de programacion y te gustaria aprender a
crackear, diste con el texto adecuado (digo yo).
La informacion que en este texto aparece, es solo para uso de aprendizaje.
El autor no se hace responsable de lo que la gente haga con ello, bla, bla,
bla.

Bueno, comencemos a crackear.

El texto va a estar enfocado en crackear programas para Windows 95/98 de
esos que piden un password o que piden un nombre y un codigo (o sea, la
mayoria).

-GUIA DE ASSEMBLER ENFOCADA AL CRACKING

Antes que nada, si no sabes lo que es ASM o lo que es un Looping o un
FOR...NEXT, etc. te recomiendo que dejes de leer este manual ya que no tenes
el nivel suficiente para leerlo.

-REGISTROS (Registers)
Los registros son, basicamente, sitios por defecto en donde se guardan
datos. Los unicos por los que nos vamos a preocupar son: (E)AX, (E)BX, (E)CX
y (E)DX. (La (E) solo es para cuando se debuguea en codigo de 32 bit)
Tambien estan los registros de parejas:
DS:SI; Pueden ser usados como fuente (origen) para operaciones de cadenas.
ES:DI; usado como el destino para las operaciones de cadenas.

Entender los registros no es muy importante para crackear, pero lo que si
tenes que saber es que son variables para el almacenamiento de datos.

-FLAGS
Los Flags son esencialmente como los registros excepto que los Flags solo
pueden contener valores especificos, como verdadero o falso (1 o 0), etc.
Los flags son calculados por comandos como CMP y son usados para comprobar
el resultado de una llamada (CALL), por ejemplo:

CMP AX, BX; compara AX con BX, si son iguales el Flag 0 cambia

JZ 00124531; si el flag 0 ha cambiado, salta a 00124531, sino continua

-LA PILA (STACK) Y LOS PUSH AND POP (PONER Y QUITAR)
Antes de cualquier funcion de llamada (a partir de ahora CALL), un programa
debe PONER (a partir de ahora diremos PUSH) unos parametros que la funcion
espera encontrar en la pila (tecnicamente llamado Stack). Los datos se
colocan de una manera especial. Imaginatelo como si fuera una "pila" (stack)
de platos, el primer plato que ponemos (al hacer un monton) se queda abajo y
sera el ultimo en ser tomado; y el ultimo que pongamos poner (el de arriba),
sera el primero.
Recuerda esto cuando estas sobre una CALL, los parametros son tomados en
orden inverso.
Ejemplo para que quede claro:

La funcion API de Windows GetDlgItemTextA requiere los siguientes
parametros:

Manejo de la ventana de dialogo (Handle Dialog Box)
Identificador del Control
Direccion del Buffer del Texto
Tama~o maximo de la cadena
Por tanto, esto puede ser pasado de este modo (de forma inversa, para luego
tomarlo ordenadamente):

MOV EDI, [ESP+00000220]; Toma en EDI el Handle Dialog Box
PUSH 00000100          ; PUSH (4) - Tama~o maximo de la cadena
PUSH 00406130          ; PUSH (3) - Direccion buffer de texto
PUSH 00000405          ; PUSH (2) - Identificador de Control
PUSH EDI               ; PUSH (1) - Handle Dialog Box
CALL GetWindowText     ; Llama (CALL) a la funcion GetWin...

Facil, no? Esto sera importante a la hora de crackear aplicaciones que piden
numeros de serie. Si conocemos la direccion del buffer para nuestro numero
de serie (es decir, donde se encuentra almacenado el numero que le metimos
en la memoria), en este caso 00406130, solo hay que hacer un breakpoint y
normalmente terminaremos alrededor del procedimiento que genera el numero de
serie bueno.

-POP
Se usa para borrar el primer "plato" de la pila. Normalmente, despues de
hacer unos PUSH y haber una llamada, se colocan varios POP para borrar los
datos innecesarios.

-AND
Uso: AND dest, orig
Fin: Lleva a cabo una operacion de tipo AND de las dos entradas,
reemplazando el dest con el resultado.
Ejemplo: AND BX, 03h
No hay mucho que decir. Esto es importante para cuando necesitemos hacer un
generador de numeros de serie para un programa.

-CALL (Llamada)
Uso: CALL address (direccion)
Fin: Ejecuta una funcion en la direccion "address"
Ejemplo: CALL 10284312
Una vez que la funcion termine, el codigo continua en la linea siguiente de
CALL (es como un GOSUB)

-CMP
Uso: CMP dest, orig
Fin: Resta el orig del dest y actualiza en Flag
Ejemplo: CMP AX, 03h
Esta instruccion es muy importante para nosotros. Esta colocado muchas veces
en el programa para verificar algo; por ejemplo que el numero de serie que
introducimos es el mismo que el que tiene el programa o genera.

-INT (Interrupcion)
Uso: INT interrupcion
Fin: Llama a una funcion general (normalmente de la BIOS)
Ejemplo: INT 10h
Esta funcion es muy comun en programas de DOS, pero no lo veremos mucho ya
que nos vamos a dedicar al Cracking en Win95 (El mejor SO del mundo, lol).
Normalmente los parametros son guardados en los registros por defecto (AX,
BX, CX,...)

-JMP (Salto)
Uso: JMP direccion
Fin: Equivale a un GOTO. Salta a la seccion de codigo de la direccion.
Ejemplo: JMP 00402011
JMP es un salto incondicional. Tan simple como un GOTO
Hay muchas variantes. Las mas importantes son:
JZ o JE - Salta si el Flag 0 es cambiado
JNZ o JNE - Salta si el Flag 0 no es modificado

Normalmente estan despues de una instruccion de CMP, por ejemplo:

CMP numseriebueno, numseriemalo ; compara los num. de serie
JNE fueradeaka ; si no son iguales, salta a otra parte del codigo

-MOV (Mover)
Uso: MOV dest, orig
Fin: Copia el byte o el valor de la palabra desde el orig al dest
Ejemplo: MOV AX, DX
Lo vas a ver muy a menudo cuando estas haciendo stepping (ejecutando linea
por linea).
MOV es como si fuera LET dest=orig
Hay algunas variantes como MOVSX, pero es raro.

-RET (Retorno)
Uso: RET
Fin: Para volver de una funcion (Como si fuera RETURN)
Ejemplo: RET
Normalmente lo vas a ver en el final de una funcion, y solo dice que vuelva
a la direccion de la llamada (CALL) para continuar.

-LEA (Como LET)
Uso: LEA dest, orig
Fin: Hace que el dest sea igual que el orig
Ejemplo: LEA EAX, [EBP-34]
Hace que EAX=EBP-34, got it?

-CONFIGURACION Y USO DE SOFTICE

Para comenzar a usar SoftIce para Windows 95, tenemos que ver si se cargan
las librerias; para ello comprueba que el archivo "WINICE.DAT" en el
apartado "Examples of export symbols that can be included for Chicago" no
tengan delante el punto y coma, y verifica que las rutas de los archivos a
tu windows sean correctas. Si queres tener menos memoria ocupada, quita los
puntos y comas solo a KERNEL32.DLL, USER32.DLL y GDI32.DLL que son los mas
importantes. Logicamente vas a tener que reiniciar la maquina y volver a
cargar SoftIce.



-USO Y TECLAS DE SOFTICE
La pantalla de SoftIce es parecida a la siguiente (por lo menos en la ver.
2, porque la v3.2 cambia):

---------------------
| Ventana Registros | R - editar ; Aca estan los valores de los registros
|-------------------|
| Ventana Datos     | D - ver E - editar ; Es donde vemos la memoria
|-------------------| hex. y dec. y la direccion
| Ventana Codigo    | U - ver A - Inserta ; Vemos el codigo en ASM
|-------------------| conforme se va ejecutando
| Ventana Comandos  | ; Aqui pondremos los comandos
---------------------

Otras teclas importantes son:

F5 / Ctrl+D -> Ejecuta
F10 -> Paso a Paso
F11 -> Funcion en Funcion
t -> traza una llamada

-COMANDOS PARA EL CRACKING

Bueno, para explicar los comandos que mas vamos a usar (que son muy pocos)
voy a explicarles el proceso generico para el cracking de un programa. Bien,
resulta que cuando a un programa le damos a la opcion del menu REGISTER
(aparece en muchos programas), sale una ventana que nos pide, por ejemplo,
el nombre y el codigo. Pues nuestra tarea sera interceptar el lugar en donde
el programa compara nuestro codigo con el generado por el mismo para
comprobar si es correcto o erroneo.
Hasta ahi va facil no? Si, los programas sencillos si.
Primera pregunta, como interceptar cuando el programa recoge dichos datos?
Para ello hay que colocar un BreakPoint [BP].
Un BP sirve para detener el programa y ver el codigo ASM en la funcion que
nosotros le digamos. Por ejemplo que se detenga cuando recoja el codigo que
introducimos. Las dos funciones mas usadas para recoger las cadenas que
introducimos son: GetDlgItemTextA y GetWindowTextA

-NUESTRO PRIMER CRACKING.

Antes de arrancar W95 o W98, tenemos que arrancar en DOS y ejecutar WINICE
el cual se encargara de arrancar el Windows.

-PROTECCION POR NUMERO

Objetivo: Task Lock 3.00
Tipo de proteccion: Una simple proteccion de introduzca un numero
Herramientas: SoftIce 2.0 o sup.

Ejecutar el programa TaskLock

Buscar la opcion REGISTER. Introducir un numero al azar y pulsar OK.

No es correcto verdad? (todavia)

Volver a poner un numero y antes de pulsar Ok hay que colocar un BreakPoint
(BP) Para ello pasaremos a SoftIce apretando Ctrl+D y ponemos: BPX
GetWindowTextA pulsamos ENTER y salimos de SoftIce apretando de nuevo Ctrl+D
y ahora si, pulsamos OK y...

No es correcto verdad? (todavia)

Esta claro que la funcion que usa para tomar el numero no es GetWindowTextA
Ponemos otra vez el numerito y pulsamos de nuevo Ctrl+D Ahora borraremos el
BrakPoint de antes que no vale para nada con el comando BC 0 (es 0 porque es
el primero). Si tuvieramos varios BP, podriamos listarlos con BL y ver el
numero que es, en nuestro caso, con BL pondria 00) BPX
USER32!GetWindowsTextA C=01. Ahora probaremos con BPX GetDlgItemTextA damos
a enter y salimos (Ctrl+D) pulsamos OK y...

Eure-K!!! Ahora estamos dentro de SoftIce. Estamos al comienzo de la funcion
GetDlgItemTextA, para ver desde donde es llamada pulsamos F11:
Ahora tenes que desconectar el BP, pone bd 0 (si necesitas activarlo
despues, que no lo necesitaremos es be 0)

La primera linea que aparece es:
CALL [USER32!GetDlgItemTextA]
Por que hay antes?? Para ello pulsaremos unas cuantas veces
CTRL+flechaarriba hasta ver lo siguiente:

RET ; final de la func. anterior
PUSH EBP ; comienzo de la funcion
MOV EBP, ESP ; ...
SUB ESP, 0000009C ; ...
PUSH ESI ; ...
>LEA EAX, [EBP-34] ; EAX=EBP-34
PUSH EDI ; ...
MOVE ESI, ECX ; ...
PUSH 32 ; Guarda: la long. m x.
>PUSH EAX ; Guarda: direccion del buffer
PUSH 000003F4 ; Guarda: ...
PUSH DWORD PTR [ESI+1C] ; Guarda: ...
CALL [USER32!GetDlgItemTextA] ; toma el texto y comienza la func.

Los PUSH, como dije, son para guardar valores para su uso posterior. Las
lineas importantes les puse un > delante; observemoslas. Vemos que el buffer
de texto se guarda en EAX y cuanto vale EAX? EAX=EBP-34
Bien, ahora ponemos d ebp-34 para ver la memoria en ese valor. Vemos en la
ventana de Datos el numero que hemos puesto.
Ahora, lo que hay que hacer es buscar donde se hace la comparacion entre
nuestro codigo y el codigo bueno. Para ello hay que ir paso por paso de
instrucciones pulsando F10 hasta encontrar algo relacionado con EBP-34 (que
es en donde esta nuestro numero). Tras unos pocos F10's nos encontramos lo
siguiente:

>LEA EAX, [EBP+FFFFFF64] ; EAX=EBP-9C
LEA ECX, [EBP-34] ; ECX=EBP-34 (Ahora nuestro numero
PUSH EAX ; Guarda EAX. esta en ECX)
PUSH ECX ; Guarda ECX
>CALL 00403DD0 ; Llama a una funcion
ADD ESP, 08 ; ...
TEST EAX, EAX ; Chequea el resultado de la funcion
JNZ 00402BC0 ; Salta si no es 0

Se ve claramente como se recoge una variable en EAX, otra en ECX (nuestro
numero), se llama a una funcion (que suponemos que es la que genera el
numero bueno) y despues es comparada.
Bien, entonces que se esconde bajo EAX (EBP+FFFFFF64) ? El numero correcto,
que mas.
Ponemos D EAX y el numerito tiene que aparecer en la ventana de Datos. Ahora
lo que tenemos que hacer es ponerle dicho numerito en el programa cuando lo
pida y ya ta.

Nada mas.-

-URL's

Bueno, las URLs de los programas que use:

SoftIce: Busca en http://astalavista.box.sk

TaskLock: Busca en http://www.filez.com o en otro buscador de FTP




*EOF*