eko2:(eko02-05.txt):13/05/2001 << Back To eko2


< ---------------------------- [ 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*