INDICE
0. NOTA DEL AUTOR.
- Hiz, soy Antikton y voy a intentar explicaros cómo se
crackea; pero antes
- voy a dejar unos puntos claros:
-
- 1.- Si no tienes ni puta idea de lo que es crackear, mejor
que dejes de
- leer este fichero y lo borres.
-
- 2.- Si sabes lo que es pero no tienes ni puta idea de
programación (lo
- que se dice nada de nada) y crees que vas a poder estar
crackeando
- programas comerciales en unos minutos, gilipollas!!! tú
te crees que esto
- es coser y cantar???
-
- 3.- Perdonad si me equivoco al escribir o sólo pongo los
signos al final
- (como los ingleses) pero es la economización del
lenguaje.
-
- 4.- Si tienes unos poquillos conocimientos de
programación y te gustaría
- crackear, te felicito porque has dado con el manual
adecuado (digo yo)
- pero necesitar dos o tres meses para empezar a
crackear solito :)
- 5.- NOTA: Este documento con la información que en l
aparece, es sólo
- para uso de aprendizaje. El autor no se hace responsable
de lo que la
- gente haga con ello. ;)
6.- Bueno, comenzemos a crackear X)
- El curso va a estar enfocado en crackear programas para Windows 95/98 de
- esos que piden un password o que piden un nombre y un código ( o sea, la
- mayoría :)
1. Guía de assembler
enfocada al cracking
- Antes de 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 tienes
- el nivel suficente para leerlo :P
-
- REGISTROS (Registers)
- Los registros son básicamente sitios por defecto en dónde se guardan datos.
- Los únicos por los que os tenis que preocupar son: (E)AX, (E)BX, (E)CX y
- (E)DX. (La (E) sólo es para cuando se debuguea en código de 32 bit)
- También está en 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
- tienes que saber es que son variables para el almacenamiento de datos :)
-
- FLAGS
- Los Flags son esencialmente como los registros excepto que los Flags sólo
- pueden contener valores específicos, 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, si no
- continua
-
- LA PILA (STACK) Y LOS PUSH AND POP (PONER Y QUITAR)
- Antes de cualquier función de llamada (a partir de ahora CALL), un programa
- debe PONER (a partir de ahora de diremos PUSH) unos par metros que la función
- espera encontrar en la pila (técnicamente llamado Stack). Los datos se colocan
- de una manera especial. Piensa lo siguiente. Piensalo como si fuera una "pila"
- (stack) de platos, el primer plato que ponemos (a l hacer un montón) se queda
- abajo y ser el último en coger; y el último en poner (el de arriba), es el
- primero en coger.
- Recuerda esto cuando estás sobre una CALL, los par metros son cogidos en
orden
- inverso. Te pongo un ejemplo para que te quede claro:
- La función API de Windows GetDlgItemTextA requiere los siguientes
- par metros:
- (1) Manejo de la ventana de di logo (Handle Dialgo Box)
- (2) Identificador del Control
- (3) Dirección del Buffer del Texto
- (4) Tamaño máximo de la cadena
- Por tanto, esto puede ser pasado de este modo (de forma inversa, para
- luego cogerlo ordenadamente):
- MOV EDI,[ESP+00000220] ; Coge en EDI el Handle Dialog Box
- PUSH 00000100 ; PUSH (4) - Tamaño máximo de la cadena
- PUSH 00406130 ; PUSH (3) - Dirección 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? estáo ser importantea la hora de crackear aplicaciones que piden
- números de serie.
- Si conocemos la dirección del buffer para nuestro número de serie (es decir,
- dónde se encuentra almacenado el número que le hemos metido en la memoria),
- en este caso 00406130, sólo hay que hacer un breakpoint y normalmente
- terminaremos alrededor del procedimiento que genera el número de serie bueno.
-
- POP se usa para borrar el primer "plato" de la pila. Normalmente, después de
- hacer un PUSH y haber una llamada, se colocan varios POP para borrar los
- datos innecesarios.
- AND
- - Uso: AND destino, origen
- - Fin: Lleva a cabo una operación de tipo AND de las dos entradas,
- reemplazando el destino con el resultado.
- - Ejemplo: AND BX, 03h
- No hay mucho que decir. Esto es importante para cuando necesitemos hacer
- un generador de números de serie para un programa :)
-
- CALL (Llamada)
- - Uso: CALL address (dirección)
- - Fin: Ejecuta una función en la dirección "address"
- - Ejemplo: CALL 10284312
- Una vez que la función termine, el código continúa en la línea siguiente
- de CALL (es como un GOSUB)
-
- CMP
- - Uso: CMP destino, origen
- - Fin: Resta el origen del destino y actualiza en Flag
- - Ejemplo: CMP AX, 03h
- Esta instrucción es muy importante para nosotros (los crackers) :)
- Está colocado muchas veces en el programa para verificar algo; por ejemplo
- que el número de serie que introducimos es el mismo que el que tiene el
- programa o genera ;)
-
- INT (Interrupción)
- - Uso: INT interrupción
- - Fin: Llama a una función general (normalmente de la BIOS)
- - Ejemplo: INT 10h
- Esta función es muy común en programas de DOS, pero no lo veremos mucho
- ya que me voy a dedicar (como he dicho antes) al Cracking en W95.
- Normalmente los par metros son guardados en los registros por defecto (AX,
- BX, CX, ...)
-
- JMP (Salto)
- - Uso: JMP dirección
- - Fin: Equivale a un GOTO. Salta a la sección de código de la dirección.
- - Ejemplo: JMP 00402011
- JMP es un salto incondicional. Tan simple como un GOTO :)
- Hay muchas variantes. Las m s importantes son:
- JZ o JE - Salta si el Flag 0 es cambiado
- JNZ o JNE - Salta si el Falg 0 no es modificado
- Normalmente está n después de uns intrucción de CMP, por ejemplo:
- CMP numseriebueno, numseriemalo ; compara los núm. de serie
- JNE fueradeaki ; si no son iguales, salta a otra
- parte del código
- MOV (Mover)
- - Uso: MOV destino, origen
- - Fin: Copia el byte o el valor de la palabra desde el orig al destá
- - Ejemplo: MOV AX, DX
- Lo ver s muy a menudo cuando estás stepping (ejecutando línea por línea.
- una cosa, a lo mejor me confundo y lo llamo stepting o steping, pero me
- refiero a esto, pa cuando lo veréis).
- MOV es como si fuera LET destino=origen
- Hay algunas variantes como MOVSX, pero es raro.
-
- RET (Retorno)
- - Uso: RET
- - Fin: Para volver de una función (Como si fuera RETURN)
- - Ejemplo: RET
- Normalmente lo ver s el final de una función, y sólo dice que vuelva a
- la dirección de la llamada (CALL) para continuar.
-
- LEA (Como LET)
- - Uso: LEA destino, origen
- - Fin: Hace que el destino sea igual que el origen
- - Ejemplo: LEA EAX, [EBP-34]
- Hace que EAX=EBP-34, fácil, no?
| 2. CONFIGURACIÓN Y USO DE SOFTICE. |
Contenido:
-----------------------------
- Para comenzar a usar SoftIce para Windows 95 (gracias a NuMega), tenemos que
- ver si se cargan las librerías; para ello comprueba que el fichero 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 ficheros
- a tu windows sean correctas.
- Si quieres tener menos memoria ocupada, quita los puntos y comas sólo a
- KERNEL32.DLL, USER32.DLL y GDI32.DLL que son los m s importantes.
- Lógicamente tendrás que reiniciar el ordenador y volver a cargar SoftIce.
-
2.2. 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 ; Aqui están los valores de los registros
- | Ventana Datos | D - ver E - editar ; Es dónde vemos la memoria hex. y dec. y la
dirección
- | Ventana Código | U - ver A - Inserta ; Vemos el código en ASM conforme se va
ejecutando
- | Ventana Comandos | ; Aquí pondremos los comandos
- Otras teclas importantes son:
- F5 / Ctrl+D -> Ejecuta
- F10 -> Paso a Paso
- F11 -> Función en Función
- t -> traza una llamada
2.3. COMANDOS PARA EL CRACKING
- Bueno, para explicar los comandos que más usaremos (que son muy pocos) voy a
- deciros el proceso genérico para el cracking de un programa.
- Bien, resulta que cuando a un programa le damos a la opción del menú REGISTER
- (aparece en muchos programas), sale una ventana que nos pide, por ejemplo, el
- nombre y el código.
- Pues nuestra tarea ser interceptar el lugar en donde el programa compara
- nuestro código con el generado por l mismo para comprobar si es correcto o
- erróneo.
- Fácil, eh? pues sí, los programas sencillos sí.
- Primera pregunta, cómo interceptar cuándo el programa recoge dichos datos?
- Para ello hay que colocar un BreakPoint.
- Un BP sirve para detener el programa y ver el código ASM en la función que
- nosotros le digamos.
- Por ejemplo que se detenga cuando recoga el código que introducimos.
- Las dos funciones m s usadas para recoger las cadenas que introducimos son:
- GetDlgItemTextA y GetWindowTextA
-
- Bueno, para ver cómo se usa y cómo se crackea (que es el tema que nos ocupa)
- pasemos al siguiente apartado.
-