Como crakear por estado+porcino

67
COMO CRAKEAR POR ESTADO+PORCINO CAPÍTULO I. Orígenes TechFacts 95 Diciembre 1997 Indice * UN POCO DE TODO: - Agradecimientos - ¿Qué es eso de crackear? - ¿Por qué crackear? - ¿A quién va dirigido este curso? - ¿Qué es lo que vamos a aprender? - ¿No estaremos quitando el pan a los programadores de aplicaciones? - ¿Qué necesito pa esto de crakear? * IDEAS BÁSICAS SOBRE CRACKING: * HERRAMIENTAS CRACK: - Editor hexadecimal - Desensamblador - Debugger * ESQUEMAS DE PROTECCION: * ESQUEMAS DE PROTECCIÓN BASADOS EN NÚMEROS DE SERIE: - Acerca de los programadores - Análisis de esquemas con número de serie - ¿Cómo atacar? - Otro punto de ataque - Comparación de ataques

description

Como crakear por estado+porcino

Transcript of Como crakear por estado+porcino

Page 1: Como crakear por estado+porcino

COMO CRAKEAR POR ESTADO+PORCINO

CAPÍTULO I. Orígenes

TechFacts 95

Diciembre 1997

Indice

* UN POCO DE TODO:

- Agradecimientos

- ¿Qué es eso de crackear?

- ¿Por qué crackear?

- ¿A quién va dirigido este curso?

- ¿Qué es lo que vamos a aprender?

- ¿No estaremos quitando el pan a los programadores de aplicaciones?

- ¿Qué necesito pa esto de crakear?

* IDEAS BÁSICAS SOBRE CRACKING:

* HERRAMIENTAS CRACK:

- Editor hexadecimal

- Desensamblador

- Debugger

* ESQUEMAS DE PROTECCION:

* ESQUEMAS DE PROTECCIÓN BASADOS EN NÚMEROS DE SERIE:

- Acerca de los programadores

- Análisis de esquemas con número de serie

- ¿Cómo atacar?

- Otro punto de ataque

- Comparación de ataques

Page 2: Como crakear por estado+porcino

UN POCO DE TODO:

¡Saludos Familia !

He decidido crear esta serie de capítulos con un objetivo puramente educativo

(sin ningún tipo de obscuro interés comercial). Mi objetivo es ayudar a los nuevos

crackers en sus primeros pasos.

Agradecimientos

Al TodoPoderoso +ORC, a su acólito +FRAVIA y a los miembros de WKT por su

apoyo.

¿Qué es eso de crackear?

Crackear es el arte de reventar protecciones software/hardware con fines

intelectuales, personales pero no lucrativos. Crackear también se llama ingeniería

inversa (Reverse Engineering), ya que sin el programa fuente se es capaz de

analizar el comportamiento del programa y modificarlo para tus intereses.

¿Por qué crackear?

Vivimos en un una sociedad que da asco. Es inconcebible que se destruyan o

penalicen la producción de productos básicos (cereales,lácteos...) en aras de una

estabilidad de precios.Vivimos en una sociedad donde el 95% de la gente se ve

sometida al control de un 5 %. Toda persona debería tener un mínimo de

recursos para ser feliz,pero esto no es así.

El noble arte del crakeo es una herramienta para distribuir la riqueza entre la

sociedad. Si necesitas un programa (que tienes en un CD-ROM) y no tienes una

cuenta en un banco USA, ni 30 dólares, ¿por qué narices tienes que esperar y

pagar si lo necesitas?, crackealo y publica el crack en Internet. Así ayudarás a la

gente menos afortunada que está axifiada por esta sociedad desigualitaria.

¿A quién va dirigido este curso?

Este curso va dirigido a toda persona con interés en el crack y/o con la filosofía

crack. Sin olvidar a los programadores.

¿Qué es lo que vamos a aprender?

Dejaremos de un lado el añorado DOS, para centrarnos en cracks para

programas en W95.

¿No estaremos quitando el pan a los programadores de aplicaciones?

Los programadores viven muy bien a costa de los royaltis que pagan las grandes

empresas y esos repugnantes yupis encorbatados con escased de neuronas.

Además, un programa crakeado es más conocido y utilizado que uno que no lo

Page 3: Como crakear por estado+porcino

esté. Digamos que el crack es una forma de publicidad. Baste recordar el

compilador de Pascal de la casa Borland. Originalmente fue copieteado y

distribuido casi libremente hasta la saciedad. Borland conocía este hecho y por

eso no introdujo ningún tipo de protección. Al cabo de poco tiempo, esos

estudiantes se convirtieron en programadores que reclamaban a sus empresas la

compra del compilador que sabían utilizar, el Pascal de Borland. Si las casas de

soft ya son ricas sin nuestro dinero, ¿a que estado de corrupción se llegaría si lo

tuvieran?. Aunque parezca extraño este ensayo está dedicado a formar a los

programadores , mostrándoles sus defectos y el camino para producir software

de calidad.

En último caso depende de la conciencia de cada uno, si crees que un

programador ha realizado una buena aplicación, que te es útil y que además está

bien programada, entonces obra adecuadamente y recompénsalo registrándote.

A decir verdad sólo he encontrado un programa de este estilo

¿Qué necesito pa esto de crakear?

- Interés y PazYCiencia.

- Algún conocimiento de ensamblador. Cuanto más conozcas mejor crackearás,

pero para este curso mas bien poco, intentaré hacer las cosas fáciles.

- Ayuda de otro cracker más experto (por ejemplo Estado+Porcino)

IDEAS BÁSICAS SOBRE CRACKING

Un programa no es más que un montón de instrucciones (haz, esto, haz lo otro),

una tras otra. Estas instrucciones, (en general) están en memoria, parte de ellas

se encargan de impedir la ejecución del resto (el verdadero programa).

Resumiendo, tienes un bonito programa tras una puerta (esquema de

protección), nuestro objetivo es reventar la puerta, buscar la llave,pasar por las

rendijas,quemarla..., como puedes ver una cantidad inagotable de ataques.

Un pequeño inciso, sólo puedes reactivar instrucciones que se encuentren en el

programa. Por ejemplo, si se ha desactivado la opción de salvar, puede ser que el

conjunto de sentencias para salvar el programa esté presente pero desactivado, o

bien que simplemente no esté. Si están las sentencias, se pueden reanimar, sino

están entramos en un mundo diferente, una evolución del cracking, la

apasionante Reconstrucción Software, pero eso será tema de otro capítulo.

HERRAMIENTAS CRACK

Demos un breve repaso a las principales herramientas que utilizaremos a lo largo

del curso. Existen otras muchas herramientas que las comentaré cuando nos sean

necesarias.

Page 4: Como crakear por estado+porcino

Editor hexadecimal

Los programas no son más que un conjunto de instrucciones y cada instrucción

no es más que un conjunto de bits, pero donde demonios se guardan esos bits?.

Los bits del programa se localizan en los ficheros, p.e. las instrucciones del

programa de compresión arj se guardan en el fichero arj.exe. Hay algunos

programas que no guardan todas sus instrucciones en único fichero, si no en

varios, un ejemplo de esto son los programas que utilizan librerías dinámicas (o

dll)

Un editor hexa, no es más que un programa, que permite "editar" los ficheros de

instrucciones de otros programas, osea, que permite ver,modificar,copiar,pegar...

los bits de los programas. Para simplificar la cosa no se muestran los bits a pelo,

sino que se muestran en hexadecimal, de ahí su nombre. Nosotros lo utilizaremos

para alterar el comportamiento de los programas. Supongamos que conocemos la

instrucción sentencia de la rutina de protección que debemos modificar, sea jz 23

y queremos modificarla por jnz 23, bien como toda instrucción no es más que un

conjunto de bits, sea 0110 para jz 23 y 1001 para jnz 23, sólo nos queda buscar

estos bits dentro del fichero ejecutable del programa (que es, en general, el

contiene las sentencias del programa). Como usamos un editor hexa, debemos

buscar la secuencia de un unos y ceros en hexa en el fichero del programa que

queremos modificar. Si la secuencia que buscamos es muy común deberemos

utilizar las instrucciones que se encuentran entorno a la instrucción a modificar.

Esto es muy importante, sólo debe existir una localización del patrón de

búsqueda en el fichero, si existe más de una, debemos añadir a la búsqueda las

sentencias de alrededor, sino se corre el riego de modificar la sentencia

equivocada, lo que provoca casi siempre un "cuelgue".

Un no es más que una modificación de las instrucciones de un fichero, así pues

para hacer un crack debemos saber que instrucciones modificar y en qué fichero.

Una vez crackeado el fichero, el programa se comportará siguiendo la nueva

sentencia que le hemos modificado.

Hay un montón de editores hexa, yo os recomiendo UltraEdit-32 Professional, os

lo podéis bajar de http://ftpsearch.ntnu.no/

(excelente herramienta de búsqueda en la Web, utilízala cuando no encuentres

algún fichero) busca w32dasm. Yo utilizo la versión 4.31a. Cada cracker tiene su

editor favorito, !encuentra el tuyo!. Este programa es shareware, así que tendrás

que crackearlo, recuerda : lo primero que tienes que crakear son tus propias

herramientas. Si no puedes crackearlo, busca otro editor hexa, los hay a

montones.

Desensamblador

Un desensamblador toma un fichero de instrucciones en hexa y lo convierte a

lenguaje ensamblador. El lenguaje ensamblador, es el conjunto de sentencias que

Page 5: Como crakear por estado+porcino

entiende el microprocesador (tu Pentium o mi 486). El procesador es el corazón

del ordenador, todas las sentencias son ejecutadas por él y sólo por él. Por

ejemplo un 43 en hexa se transforma en inc eax. Se necesitan algunos

conocimientos de ensamblador pa esto de crackear.

Nosotros usaremos el desensamblador para crakear con la técnica de la lista

muerta que veremos más adelante.

Puedes pillar un magnífico desensamblador para W95 en

http://www/expage.com/page/w32dasm , es shareware, así que deberás

crackearlo. Próximamente le dedicaremos un capítulo al w32dasm y

aprenderemos a crackearlo. Yo utilizo la versión 8.9, aunque una posterior es

también útil.

Debugger

Un debugger permite ejecutar instrucción a instrucción (instrucciones en

ensamblador, se entiende) un programa, por tanto también ejecutará instrucción

a instrucción la rutina de protección, ya que es parte del programa. Esto nos

permitirá analizar su comportamiento.

El mejor debugger para W95 es sin duda el Softice quo te lo puedes bajar de

http://www.numega.com , es sin duda uno de los mejores programas que he visto

en mi vida. Te recomiendo que te bajes también los manuales. El Softice es una

de las mejores herramientas cuanto más domines al Softice, mejor crakearás, y te

aseguro que se pueden realizar verdaderas maravillas con él. Para trazar (esto es,

pasar el debug) a programas MS-DOS, puedes utilizar versiones anteriores del

Softice o utilizar algunos de los excelentes debugger que hay para Dos como el

SymbDebug.

Os indicaré un par de consejos y trucos para el Softice.

--> Instalación

Haz la prueba de pantalla, si te la saltas, lo más seguro es que cuando actives el

Softice se te quede la pantalla a rayas. Busca el driver de la tarjeta de vídeo que

tengas instalada en W95 dentro de la lista que se ofrece. Aunque la encuentres,

haz la prueba de pantalla, es posible que no funcione correctamente. Si no

encuentras tu tarjeta de vídeo o tienes problemas de pantalla, corta la instalación

y selecciona "Adaptador de Vídeo Standard VGA", reinstala el Softice y utiliza

ese mismo driver para la prueba de pantalla. Si sigues teniendo problemas te

remito a la Doc del Softice (que deberías haberte bajado). Particularmente, con el

adaptador Standard VGA no he tenido nunca problemas. Hay por ahí sueltos

una ampliación de drivers de tarjetas para Softice, búscalos si no quieres pasa a

la VGA Standard.

Activa la opción de ratón, te evitará escribir bastantes secuencias hexa de

instrucciones, te permitirá moverte libremente por las ventanas, seleccionar,

copiar y pegar texto así como redimensionar las ventanas.

Page 6: Como crakear por estado+porcino

--->Configuración

El Loader es una pequeña utilidad que permite especificar el programa que

queremos depurar y además nos permite configurar el Softice, En Edit/SoftIce

Initialization Settings/Initialization string pon X;wl;wr;wd7; code on; y en Histoy

Buffer Size pon 512

Abre el fichero winice.dat (dentro del directorio de instalación del Softice) , toda

línea del tipo EXP=c:\windows\system\system.drv , quítale el punto y como

inicial.

--->Ejecución

El Softice debe cargarse siempre antes que W95. Si estas en W95, reinicializa en

modo MS-DOS y ejecuta WINICE.EXE, este cargará el Softice y W95. Te

recomiendo que utilices un fichero bat.

Las ventanas que aparecen son

Ventana de registros de la CPU (wr). A los típicos se ha añadido una E así se

diferencia los registros normales que admiten 16 bits, de los registros que

soportan 32 bits. Por ejemplo, ax se llama ahora eax. Siempre podremos

referencias a ax, sabiendo que nos quedaremos con 16 bits últimos de eax.

Ventana de datos de la CPU (wd). Muestra la memoria en formato hexa, ahí se

pueden apreciar los datos que maneja el programa, entre otras cosas.

Ventana de código (wc). Muestra, la dirección de memoria en la que se encuentra

la instrucción, la codificación hexa de la instrucción y la instrucción en

ensamblador.

Ventana de control, el la que aparece arriba el nombre del programa que

estamos trazando. Aquí es donde introduciremos los comandos del SoftIce.

He aquí algunos comandos fundamentales para el Softice:

CTRL+D

Conmuta de W95 al Softice y viceversa. No te asustes por el pantallazo ni por el

aspecto cutre inicial, llegarás a quererlo, créeme. Si salen rayas, vuelve a leer el

apartado -->Instalación

F4

Estando en Softice, te permite echar un ojo al estado actual en W95 sin necesidad

de conmutar.

F8

Page 7: Como crakear por estado+porcino

Ejecuta una instrucción, las modificaciones en los registros del sistema aparecen

de diferente color. Si la instrucción es una llamada a una rutina, se ejecutarán

una a una todas las instrucciones de la rutina llamada.

F10

Ejecuta una instrucción, las modificaciones en los registros del sistema aparecen

de diferente color. Si la instrucción es una llamada a una rutina, se ejecutan de

golpe todas las sentencias de la rutina llamada.

F11

Ejecuta de golpe todas las instrucciones de la rutina actual y se para el la

instrucción siguiente de la rutina padre que llamó a esta rutina. Esto nos permite

trazar al padre, estando en una rutina hija. En cuanto la uses menudo verás que

no es tan complicado como parece.

F12

Ejecuta todas las sentencias hasta el primer ret (incluido)

bpx nombreRutina

Salta al Softice cuando se ejecuta la rutina cuyo nombre es nombreRutina.

Ejemplo bpx messageboxa saltará al Softice cuando el programa muestre una

ventana de mensaje del tipo mensaggebox.

bpx dirInstrucción

Salta al Softice cuando se ejecuta la instrucción que está es la dirección de

memoria dirInstrucción.

bpr dirIni dirFin rw

Salta al Softice cuando hay un acceso de lectura o escritura en las direcciones

dirIni,dirFin ambas incluidas. Ejemplo bpr 100 109 rw que puesto de otra forma

más fácil de expresar, nos queda algo como bpr 100 100+9 rw

s l dir tam'cad'

Busca la cadena cad a partir de dir hasta dir+tam. Esta sentencia casi siempre

tendrá este aspecto. Ejemplo s 30:00 l ffffffff 'cad' . Las comillas son importantes.

30:00 es la dirección de comienzo del segmento de datos, osea la dirección de

memoria donde están los datos del programa y ffffffff es el tamaño del segmento

de datos, como veréis hay 4GB de espacio para almacenar datos.

d registro

Muestra en la ventada de datos el contenido de lo que hay a partir de la dirección

Page 8: Como crakear por estado+porcino

guardada en registro. Ejemplo d eax muestra a lo que apunta eax.

d dirección

Muestra en la ventada de datos el contenido de lo que hay a partir de la

dirección.

d nomRutina

Muestra en la ventada de datos el contenido de lo que hay a partir de la dirección

donde comienza la rutina nomRutina.

Impr Pant

Vuelca el contenido de la pantalla por la impresora, quizás tengas que darle varia

veces hasta que el buffer de la impresora se llene.

ESQUEMAS DE PROTECCION

Citaré algunas de las técnicas utilizadas por los programadores para proteger su

soft.

- Números de Serie.

- Cripple Software (software limitado), en diversas variantes:

* Tiempo limitado a meses , días, minutos..

* Número de ejecuciones o usuarios limitado.

* Funciones deshabilitadas.

- Protecciones por discos o CD-ROM llave.

- Protecciones anti herramientas crack

* Antidebuggers.

* Antidescompiladores.

* Antidesensambladores.

* Encriptación parcial o total.

- Ninguna de las anteriores.

Acerca de los programadores

Page 9: Como crakear por estado+porcino

Sólo dos cosas:

a) En general son perezosos y a veces estúpidos.

b) Nunca les creas.

La opción a) es clara, sus esquemas de protección son arcaicos, apenas han

sufrido modificaciones, tan sólo incorporan trucos viejos sobre esquemas bien

conocidos. Programas en lenguajes de alto nivel tipo C++, Visual Basic, estos

compiladores se basan en librerías bien conocidas. El programador no tiene el

amor propio de crear su propia rutina de protección en ensamblador, prefieren

dejarla en manos de compiladores que crean código ensamblador ineficiente y

fácilmente legible. ¿A qué se debe todo esto?, a su mentalidad comercial de la

vida, no trabajan por placer, son esclavos de su trabajo, verdaderos zombies

andantes. Lo importante es acabar y pronto no importa la calidad del soft o las

quejas del estúpido usuario por la lentitud del programa o por los "cuelgues".

Una breve disgresión, no os habéis preguntado por que las versiones de los

programas salen como churros cada 2 días. La respuesta es que se dejan a

propósito las cosas sin hacer o mal hechas para que al cabo de dos días se pueda

sacar una flamante nueva versión con una leve modificación la cual debes

comprar para no quedarse obsoleto, Dios mío que abominación!

Respecto a b) baste decir que siempre tratan de encubrir sus errores con

malolientes mentiras.

PROGRAMADORES, leed esto y aprended, pero que digo, no tenéis tiempo ni

para joder, ni para ver por donde os joden....:-)

ESQUEMAS DE PROTECCIÓN BASADOS EN NÚMEROS DE SERIE

Ésta es una "antigua" técnica de protección utilizada por las toneladas de

shareware que nos inundan, basta comprarse un CD por 4 perras y ver 650 MB

de programas basura, en general, deseosos de exprimir nuestras carteras.

Veamos como funcionan.

El programa puede ser total o parcialmente funcional, pero posee estúpidas

ventanas que nos recuerdan que somos usuarios no registrados, o bien pitidos

mal sonantes o mensajes perennes proclamando que les mandemos dinero. A

veces, pasado cierto tiempo o pasado un número de ejecuciones, el programa deja

de funcionar. Todo esto inconvenientes se resuelven llamando a la casa que

construyó el software (imaginad lo que puede costar una llamadita o un Fax a un

pueblo mal oliente del esto de Utah en USA), o bien mandando un e-mail. En

cualquier caso hay que indicar el número de VISA donde ellos clavarán sus

garras para rellenar sus ya nutridas arcas. Una vez desplumado recibimos por e-

mail o por teléfono una palabra mágica, un número de serie, una password, o lo

que sea, yo lo llamaré "pwd". Esta pwd desbloquea el programa y/o elimina las

estúpidas ventanas recordatorio.

Análisis de esquemas con número de serie

Page 10: Como crakear por estado+porcino

En general existen dos formas en las que trabajan las rutinas de protección de

número de serie:

a) Número de serie independiente del usuario.

b) Números de serie adaptados al usuario.

a) si extraemos una pwd, ésta servirá a todos los usuarios. Una pwd válida se

diferencia de una inválida (por las muletas, es un chiste) por la presencia de

ciertos caracteres en posiciones fijas (p.e. el carácter 8 debe ser una 'C', el 10 un

'-'). Toda pwd que cumpla las restricciones será una pwd válida. Por norma, casi

todas las pass incorporan el carácter '-', 2b en hexa. A veces no se requieren

caracteres fijos , sino que la suma ASCII cumpla cierta condición. Cada letra del

alfabeto y cada carácter numérico tiene una cantidad asociada, su código ASCII

(p.e. par el acute0acutees el 30 en hexa o el 40 en decimal). La técnica consiste en

sumar el código de cada carácter y comprobar la suma (que a veces se llama

checksum) con una cierta cantidad. Una variante es modificar el valor ASCII a

través de una tabla que asocia a cada carácter un número distinto.

Crackear esto es fácil de crackear:

cmp suma,sumacorrecta ---->cmp suma,sumacorrecta

jz ok -------------------->jnz ok

Es posible mezclar las tres técnicas, caracteres fijos, cheksum y modificación del

código ASCII. En un capítulo próximo veremos un ejemplo de esto.

b) En este caso se utiliza el nombre, los apellidos, o el nombre de la empresas o

todo junto para generar un pwd. Aquí las técnicas son más imaginativas: coger

cierto caracteres y repetirlos hasta llegar a un tamaño, usar el código ASCII de

ciertas caracteres como índice de una tabla de encriptación...En fin, depende de

las paranoias del programador. Lo cierto es que se debe generar la pwd correcta

para nuestros dato y ésta se debe comparar con la introducida. Aquí es donde

podemos atacar ,en al comprobación. Realmente no hace falta crackear, basta

con copiar la pwd correcta e introducirla como nuestra pwd, o bien crackear las

sentencias de comprobación para que sirva cualquier pass. Lo primero es mejor

ya que nos servirá para futuras versiones.

Se puede mezclar ambas técnicas, como veremos en un capítulo próximo, y

generar un checksum para una cierta cadena extraída a partir de los datos del

usuario y comprobar el cheksum de nuestra cadena.

¿Cómo atacar?

Antes de ir como unos desposeídos a reventar el programa, es totalmente

necesario echar un vistazo, ver el posible esquema de protección y los posibles

puntos de ataque. En general no hay que buscar mucho, los puntos débiles tiene

un letrero rojo que dice " Hey estoy aquí".

En el caso de los esquemas basados en números de serie, la cosa está clara: esos

estúpidos mensajes recordatorios son la puerta de entrada. Si somos usuarios no

registrados aparecen, si nos registramos desaparecen. Por tanto debe haber algo

Page 11: Como crakear por estado+porcino

que indique cuando deben o no aparecer, este algo es un flag, que no es más que

un conmutador (como el de una bombilla). Cuando está en ON aparecen los

mensajes, cuando en OFF desaparecen. En nuestro contexto, un flag no es más

que una posición dentro de la memoria con un cierto valor. La memoria del

ordenador es como un cartón de huevos (1 huevo = 1 bit), donde cada hueco tiene

un número diferente al que se le llama dirección de memoria. En cada hueco

puede haber un huevo (valor 1) o no haberlo (valor 0). Los agujeros se agrupan, 8

agujeros es un Byte, 1024 Bytes es un MegaByte o MB, 1024 MB es un GigaByte

o GB, 1024 GB es un TeraByte o TB. Fácil, ¿verdad?. La memoria está

compuesta de bits, estos bits se pueden interpretar de muchas formas, flags,

datos, instrucciones. Por ejemplo 01010101 puede ser un flag de activación, la

cadena "hola" o lo sentencia pinta la pantalla, depende de como lo consideremos.

En el caso de tomarlo como instrucciones, se habla de dirección de la instrucción

en memoria, que no es más que la dirección del primer del primer bit que la

compone.

El valor que podemos encontrar en un flag puede variar. Para ON podemos

encontrar un 1 y para OFF un 0. Se puede usar la llamada lógica negada y tiene

en ON un 0 y en OFF un 1. Todo lo que se pueda hacer con 0 y 1, se pude

reconvertir cambiando los 0 por 1 y los 1 por 0. Una "mejora" de los

programadores es utilizar flags distintos a 0,1, cuán inteligentes!. Recuerdo cierto

esquema que utilizaba el flag DEAD en hexadecimal. Los sistemas de numeración

(como el hexadecimal o hexa para abreviar) son formas diferentes de contar y de

representar cantidades. En base 10, la de toa la vida, se empieza en 0 y se acaba

en 9. en hexa se comienza en 0 y se acaba en F (10=a,11=b,12=c,13=d,14=e,15=f).

Veamos algo más práctico:

cmp ax,flag; Compara el valor de ax con el valor del flag

jz mensajes; Si son iguales muestra los mensajes.

sigue: inc dx; Continúa normalmente.

.....

mensajes: mov edx,45

.....

jmp sigue;Salta y continua normalmente.

Este puede ser un esquema típico. Dependiendo del valor del flag se muestran los

mensajes o no.

Llegamos a la parte interesante, cada mensaje recordatorio debe tener una

comprobación como la del ejemplo. Basta con analizar los mensajes recordatorio

y descubrir la dirección de memoria del flag. Pero quién narices rellena el flag?.

Obviamente debe haber como mínimo dos inicializaciones, una al comienzo de la

Page 12: Como crakear por estado+porcino

ejecución del programa que pone al flag a OFF y la rutina de protección que lo

debe poner a ON si la pwd es correcta. ¿Me sigues hasta ahora?.

Es fácil ahora saber donde atacar, un crack elegante sería poner la inicialización

al comienzo del programa a ON en vez de OFF. Recuerda esto: " Un buen

cracker debe ser ante todo elegante y sutil, nada intrusivo".

Otro punto de ataque

Hasta ahora hemos visto que analizando los estúpidos mensajes se puede conocer

la dirección de memoria del flag y a partir de ahí su inicialización. Pero en los

esquemas basados en números de series existe un punto de entrada más claro aún

que los flags: la propia rutina de protección. Veamos un método sencillo para

llegar a ella.

Si uno se va a la opción de registro e introduce un número de serie falso,

aparecerá una estúpida ventana indicando que nos hemos equivocado: "Soryy

your password is invalid" o algo parecido que traducido al cristiano es "Tío te ha

equivocado, JAAARL". Esto no es una vía de entrada, esto es una autopista de

1GB de carriles. Basta con pensar un poco, quién es la encargada de mandar este

mensaje? ,evidentemente la propia rutina de protección, interesante verdad?. Ya

sólo queda encerrar la rutina, ver como trabaja , cambiar un par de bytes

(siempre de la forma más elegante posible) y listo, programa crackeado.

Comparación de ataques

¿Qué crack es mejor?, el de flags o de la rutina de protección?. Esto depende en

gran medida de programa, de tus habilidades y del tipo de que dispongas. Con la

rutina de protección se puede analizar en profundidad el esquema, ver como

trabaja y hasta extraer tu propio número de serie, osea el número de serie que la

empresa te da si te registras, pero esto requiere tiempo y esfuerzo, obteniendo

una satisfacción moral e intelectual. Además, en la próxima versión del programa

est pwd posiblemente funcionará y no necesitarás crackear de nuevo. Mediante

cracks al flag, se requiere un tiempo menor, pero la próxima versión habrá que

crackearla de nuevo (no importa seguro que estos estúpidos programadores

habrán seguido la mismo patrón de protección). Un crack a la rutina de exige un

conocimiento profundo de la misma, lo que puede llevar a tu propio generador de

claves (igualito o seguramente mejor que el tiene la empresa).

CÓMO CRACKEAR TECHFACTS 95:

Objetivo: TechFacts 95.

Versión: 1.30 3/7/97

Nombre del ejecutable: Teckfct95.exe

Website: http://ourworld.compuserve.com/homepage/deansoft

Tamaño del ejecutable: 1.251.840 bytes.

Tipo de protección: Por número de serie.

Page 13: Como crakear por estado+porcino

Dificultad: ameba.

Tiempo de crackeo: 2 minutos.

Herramientas: SoftIce 3.0 y Editor Hexadecimal.

Siguiendo las recomendaciones de +ORC empezaremos por crackear nuestras

propias herramientas crack. El programa en cuestión es una pequeña joya que nos

permitirá, entre otras muchas cosas, rastrear las acciones de un determinado

programa, buscar cadenas de caracteres en ficheros, trabajar con dll..

Generalmente,lo utilizo para rastrear programas de instalación, obteniendo

información de los ficheros creados, las entradas de registro añadidas o borradas,

...

Manos a la obra. El programa es un ejecutable que no necesita otro fichero para

funcionar (cosa rara en estos días). Así pues, arranquemos el programa veamos lo

que ocurre. Aparece una horrible ventana diciendo que utilicemos nuestra VISA o

MASTERCARD y que soltemos los 19,99 dólares (unas 2500 pesetas) que tenemos

para ir a tomar cervezas.

Echemos un vistazo al programa. Entre otras cosas, hay una opción en

TOOLS/WATCH SYSTEM, que nos permite rastrear un programa. En

HELP/HELP TOPICS/ORDER FORM aparece una hoja de registro en la que nos

avisa de que además tenemos que paga 2 dólares para gastos de envío, ¡cómo si

costará 250 pelas enviar un mail con el número de serie!.

En HELP/ABOUT TECHFACTS 95 encontramos un botón USE REG KEY. Aquí

es donde tenemos que introducir nuestro Nombre (First name), apellidos (Last

name) y el número de serie correspondiente que lo recibiremos por mail si

pagáramos 19,99 dólares más 2 dólares de gastos de envío. Empecemos por aquí.

Pongamos un nombre, un apellido y un número cualquiera y pulsemos el botón

REGISTER. Entonces escuchamos un pitido y aparece una ventana de mensaje

diciendo REGISTRATION KEY FAILED. Ahora ¡pensemos un poco!, apliquemos

un poco de ZEN CRACKING.

Lo único anormal es el pitido. Si tu fueras un programador y quisieras que pitará

tu "cacharro" tienes dos opciones construirte un bonito programa en ensamblador

que lo haga, o bien utilizar una función de pitido presente en alguna de las

vomitivas librerías de funciones, también llamadas API. ¿ Qué piensas que ha

hecho nuestro "vago" programador ?. ¡Bingo! ha utilizado la función

MessageBeep de la librería USER32.DLL. Este un punto de ataque muy claro,

aunque existen muchos otros.

Apliquemos la técnica LIVE, es decir, utilizaremos el SoftIce. Reinicialicemos

nuestro ordenador en modo Ms-Dos, lancemos el WinIce y volveremos a Windows.

Abramos el LOADER de SoftIce y en FILE/OPEN MODULE seleccionemos el

fichero Tekfct95.exe. Pulsemos Load o el botón con las ruedecillas dentadas. Nos

aparece una ventana de mensaje del SoftIce diciendo que no puede cargar la tabla

Page 14: Como crakear por estado+porcino

de símbolos, pulsemos el botón SÍ y aparecemos directamente en el SoftIce con la

pantalla en modo texto. En este momento nos encontramos en la primera sentencia

de nuestro programa. Pulsemos bpx messagebeep con esto tomaremos el control

antes de que aparezca el pitido. Con Ctrl-D volvemos a Windoce y el programa

sigue ejecutándose normalmente pero con un cebo en messagebeep. Elegimos la

opción de registro y escribimos cualquier cosa en nombre, apellidos y número de

serie, pulsamos el botón y aparecemos de bruces en :

USER32!MessageBeep

014F:BFF623C1 B148 MOV CL,48 **** Aparecemos aquí.****

014F:BFF623C3 EB12 JMP BFF623D7

Si pulsamos en este momento F12(continuar hasta un RET) nos situaremos en:

014F:0047BA65 EB11 jmp 0047BA78

014F:0047BA67 6A30 push 00000030

014F:0047BA69 E822A7F8FF Call 00406190 **** Llamada a MessageBeep****

014F:0047BA6E B8BCBB4700 mov eax, 0047BBBC

014F:0047BA73 E824BEFBFF call 0043789C **** Pintamos la ventana de error

****

En tu ordenador las direcciones de memoria pueden ser diferentes.

¡Sintamos el código!. Estamos en mitad de las sentencias de error, lo que implica

que debe haber un salto condicional a este conjunto de sentencias de error. El salto

debe ser condicional porque en caso de haber metido correctamente el número de

serie habríamos obtenido algún tipo de mensaje de felicitación. Así pues, sólo

debemos encontrar ese salto condicional y modificarlo.

Miremos por encima de la dirección 014F:0047BA69, nos encontramos en

014F:0047BA65 un salto incondicional jmp 0047BA78, en una ejecución normal

nunca llegaríamos a 0047BA67 ya que siempre saltaríamos a 0047BA78. Por tanto,

lo que debemos buscar es un salto condicional a la dirección 0047BA67. Si

volvemos hacia atrás un poco con los cursores encontramos este bonito salto

014F:0047B934 E89B73F8FF call 00402CD4

014F:0047B939 0F8528010000 jne 0047BA67 **** ¡BINGO! ****

014F:0047B93F 8D45B7 lea eax, dword ptr [ebp-49]

Hemos encontrado el salto, sólamente hay que modificarlo. Fijaos que el salto se

produce después de una llamada a la rutina call 00402CD4 apostaría el pellejo a

que esta es una rutina para comprobar si tu número de serie es correcto. Si no es

Page 15: Como crakear por estado+porcino

igual (jne) salta a las sentencias de error. Si es igual continua ejecutándose. Hay

muchas formas de invertir el salto:

1.- Cambiar 0F8528010000 jne 0047BA67 por

0F8500000000 jne 0047B93F

2.- Cambiar 0F8528010000 jne 0047BA67 por

404840484048 inc eax,dec eax, inc eax, dec eax, inc eax, dec eax

La 1 es un salto neutro, sea igual o no siempre se ejecuta la sentencia siguiente. La

2 es la preferida por +ORC, cambia el salto por un conjunto de parejas

incrementar - decrementar que dejan el registro eax sin cambios en su contenido.

Solamente hay que tener en cuenta dos cosas para modificar el código, sustituir

siempre el mismo número de bytes (cambias 2 bytes por 2 bytes) y que tus

modificaciones sean una sentencia en ensamblador correcta.

El SoftIce nos permite hacer cambios On-Fly, es decir, en ese mismo instante, pero

el cambio no es permanente. Para ello, nos vemos obligados a utilizar algún editor

hexadecimal, con el cual abriremos el fichero ejecutable, y buscaremos la cadena

en hexadecimal E89B73F8FF0F8528010000 y la cambiaremos por

E89B73F8FF0F8500000000. La cadena se encuentra en el offset 0X7AD34(los

números en hexa llevan delante un 0X) que en decimal es 503092.

Así pues tenemos que irnos al byte 503092 de fichero ejecutable y comenzar a

hacer cambios.

Ahora tendremos el ejecutable parcheado, si nos registramos nuestro número de

serie siempre será aceptado.

Un crack no es más que un pequeño programa que abre un fichero y cambia un

par de bytes por otros. ¡Nada más sencillo! Sólo hay que saber qué bytes hay que

cambiar. Cuantos menos bytes se cambien más elegante será el crack.

Si habéis seguido todos los pasos habéis crackeado vuestro primer programa. Aun

nos sois cracker pero estáis en la buena senda. Sólo hay que poner interés.

Para gentes más avezadas, comentaré que el flag de activación se iniciativa

correctamente en :0047BA5E mov byte ptr [004CF31A],00 La rutina de protección

es bastante patética, con gran cantidad de código inactivo. Empieza en :47B5C0.

Obviamente se podría haber hecho algún otro tipo de pero este es el más simple (se

podría haber obtenido el número de serie real, o haber creado un generador de

claves).El programador ha puesta a "pelo" la dirección de retorno en :47BA3F

push 47BA54. Es un ridículo truco que nos hará perdernos si continuamos

ejecutando normalmente, por ello es conveniente pulsar "F12" y mirar hacia por

encima sin ejecutar sentencias.

Page 16: Como crakear por estado+porcino

Espero vuestras opiniones, sugerencias y ensayos en [email protected]

En breve analizaremos tipos de protecciones mucho más interesantes.

Recordad bebed de la fuente, buscad a +ORC en la red.

Page 17: Como crakear por estado+porcino

COMO CRAKEAR POR ESTADO+PORCINO

CAPÍTULO II. Diseccionando a los Muertos

Uedit 5.0

Enero 1998

Indice

INTRODUCCIÓN

DESCENSO A LOS INFIERNOS: - Mu bien y esto pa que coño me sirve.

EL LISTADO MUERTO: - Manos a a la obra.

INTRODUCCIÓN

!Saludos Familia !

Empezemos este año con una de las técnicas crack más importantes "El Listado

muerto" o "death listing". Hasta ahora hemos visto la "aproximación en vivo" o

"live approaching" con el maravilloso Softice.

DESCENSO A LOS INFIERNOS.

Veamos de una vez por todas como se ejecuta una sentencia en el procesador,

desde el inicio hasta el final.

Supongamos que estamos programando en un lenguaje de Alto Nivel (C, C++,

Pascal,Delphi,Visual Basic). Se llaman de Alto Nivel para diferenciarlos de los

lenguajes más próximos al procesador, como el Ensamblador, a los que se llama

lenguajes de Bajo Nivel. Cuanto más "Alto" programemos, más control

perderemos sobre nuestro programa, y esto es un grave problema.

Supongamos un programa, escrito en Alto Nivel, que pinta la frase "HOLA

MUNDO" en pantalla. ¿ Qué pasos se siguen hasta que realmente se pinta la

Page 18: Como crakear por estado+porcino

frase?.

Nuestro programa debe de residir en un fichero, al que se denomina fichero

fuente, en el que aparece la sentencia para pintar la frase. Este fichero no es

entendible por el procesador, sólo es un conjunto de caracteres, mu diferente del

conjunto de 0 y 1 que necesita para trabajar. Es aquí donde entra el compilador,

transforma el fichero fuente en un fichero intermedio, también llamado fichero

objeto. En esta transformación se comprueba la sintaxis de las sentencias ( falta el

punto y coma) y la semántica (has pasado un entero cuando se esperaba un real).

El compilador realiza entonces una fase de linkado para reunir los distintos

ficheros objeto que conforman nuestro programa final (aunque tengamos un

único fichero fuente). En esta fase se determinan el mapeo final del program en

memoria (que dirección de memoria va a tener cada instrucción del conjunto de

ficheros objeto). Tras la fase de linkado, el programa final se encuentra en un

lenguaje llamado pseudocódigo, mu sencillote. Aquí se pueden tomar 3 vías.

Primera: Dejar el programa como está, y que otros pogramas o librerías (como la

vbrun500.dll de Visual Basic) lo traduzcan (lo interpreten) a sentencias

entendibles por el porcesador.

Segunda: Transformar el pseudocódigo a un lenguaje de Bajo Nivel como el

ensamblador. En tal caso, se necesitará un compilador de ensamblador para que

el programa pueda ser ejecutado. OJO, el ensamblador no es entendible por el

tonto procesador que sólo ve unos y ceros, son dos cosas distintas.

Tecera: La más común, transformar directamente de pseudocódigo a ejecutable

Un fichero ejecutable consta de unos y ceros (o de números en hexa, según se

mire) ordenados de una forma especial; ordenados en instrucciones: Los 3

primeros números son el tipo de instrucción, los 4 siguientes el operando1, el

siguiente el operador...Cada instrucción es depiezada dentro del procesador y dan

a lugar a la ejecución de un conjunto de programas presenten dentro del

procesador, son las microrutinas. Estas microrutinas son las encargadas de

bloquear buses, activar multiplexores, dar tensión a un transistor o no, pa

enterndernos. Accionando correctamente buses, multiplexires... se pintará

relamete la frase en pantalla.

Bien, esto es todo.

Mu bien y esto pa que coño me sirve.

Existe una correspondencia directa entre lenguaje ensablador y programa

ejecutable. Gracias a un desensamblador (W32DASM, IDA PRO), a partir de un

ejecutable podemos obtener el programa el lenguaje ensablador sin disponer del

fichero fuente. Un program en ensamblador puede ser fácilmente entendido por

los humanos (o eso dicen algunos). Esto nos da un poder tremendo a los crackers.

Podemos saber como funciona un programa sin necesitar del programa original.

Y lo que es má aún, independientemente del lenguaje de Alto Nivel. Todos los

lenguajestienen que pasar a ejecutable de alguna u otra forma, y es aquí cuando

Page 19: Como crakear por estado+porcino

usamos nuestro desensamblador y extraer su listado en ensablador. Da igual que

programa esté hecho en Pascal, O C++, lo entederemos igualmente ya que

leeremos ensamblador.

EL LISTADO MUERTO

La idea es sencilla. Cojemos nuestro desensamblador favorito y se lo pasamos al

objetivo. Obtendremos un listado en ensamblador de nuestro programa a

crackear. La técnica crack se llama Listado muerto porque entenderemos y

manejaremos el programa con este listado, sin tener que ejecutarlo, con el

programa muerto. A diferencia de cuando lanzamos el SoftIce y entendemos el

programa cuando se está ejecuntandose, cuando "vive".

Hay tre ventajas fundaentales para utilizar el Listado Muerto.

- Podemos seguir el programa fácilmemte de atrás hacia adelante, basta con pasar

de página, no hace falta volver a ejecutatlo.

- Es mucho más relajado imprimir y estudiar 4 páginas de código que rastrear

con el SoftIce. Este es uno de los consejos de +ORC.

- Se descubren pequeños secretos, como rutinas inactivas.

La paciencia y la tranquilidad son dos requisitos fundamentales en un cracker. Es

fácil perderte trazando con el SoftIce e imposible con el Listado Muerto.

Manos a la Obra

Una vez desensamblado el objetivo, la idea es buscar cadenas de texto

interesantes, como "unregistered", "expired", "congratulations" y mirar al

rededor de estas cadenas buscando un salto mágico. Las palabras en concreto

dependen del programa y son las que aparecen para recordarte que aún no te has

registrado.

CÓMO CRACKEAR UEDIT 5.0

Objetivo: Uedit 5.0.

Versión: 5.0 3/7/97

Nombre del ejecutable: uedit32.exe

Website: http://www.uedit.com

Tamaño del ejecutable: 812.514 bytes.

Tipo de protección: Por número de serie y temporal.

Dificultad: Medio.

Tiempo de crackeo: 5 minutos.

Herramientas: W32dasm8.X, SoftIce.

Page 20: Como crakear por estado+porcino

Siguiendo la recomendación del maestro +ORC, continuamos con el crack a

nuestras herramientas de trabajo. En este caso nos encontramos ante un excelente

editor hexadecimal, vital para nuestros negocios :-)

Instalemos el programa, ejecutémoslo y veamos lo que nos encontramos. ARRJJ!!,

una horrible ventana nos dice que tenemos 45 diás para registranos. Además tiene

un bonito botón "Enter Authorization Code". Pulsemos y veamos. Un típico

nombre de usario y número de serie (al que le llamaré passwod o pass). Si

pulsamos cuaquier guarrada en ambos, sorpresa, ningúm mensaje advirtiendo del

error, ningún pitido (recordais el capítulo I), nada excepto una ventana de mensaje

que dice que hace falta cerrar el programa para validar el código. ¿Habrá leido

Ian D. Mead las lecciones de Estado+Porcino?. Bien, ¿por donde atacar?. No

tenemos nada que nos indique que nos hemos equivocado. ¿Que tal si usamos el

Listado Muerto amiguitos?

Una vez desensablado el programa y dentro del W32dasm pulsemos el botón de

Strn Ref (el boton que está al lado del botón de impresora) para ver las cadenas de

caracteres que aparecen en el nuetro objetivo. Que vemos, que casualidad ,

tenemos la frase "Thank you fot supporting Shareware" , hagamos doble click y

veamos donde aparecemos:

* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00401B77(C) |

:00401B7D 83FB09 cmp ebx, 00000009

:00401B80 7504 jne 00401B86

:00401B82 C645EC20 mov [ebp-14], 20 * Referenced by a (U)nconditional or (C)onditional Jump

at

:00401B86 8D45C8 lea eax, dword ptr [ebp-38]

* Possible Reference to String Resource ID=00010: " Thank you for supporting Shareware." |

:00401B89 6A0A push 0000000A

En :00401B89 tenemos una referencia a la cadena que nos interesa. Cada frase del

programa tiene asociado un número, en este caso es el 0000000A y este número se

les pasa al las rutinas que tienen que imprimir los mensajes. La forma tradicional

de pasarle parámetros a una rutina es a través la pila mediante push (como en

:00401B89 ). Los parámetros se pasan empezando por el último, es lo que se llama

paso de parámetros mediate el modelo de PASCAL, existen otros modelos, pero

son poco utilizados.

¿Estamos en el camino adecuado¿, nop, ya que el número de nuestra frase, el

0000000A (en es número 10 en decimal) es muy utilizado en cualquier programa y

cada vez que aparezca, el desensamblador pensará que se está haciendo referencia

a nuestra frase. Bien pensemos un poco.

Nuestro programa está limitado por 45 días de uso, pasado ese tiempo, lo normal

Page 21: Como crakear por estado+porcino

es que nos aparezca una frase deciendo algo así como "Evaluation time expired".

Busquemos (Con el botón de la linterna ) la palabra expired pasada a una rutina

mediante push a ver que encontramos.

:043F7D3 E8375DFCFF call 0040550F

:0043F7D8 391DDC0C4A00 cmp dword ptr [004A0CDC], ebx

:0043F7DE 758A jne 0043F76A

:0043F7E0 8D4D10 lea ecx, dword ptr [ebp+10]

:0043F7E3 E829C00100 call 0045B811

:0043F7E8 8D4D14 lea ecx, dword ptr [ebp+14]

:0043F7EB C645FC01 mov [ebp-04], 01

:0043F7EF E81DC00100 call 0045B811

* Possible Reference to String Resource ID=00068: "UltraEdit 45 Day

Evaluation time expired!!!!" |

:0043F7F4 6A44 push 00000044

BINGO. No sentís el código, no percibis como estamos en el camino correcto.

Si, tenemos en :0043F7F4 un push con el número asociado a la frase que buscamos

y justo en :0043F7DE un salto a 0043F76A que evita imprimir el mesaje, pero el

punto clave es ver la comprobación del salto en :0043F7D8. Se comprueba si el

contenido de EBX es igual a una dirección fija de memoria la [004A0CDC]. Las

direcciones fijas son las típicas variables globales tan mal utilizadas en los

programas. Tenemos una variable global que controla la aparición de un mensaje

de error. En algún punto del programa debe de inicializarse [004A0CDC] con un

valor ,si localizamos este trozo de código, estaremos en plena rutina de

comprobación. ¿Facil, verdad?

Busquemos [004A0CDC] y veamos quien la inicializa, sólo nos interesan las

sentencias que inicializen la variable, no las sentencias que comprueban su valor.

Normalmente se inicializa por defecto a un valor de error (indicando que no

estamos registrados) y se inicializa corectamente cuando nos registrmemos.

Conforme aparecen occurencias de nuestra variable glabal sabemos que estamos

en el buen camino porque siempre está rodeada de mensajes de error o de

felicitación.

Buscando [004A0CDC] encontramos las siguientes sentencias que modifican la

variable (el resto de apariciones son comprobaciones del valor)

:00405541 893DDC0C4A00 mov dword ptr [004A0CDC], edi

Page 22: Como crakear por estado+porcino

:004056A3 891DDC0C4A00 mov dword ptr [004A0CDC], ebx

:004057D4 8325DC0C4A0000 and dword ptr [004A0CDC], 00000000

:00426924 891DDC0C4A00 mov dword ptr [004A0CDC], ebx

:0043F684 C705DC0C4A0001000000 mov dword ptr [004A0CDC], 00000001

Que tenemos aquí. Parece lógico pensar que en :004057D4 tenemos la incialización

por defecto, ya que un AND con ceros da cero. La sentencia contraria la tenemos

en :0043F684 que mueve 1 a la variable, esto sin duda indica que nos hemos

registrado. También podría ser al revés, cero registrado, uno no registrado, pero

este no es el caso. Basta ejecutar el Softice y poner bpr 004A0CDC 004A0CDC rw ,

la primera modificación debe ser la asignación por defecto, en este caso la

:004057D4. Por tanto solo debemos centrarnos en la asignación a uno :0043F684,

olvidando el resto de asignaciones. Esto es un axioma fundamental ante la duda,

elige siempre la solución más sencilla. Bien, veamos que hay entorno a la

:0043F684

:0043F65C E89A560300 call 00474CFB

:0043F661 8B7804 mov edi, dword ptr [eax+04]

:0043F664 8B4514 mov eax, dword ptr [ebp+14]

:0043F667 48 dec eax

:0043F668 7478 je 0043F6E2

:0043F66A 48 dec eax

:0043F66B 0F85F9000000 jne 0043F76A

:0043F671 391DDC0C4A00 cmp dword ptr [004A0CDC], ebx

:0043F677 0F85DA010000 jne 0043F857

:0043F67D 833DBC024A0000 cmp dword ptr [004A02BC], 00000000

:0043F684 C705DC0C4A0001000000 mov dword ptr [004A0CDC], 00000001

Tenemos diversos saltos que evitan nuestra asignación a uno. El primer salto, sestá

en :0043F668 7478 je 0043F6E2 que tal si lo cambiamos por EB1A jmp 43F684.

Osea, siempre saltamos a 43F684 evitando las comprobaciones de :0043F66B y

:0043F677.El código EB es la instrucción de salto incondincional JMP, 1A es el

número de bytes desde la sentencia condicional hasta la sentencia donde queremos

saltar. Fácil, ¿verdad?.

Perfecto, rula. Basta con buscar en el ejecutable uedit32 la secuencia

8B451448747848 y cambiarla por 8B451448EB1A48. Pero hay un peque problema,

el crack funciona pero no tenemos un número de serie correcto. En principio

basta, pero pensando un poco podremos sacar nuestro propio número de Serie. ¿

Page 23: Como crakear por estado+porcino

Qué se os ocurre?

Sip, exactamante,¿ que tal si le seguimos la pista a nuestro número de serie basura

y vemos con quién se comparará? . La pregunata es, donde coloco un bpx para

pararme justo antes de que se compruebe mi número de serie. La respuesta es

sencilla, en :43F618 (echarle un vistazo al listado muerto) comienza la rutina en la

que se asigna a 1 nuestra variable glabal. Este puede ser un buen comienzo.

Abrimos el Softice con el uedit, ponemos nuestro nombre Estado+Porcino y un

número basura 1212121212121212 . Cerramos el uedit y lanzamos de nuevo el

SoftIce poniendo la sentencia bpx 43F618. Aparecemos en :43F618, ahora es el

momento de buscan nuestro número de serie con s 30:00 l ffffffff ´12121212´ lo

encontramos es :942F9C (esta direcciónpuede cambiar en tu ordenador).

Borramos el punto de ruptura anterior con bc 0 y creamos uno nuevo con la

dirección donde está nuestra password con bpr 942F9C 942F9C+f rw seguimos

adelante con Crtl+D para ver quien caen en buestra trampa. Aparecemos en

:40B73A con varios movsd , nuestra password se está copiando en otro sitio. La

sentencia movsd, copia caracteres de ees:esi a ees:edi. Pongamos en el SoftIce d

ees:edi para ver como realmente se va a copiar, además pongamos otro punto de

ruptura en la nueva posición de nuestra password con bpr ees:edi ees:edi+f rw

.Curiosamente, si nos movemos un poco con los cursores por ees:edi aparecen las

passwords correctas, pero todavía no es el momento. Lancemos de nuevo el SoftIce

con Crtl+D y aparecemos en :444FOE ,aquí encontramos una pequeña

comprobación, en ecx tenemos nuestra pass (para comprobarlo basta con poner d

ecx) y en edx apuntamos a una zona de nuestro nombre, concretamente a

"tado+Porcino". Esto no es exactamente lo qu buscamos, así que sigamos adelante

con Crtl+D y aparecemos en :444EBO con una comprobación entre edx y ecx a

través de al. Curiosamente edx apunta a nuestra pass y ecx apunta a

Y2+cHdcBd6=DBC/P este churro es la pass correcta, si seguimos con Crtl+D

aparecemos en el mismo sitio con edx apuntando a nuestra pass y ecx apunta a

JWKTUUTH02166710 otra pass correcta. A lo largo de la evolución del programa

desde sus primeras versiones, se ha cambiado 2 veces de generador de pass por

cuestiones de seguridad, ¡qué estúpidos!. Por eso la doble comprobación, ver si

nuestra pass es del antiguo generador o del nuevo.

Eso es todo por ahora, no seais unos descerebrados y utilicéis mi pass, buscad la

vuestra, es mu sencillote.

Espero vuestras opiniones, sugerencias y ensayos en [email protected]

En breve analizaremos tipos de protecciones mucho más interesantes.

Recordad bebed de la fuente, buscad a +ORC en la red.

Page 24: Como crakear por estado+porcino

COMO CRAKEAR POR ESTADO+PORCINO

CAPÍTULO III. CORTA HISTORIA DEL TIEMPO

Norton CrashGuard Deluxe 3.0

Mayo 1998

Indice

INTRODUCCIÓN

TIPOS DE PROTECCIONES TEMPORALES

UN POCO DE TEORÍA

EN BUSCA DE LA FRASE MÁGICA

EL REGISTRO DEL SISTEMA

COMO CRACKEAR Norton CrashGuard Deluxe 3.0:

- PRIMERA EXPLORACIÓN.

- PRIMERA SORPRESA.

- SEGUNDA SORPRESA.

- LA APROXIMACIÓN DIFÍCIL:

AL ATAQUEEEEEEEEEEEEEE

LA FECHA DE CADUCIDAD

CHECKSUMS PARAINOCOS

CHECKSUMS HASTA EN LA SOPA

LA MISMA PROTECCIÓN EN TODOS SITIOS

- LA APROXIMACIÓN FÁCIL:

REUNIENDO LAS PIEZAS

LA COMPRA VIRTUAL

MODIFICANDO EL REGISTRO

MODIFICACIÓN DE LA VARIABLE DEL REGISTRO DEL SISTEMA

MORALEJA

Page 25: Como crakear por estado+porcino

INTRODUCCIÓN

¡Saludos Familia!

Bastante tiempo desde mi último artículo, lo sé, pero ya estamos de vuelta. Nos

ocuparemos ahora de las protecciones temporales, veremos un poco de teoría y lo

aprendido lo aplicaremos al programa Norton CrashGuard Deluxe 3.0 desde dos

puntos de vista, el temporal y el de la password pa registrarse.

TIPOS DE PROTECCIONES TEMPORALES.

Demos un peque repaso a los diferentes esquemas de protección temporal que nos

podemos encontrar (recomiendo la lectura del Capítulo 4.1 de +ORC )

- CINDERELLA. El programa funciona durante una cierto periodo de días

(digamos 15 días) comenzando desde la fecha de instalación.

- BEST_BEFORE. El programa funciona durante una cierto período de tiempo

independientemente de la fecha de instalación. El programa caduca el 30/12/97.

- COUNTDOWN. El programa funciona sólo durante unos minutos o unos

segundos.

- QUIVER. El programa funciona sólo durante un número determinado de

ejecuciones. Realmente no es una protección temporal, pero su esquema de

protección se parece mucho al de los otros tres tipos.

UN POCO DE TEORÍA

Analizemos como funciona una protección temporal.

Los "inteligentes programadores" ofertan sus productos completos al público con

ridículas protecciones.

Le colocan una fecha de caducidad, pasada la cual, el programa no funciona. Esta

idea la utilizan sobretodo las grandes compañías como Micro$oft, Corel, o

Symantec.

La idea es distribuir masivamenete sus productos aprovechando los estupendos

canales de distribución que ofrecen las revistas de Soft. Una vez inundado el

mercado, el usuario disfrutará del producto, se acostumbrará a él, hasta que le sea

indispensable y tenga que comprarlo a un precio desorbitado . Esta táctica no es

nueva, sino preguntad a algún camello, o como la CIA distribuyo la heroína entre

el Black Power.

Pensemos un poco. ¿Cómo conoce el programa que ya ha caducado el período de

evaluación?.

Page 26: Como crakear por estado+porcino

Supongamos que tenemos una evaluación e 15 días e instalamos nuestro programa

el 1 de febrero.

Sumando la fecha de instalación (1 Febrero) más el período de prueba se obtiene la

fecha de caducidad:15 febrero (El día en el que lo instalas cuenta como día hábil).

El programa, lo primero que calcula es si la fecha actual es menor o igual que la

fecha de caducidad, y en tal caso, se ejecuta normalmente.

Si es mayor, dará un bonito mensaje "El período de evaluación ha expirado".

Una cosa está clara, el programa debe guardar alguna de las dos fechas siguientes

(o las dos):

A - Fecha de Instalación y el período de evaluación.

B - Fecha de caducidad.

Lo normal es la opción B. Al instalarse el programa, se calcula la fecha de

caducidad y se guarda en algún sitio. Normalmente se guarda en el registro del

sistema bajo algún nombre estúpido, aunque se puede guardar en el win.ini,

system.ini, fichero oculto, o algún fichero que parezca inofensivo. Lo cierto es que

debe guardarlo.

Existe una variante, y es que la fecha de caducidad esté dentro del ejecutable. Un

ejemplo lo tenemos en la evaluación del Hotmetal 4.0., del tipo BEST_BEFORE,

que dentro de su ejecutable aparecía 31/12/97. Madre de Mitra, qué estúpidos

pueden llegar a ser los zombi-programadores. Dependiendo de la pericia del

programador la fecha de caducidad puede estar o no encriptada para ocultarla de

la vista del usuario y para que sea difícil modificarla. Resumiendo, el programa

debe guardar la fecha de caducidad y comprobarla al inicio del programa con la

fecha actual.

Ya sabemos de donde saca la fecha de cadudidad, pero, ¿de dónde saca la fecha

actual?. Normalmente (el 99% de las veces) se extrae con una llamada a la función

getlocaltimeo o getsystemtime. Pero se puede extraer viendo la fecha de algún

fichero que se modifique periódicamente como el system.dat o el bootlog.txt.

Los puntos de ataque a este esquema son claros:

- Atacar en el cálculo de la fecha de caducidad.

En vez de sumar 15 días sumamos 15 siglos. Esta aproximación es difícil por que el

cálculo se realiza una única vez, generalmente en la instalación.

- Modificar la fecha de caducidad.

Si la fecha está encriptada, necesitaríamos construir un algoritmo de encriptación

para la nueva fecha que deseemos introducir. Por lo que en general, puede ser

complicado.

- Forzar la caducidad del programa. Se analizan los mensajes que da el programa

y a partir de ellos se le sigue la pista hacia atrás. Es una táctica muy utilizada.

Page 27: Como crakear por estado+porcino

- Atacar en la comprobación de la fecha actual y la fecha de caducidad.

Simplemente modifica la comprobación para que siempre estemos en el período de

evaluación. Esta es una opción elegante.

Alguien podría pensar que si se echa pa trás el reloj de W95, la protección

temporal se elimina. Para evitar esta "trampilla", los programadores colocan

código como el siguiente:

SI está activada la marca de caducidad ENTONCES el programa ha caducado y se

finaliza el programa

DE LO CONTRARIO SI fechaActual>fechaCAducidad ENTONCES activar

marca de caducidad

Como veis si os pasais de la fecha de caducidad, se activa una marca que impedirá

que se ejecute el programa aunque modifiquéis el reloj. Esta marca se guarda en

los mismos sitios donde se guarda la fecha de caducidad.

A veces, la protección temporal queda eliminada introduciendo una palabra clave,

por lo que a veces es más rápido atacar por la password.

Para averiguar el fichero que contiene la protección temporal, se puede usar el

SoftIce y poner un bpx getlocaltime, o bien una nueva técnica, muy útil no sólo

para protecciones temporales.

Veámosla.

EN BUSCA DE LA FRASE MÁGICA

Todos los mensajes de un programa, los de error, los de felicitación, los de aviso,

no son más que cadenas de caracteres que deben de residir en un fichero. Para

protecciones temporales es útil buscar mensajes como 'expire', 'demo',

'evaluation'. Si localizamos estos mensajes habremos localizado, generalmente, el

fichero que contiene la protección y podemos desensamblarlo o pasarle el Softice.

Extendiendo esta idea, basta con buscar los mensajes 'unregistered', 'register' para

localizar el programa con la protección en esquemas por palabra clave.

Recomiendo una herramienta excelente para buscar cadenas, es el programa

sr32.exe, Search & Replace for Win 3x 95/NT, Funduc Software, Inc.

(www.funduc.com). Bajáoslo y crackearlo, tiene una bonita y sencillota protección

del tipo CINDERELLA.

EL REGISTRO DEL SISTEMA

El Registro del Sistema no es má que un fichero gigante (system.dat) donde W95 y

el esto de los programas dejan sus miserias, osea, sus variables, sus parámetros de

configuración, su fecha de caducidad, sus marcas de caducidad. Muchos cracks

sólo necesitan modificar adecuadamente el system.dat Es muy conveniente que le

echéis un vistazo, aprenderéis mucho y podréis modificar muchos de los

parámetros del Windoze. Para editar el registro, se utiliza normalmente el

programa regedit.exe que encontrareis en vuestro directorio de Windows.

Recomiendo que lo ejecutéis con el parámetro /v ,osease, c:\windows\regedit /v

Page 28: Como crakear por estado+porcino

CÓMO CRACKEAR Norton CrashGuard Deluxe 3.0

Objetivo: Norton CrashGuard Deluxe 3.0.

Versión: 3.0

Nombre del ejecutable: ncgd3w95.exe

Website: http://www.symantec.com

Tamaño del ejecutable: 11.964.671 bytes.

Tipo de protección: Cinderella.

Dificultad: Medio.

Tiempo de crackeo: 2 horas.

Herramientas: W32dasm8.X, SoftIce.

En esta ocasión, nuestro objetivo es una gran y abominable compañia, la Symantec y uno de sus muchos y abominables

producto: Norton CrashGuard Deluxe 3.0 Básicamente, el programa consigue, en algunas ocasiones, que las aplicaciones

que se cuelgan no bloqueen al Windoze. Cosa de agradecer dado el alto índice de siniestralidad de las aplicaciones y del

propio Windoze. Además de tener una B.D de información sobre el PC, una antivirus ... Se protege con protección temporal

CINDERELLA de 30 días.

PRIMERA EXPLORACIÓN

Instalamos el programa y antes de finalizar la instalación ya nos pide que nos registremos, mal asunto, quieren cobrar antes

de que probemos su producto, su codicia de palpa ante incluso de ver el programa.

Una vez instalado, nos ha metido a escondidas varias cosas:

- Una Dll con un extraño nombre: 30vfv6vn.sys situada en el raiz de la unidad c: El nombre varía en cada instalación, sólo

permanece fijo *fv6vn.sys, los 3 primeros caracteres son variables. Sospecho que sólo es un indicador para ver si el

programa ya ha sido instalado.

- Una aplicación en el arranque del Windoze Norton CrashGuard Deluxe Autocheck. Si pulsais CRTL+ALT+SUPR podreis

ver la aplicación por dos veces con el nombre de checkup Su misión es detectar cualquier cambio en el reloj del sistema para

bloquear inmediatamente la aplicación si nos pasamos de la fecha de caducidad.

Además se crean dos directorios Norton CrashGuard y Norton CrashGuard Deluxe y nos aparece un bonito icono en el

escritorio del Windoze con forma de escudo y con el original nombre de Norton CrashGuard Deluxe. Y si por si fuera poco,

dos iconos en la barra de tareas, la aplicación propiamemte dicha (escudo gris con una N en azul) y una historia de los

cuelges de los programas (un reondel con una marca de verificación).

Si pulsamos en el icono del escritorio nos aparece una ventana donde nos dice que nos compremos INMEDIATAMENTE la

aplicación a un precio fabuloso, $45.95, (unas 7.000 pelas) En la parte inferior aparecen el número de días que restan para el

programa deje de funcionar. Además aparecen unos bonitos botones en los que nos podemos registrar por Internet, probar

el producto o cancelar. Si probamos el producto, aparece la ventana principal con todas pas opciones. Si elegimos la opción

de registro, aparece una pantalla donde introducimos nuestros datos y nuestra tarjeta de crédito.

PRIMERA SORPRESA

El sistema de pago no es de la propia Symantec, sino de la empresa Release Software

Corporation:http://www.releasesoft.com) y su programa SalesAgen. Es la primera vez y veo que Symantec no controle todos

los aspectos de una aplicación.

Page 29: Como crakear por estado+porcino

SEGUNDA SORPRESA

El fichero a estudiar es el Norton CrashGuard\cgmain.exe (229.376 bytes) por una simple razón, tiene el único fichero que

tiene el icono que el del programa principal que aparece en la barra de tareas. Pero, en el mismo directorio aparece un

extraño fichero llamado cgmain.dl_ (743.936 bytes). Mu raro, una librería aparentemente comprimida (y por tanto no

utilizada) con un tamaño más grande que el ejecutable. Por que no está descomprimida la librería, ¿quizás por que no

estamos registrados? :-) Además aparece un ejecutable llamado cgmaipop.exe , cuyo nombre es mu parecido al fichero del

programa que estamos analizando cgmain.exe y tiene un icono que tiene las letras RS, que curioso, justo las Iniciales del la

empresa que dedica a comercializar el producto: Release Software. Si intentamos ejecutar cgmaipop.exe aparece que está

preparando el Software. PREPARANDO?, ¿es que hay que precalentar los programas antes de instalarlos?. Luego aparece

un mensaje de error indicando que no podemos ejecutar la aplicación, ¿quizás por que no estamos registrados? :-)

Por si fuera poco, aparece otro fichero cgmaitky.dll (257.977) con un nombre muy parecido al de la aplicación que queremos

estudiar y aproximadamente con el mismo tamaño. Y el colmo, en el otro directorio, donde reside el menú de la aplicación

Norton CrashGuard Deluxe\CGDeluxe.exe aparecen los ficheros CGDelpop.exe con el logo RS y CGDeltky.dll.

Análogamente para Norton CrashGuard Deluxe\checkup.exe (el programa de testeo de la fecha del sistema)

CheckUp.dl_,Checktky.dll

Todo esto huele a chamusquina, seguro que estos ficheros tienen algo que ver a la hora de registrar el programa, y como

veremos en la segunda pate del artículo, tienen que ver y MUCHO.

LA APROXIMACIÓN DIFÍCIL

AL ATAQUEEEEEEEEEEEEEE

Podríamos analizar esos extraños ficheros que han aparecido, y lo haremos en la segunda parte del artículo. Ahora

atacaremos formalmente a Norton CrashGuard\cgmain.exe para analizar su esquema CINDERELLA de 30 días.

Desensamblamos el programa con el w32dsam y obtenmos 3.5 MB de fichero. En las funciones importadas encontramos

Addr:00045CC8 hint(00F5) Name: GetLocalTime . Bien, bien, asi que, aparentemente, está usando la tipica rutina para

obtener la fecha del sistema. Si vemos quien la utiliza, estaremos en plena rutina de comprobación de fecha:

fechaActual>fecha de caducidad?

Solamente aparece la función getlocaltime que es utilizada una vez en el programa(¿por qué lo ponen tan fácil?) * Referenced by a CALL at Addresses:

|:0040D5B4 , :0040DA44 , :0040DD3F; La rutina es llamada 3 veces

:0041E200 81ECCC000000 sub esp, 000000CC

:0041E206 8D442410 lea eax, dword ptr [esp+10]

:0041E20A 50 push eax

* Reference To: KERNEL32.GetLocalTime, Ord:00F5h

|

:0041E20B FF15BC544400 Call dword ptr [004454BC]

:0041E211 8D4C2400 lea ecx, dword ptr [esp]

:0041E215 51 push ecx

* Reference To: KERNEL32.GetSystemTime, Ord:0135h

|

:0041E216 FF15B8544400 Call dword ptr [004454B8]

.....

Además aparece la llamada tambien a GetSystemTime.

Page 30: Como crakear por estado+porcino

Tras la llamada a GetSystemTime los valores de año, mes, día,.... son extraídos de la pila y guardados en los registros

:0041E21 mov dx, word ptr [esp+0A] De los registros pasan a unas variables globales :0041E2AA mov dword ptr

[0042F7F0], edx

Recordad, cualquier posición de memoria fija como [0042F7F0], es utilizada como variable global por el programa. Despues

se reintroducen en la pila el año, el mes, el día,.... y se llama a la rutina :0041E310 call 00423420.

En esta rutina es donde se realiza la encriptación de la fecha,al finalizar, devuelve en eax la fecha encriptada y además de

guardarse en :0041E323 mov dword ptr [ecx], eax

Es más, las tres llamadas a :0041E200 obtendrán en eax la fecha encriptada de vuelta por call 00423420. Nos os voy a

aburrir con diciendo como es la rutina de encriptación. Simplemente decir que utiliza la siguiente fórmula :

t=seconds+(secondsMinute*minutes)+(secondsHour*hour)+(secondsDay*day)+

(secondsDay*daysMonth[month])+(secondsYear*(year-1900))+(secondsDay*(((year-1900)-1)/4)); fin=(t+fixValue);

Siempre es más fácil comparar un número que comparar años, días, meses,... por eso la fecha se transforma en un número.

He construido un pequeño programa NORTON.EXE en C que realiza todo el proceso de encriptación de la fecha. Este

programa esta incluido con la version en formato *.doc de este texto. Los fuentes de estos programas puedes bajarlos aqui.

Bien, lo lógico, es que una vez encriptada la fecha se compruebe con la fecha de caducidad que debe estar encriptada. Si

analizamos las tres llamadas a :0041E200 tenemos:

* La llamada desde :0040D5B4, se limita a guardar la fecha encriptada :0040D641 mov dword ptr [esi+000002AC], eax

* La llamada desde :0040DA44, :0040DD3F hacen prácticamente lo mismo, mueven la fecha encriptada que estaba en eax a

un registro, hacen una llamada a call 40DC40 y despues comprueban la fecha encriptada con [edi+00000284]

En concreto para la llamada desde :0040DD3F

:0040DD4B mov ebx, eax

:0040DD62 push ebx

:0040DD63 call 0040DC40

:0040DD7B cmp dword ptr [edi+00000284], ebx

:0040DDBF ja 0040DDE4

En concreto para la llamada desde :0040DA44

:0040DA54 mov edi, eax

:0040DA5F push edi

:0040DA60 call 0040DC40

:0040DAB2 cmp dword ptr [ebx+00000284], edi

:0040DAB8 ja 0040DACE

Esto suena a una doble comprobación temporal, serán desconfiados estos chicos.

¿Pero que hace la llamada a call 0040DC40?, para ello cerramos el cgmain.exe: botón derecho sobre el icono de la N y el

escudo y exit. Abrimos el loader del Softice y seleccionamos Norton CrashGuard\cgmain.exe y ponemos un bpx 40DC40 y

Page 31: Como crakear por estado+porcino

lanzamos el programa. Aparecemos en el Softice, pulsamos F10 y vemos que ha sido llamada desde :40DD63. Cerramos el

cgmain.exe otra vez, ponemos el softice un bpx 40DD63 y lanzamos el programa y prestamos atención a ebx que es el que

contiene la fecha encriptada.

La llamada a call 0040DC40 simplemente realiza la siguiente comprobación

:0040DC56 cmp edx, eax; compara fechaAnterior,fechaActual

:0040DC58 ja 0040DC64; Salta si eres un mal chico.

fechaAnterior es la fecha encriptada el la que se arrancó por última vez el programa, fechaActual es la fecha encriptada

obtenida de :0041E200. Es una simple comprobación para ver si hemos echado para atrás el reloj.

La comprobación

cmp dword ptr [ebx+00000284], edi; Análogamente cmp dword ptr [edi+00000284], ebx

ja 0040DACE; Análogamente ja 0040DDE4 Comprueba fechaCaducidad > fechaActual Si es mayor estamos en el período

de prueba.

LA FECHA DE CADUCIDAD

La pregunta es, ¿de donde se guarda la fecha de caducidad encriptada? .Poniendo un bpr ebx+00000284 ebx+00000284+5

descubrimos que la fecha de encriptación se guarda en el registro del sistema y es recuperada por la llamada a la función

:40BD89 RegqueryValueEXA. En concreto, se guarda en HKEY_CLASSES_ROOT\Ultxfile\Format\MSHAEZDOC\write

En mi caso, el valor de write es:

01 02 03 04 05 06 07 08

01 00 00 00 05 B7 FF FF F8

02 00 00 00 00 00 00 10 00

03 08 00 00 00 08 00 00 00

04 00 00 00 06 B3 36 71 A1

05 FB 0F 81 A5 20 80 00 06

06 B7 9F A9 A0 00 00 00 00

07 00 00 00 06 B3 36 71 A0

08 C3 28 00 00 18 00 00 00

09 00 00 00 00 00

La fecha de caducidad está en write(5,7) hasta write(6,5) ambos inclusive. Lo curioso, es que la fecha está codificada, por

ejemplo si la fecha de caducidad es 0034F5F3D6 se guarda en write 0006B79FA9A000. La rutina de encriptación está en

:40C0D6 y se basa en la operación or

:0040C0D6 8A18 mov bl, byte ptr [eax]

:0040C0D8 8A11 mov dl, byte ptr [ecx]

:0040C0DA C0E305 shl bl, 05

:0040C0DD 48 dec eax

:0040C0DE C0EA03 shr dl, 03

:0040C0E1 49 dec ecx

:0040C0E2 0ADA or bl, dl

:0040C0E4 4E dec esi

:0040C0E5 885101 mov byte ptr [ecx+01], dl

:0040C0E8 885901 mov byte ptr [ecx+01], bl

He creado dos programas DECODE que decodifica el valor de write y CODE que codifica un valor de fecha para

introducirlo en write.

Page 32: Como crakear por estado+porcino

CHECKSUMS PARAINOCOS

Los puntos de ataque son claros

1.- Parchear las comprobaciones en el ejecutable.

2.- Introducir una fecha caducidad en el año 30000.

1.- Si parcheamos el programa, se produce un error tan gordo que se casca windows. Esto se puede deber a que hemos

crackeado mal obien exite un checksum. Para salir de dudas, basta con modificar alguna cadena de caracteres del ejecutable

original Por ejemplo "not be run in DOS mode" lo pasamos a "not be RUN in DOS mode", si se casca es que hay un

checksum, como en este caso.

Un checksum es una comprobación para ver si el ejecutable se ha modificado, normalmente se realiza sumando (XOR) los

bytes del ejecutable y guardando este valor algún sitio (ejecutable, registro del sistema). El programa al arrancar suma

(XOR) los bytes del ejecutable actual y comprueba la suma con el valor que tenía guardado. Si hay algún problema es que

un virus o un cracker ha modificado el programa y esto nunca es bueno para el programador.

En el caso del Norton CrashGuard Deluxe 3.0, el checksum se realiza de otra forma. Os acordais del fichero cgmaitky.dll, si

hombre ese que nos parecía tan sospechoso. Pos bien, guarda todos los bytes del cgmain.exe encriptados (de ahí que tuvieran

un tamaño tan parecido ambos ficheros). La rutina de checksum,simplemente consiste en coger de 16 en 16 los bytes del

cgmain.exe encriptarlos y ver si son iguales a 16 bytes del fichero cgmaitky.dll. Si existe alguna diferencia se produce un

error de protección general y se casca todo.

Para complicarlo todo, las rutinas de comprobación (ver si los 16 bytes del ejecutable son iguales a los 16 bytes del

cgmaitky.dll) no están metidas en un bucle, sino que estan a lo extenso. Es decir, hay una rutina de comprobación para los

16 primeros bytes, otra disinta para los 16 siguientes. Si queremos parchear el checksum, habrá que modificar unas 30

comprobaciones. Es curioso, pero existe un flag que desactiva la llamada al checksum :0040862D jne 00408695 si obligamos

a saltar siempre, evitamos el checksum. PERO, ¿POR QUE EXISTE UN FLAG PARA EVITAR EL CHECKSUM?, ¿es

que el programa cgmain.exe va a modificarse? Como veremos más tarde, así ocurrirá.

2.- Con el programa NORTON se crea la fecha de caducidad que queremos, con el programa CODE se encripta y ya sólo

hay que introducir el resultado en HKEY_CLASSES_ROOT\Ultxfile\Format\MSHAEZDOC\write en las posiciones

write(5,7),write(6,5)

CHECKSUMS HASTA EN LA SOPA

Cuando la fecha de caducidad ha vencido, el programa deja de funcionar parcialmente, si analizamos el porqué

descubrimos que el byte [esi+00000568] controla todo el meollo. En concreto,

Si [esi+00000568] = 02 You cannot Run this Application

Si [esi+00000568] = 20 Your computer application source has changed

Si [esi+00000568] = 08 Your free trial period is over

Si [esi+00000568] = 04 OK

Pero, ¿cómo se rellena este byte?. Siguiendo la pista hacia atrás descubrimos que se carga a partir de

HKEY_CLASSES_ROOT\Ultxfile\Format\MSHAEZDOC\open

00 01 02 03 04 05 06 07 1 00 00 00 00 30 00 00 00 2 00 00 00 00 00 00 10 00 3 08 08 00 00 20 00 00 00 4 00 00 00 00 00 00 00 00

Page 33: Como crakear por estado+porcino

En concreto de write(3,4). Hay que tener cuidado por que está encriptado, así que hay que utilizar el programa DECODE.

Osea , si en write(3,4)=20 indica que al desencriptarlo [esi+00000568]=4. Si write(3,4)=40 la fecha de caducidad ha vencido.

Si ha pasado la fecha de caducidad y asignamos write(3,4)=20, el programa replica diciendo que hemos trampeado los

recursos. ¿QUE PASA AQUÍ?.

Mu facil, HAY UN CHECKSUM en la sección HKEY_CLASSES_ROOT\Ultxfile\Format\MSHAEZDOC\open. Estos es

paranoico, un checksum en el propio registro del sistema. En concreto, el checksum está en write(1,4). Se deja como

ejercicio localizar y destruir este checksum.

LA MISMA PROTECCIÓN EN TODOS SITIOS

Aunque parezca increíble, los ficheros CGDeluxe.exe y CheckUp.exe tienen exactamente la misma protección que

cgmain.exe y además en los mismos offset, osea en las mismas direcciones de memoria. Esto es extremadamente extraño, así

que adoptaremos otra vía de ataque.

LA APROXIMACIÓN FÁCIL

Veamos lo que tenemos:

- Unos ficheros extraños asociados a los ficheros importantes. Sabemos la función de uno de ellos los *tky.dll sirven de

checksum, pero y el resto para que sirven?

- Un flag que desactiva el checksum del ejecutable.

- Unos misteriosos fichero ejecutables con el logo RS que dicen que tiene que prepara el Sotware.

Nos centraremos en los ejecutables con los logos RS.

REUNIENDO LAS PIEZAS

Para cada utilidad , p.e. CGDeluxe.EXE existe un fichero, CGDeltky.dll, que realiza funciones de checksum (como ya

vimos), una librería de un gran tamaño , CGDeluxe.dl_ ,y un ejecutable CGDelpop.exe que "prepara el Software".

No hay que ser un lince para darse cuenta que CGDelpop.exe "prepara" de alguna forma CGDeluxe.dl_ para aportar toda

la funcionalidad a CGDeluxe.EXE. Esta "preparación" sólo se realiza cuando estamos registrados.

Por tanto, se parte de un archivo ejecutable de un tamaño inferior a la versión completa del programa. Una vez realizado el

proceso de compra se activa otro ejecutable que convierte la versión de prueba en versión completa .

Todas las demás utilidades que acompañan al Norton CrashGuard Deluxe tienen el mismo proceso (CheckUP.exe -

>Checkpop.exe, Checkup.dl_, Checktky.dll) (Cgmaipop.exe ->cgmain.exe, cgmaitky.dll)

LA COMPRA VIRTUAL

Nos centraremos en el asistente (CGDeluxe.EXE) de compra que vimos en nuestra "Primera Aproximación" : Doble click

en el escudo con la N que hay en el escritorio y al pulsar el botón Buy Now (comprar ahora) aparece el asistente de compra.

Este será nuestro punto de entrada. Si pensamos un poco observaremos que la aplicación que lanza el proceso de compra

debe saber si la compra ha tenido éxito o no. Por tanto, será por aquí por donde centremos nuestros esfuerzos . Además

Page 34: Como crakear por estado+porcino

debe de anunciar de alguna forma al resto de utilidades que la compra ha tenido éxito para que ellas también se "preparen"

Analizaremos el ejecutable CGDeluxe.exe (que el que se lanza al pulsar el icono del escritorio) y observaremos como

"compra".

Nada mejor que usar un desensamblador para investigar el programa CGDeluxe.exe (224 Kb). Una vez aparece el listado

observamos que hace uso de la librería comercial RSAGNT32.DLL (encargada de realizar la compra virtual) y que existen

un referencias a funciones tales como SAInitialize, startSalesAgent. Estas van a ser nuestras funciones de aproximación.

Pulsamos en el botón de Imported Functions (Imp Fn) y hacemos doble click en la línea de rsagnt32.startSalesAgent.

Aparecerá en el listado lo siguiente:

* Reference To: rsagnt32.startSalesAgent, Ord:000Eh

:00407834 E807F30000 Call 00416B40 ß Llamada al asistente

:00407839 83C408 add esp, 00000008

:0040783C 66833D0425430000 cmp word ptr [00432504], 0000

:00407844 742B je 00407871

Echamos un vistazo hacia arriba y hacia abajo del listado y vemos que nos encontramos en un bloque de código que se

encarga de cargar, iniciar, ejecutar, terminar el asistente de compra Buscamos donde puede empezar el bloque. Y un poco

mas arriba encontramos:

///////////// INICIO DE BLOQUE ////////////////

* Referenced by a CALL at Address:

:00406752 ßdesde aquí es llamado el bloque del asistente de compra

:004077B0 A1B07B4300 mov eax, dword ptr [00437BB0]

:004077B5 53 push ebx

: :

: :

* Reference To: rsagnt32.startSalesAgent, Ord:000Eh ß Aquí hemos comenzado la busqueda

:00407834 E807F30000 Call 00416B40 ß Llamada al asistente

:00407839 83C408 add esp, 00000008

:0040783C 66833D0425430000 cmp word ptr [00432504], 0000

:00407844 742B je 00407871

:00407846 BFE0A54300 mov edi, 0043A5E0

: :

: :

:00407878 5F pop edi

:00407879 5E pop esi

:0040787A 5B pop ebx

:0040787B C3 ret

///////////// FIN DE BLOQUE ////////////////

Ahora una vez que conocemos desde donde hemos llamado al bloque, usamos el menu Goto à Goto Code Location y

escribimos el desplazamiento 406752. Aquí observamos lo siguiente:

* Possible Reference to String Resource ID=00001: "Turnkexe"

Page 35: Como crakear por estado+porcino

:00406748 C705C826430001000000 mov dword ptr [004326C8], 00000001

:00406752 E859100000 call 004077B0 ß Entrada en el bloque anterior

:00406757 66392D04254300 cmp word ptr [00432504], bp

:0040675E 0F84F4010000 je 00406958

:00406764 BF34254300 mov edi, 00432534

Ummmm…. Aquí ya tenemos una bonita dirección de memoria (variable global) para usar con Softice.Pero antes añadamos

la librería RSAGNT32.DLL. al la lista de dll que sabe manejar el Softice.

Abrimos el Symbol Loader de Softice y en el menu Edità Softice Initialization SettingsàExports añadimos RSAGNT32.DLL.

Abrimos el Symbol Loader y cargamos (Load) el programa CGDeluxe.exe. Ya en el SoftIce:

Bpx 406752

Bpx startSalesAgent

Pulsamos F5 y cuando aparezca la ventana de "Welcome to Symantec Trialware" pulsamos sobre el botón "Buy Now".

Aparecer en el Softice en el primer breakpoint Bpx 406752

Seguimos ejecutando, paramos en la función startSalesAgent

cs:00407834 E807F30000 Call rsagnt32!startSalesAgent ß Asistente de compra

cs:00407839 83C408 add esp, 00000008

cs:0040783C 66833D0425430000 cmp word ptr [00432504], 0000

cs:00407844 742B je 00407871 ß si salta, has comprado

Nopeamos el asistente de compra. Esto es, sustituimos la llamada por instrucciones inonfesivas. En : 00407834 90 90 90 90

90

Si estudiamos je 00407871 y hacemos que no vaya a la dirección 407871 aparece una ventana contándonos que se ha

grabado un archivo llamado Rslicens.txt pero esto no hace que se active el proceso de compra, este nos es el camino.

Otra comparación interesante se encuentra después de la rutina de entrada al bloque

cs:00406752 E859100000 call 004077B0 ß Bloque anterior cs:00406757 66392D04254300 cmp [00432504], bp ßComparación

Interesante cs:0040675E 0F84F4010000 je 00406958 cs:00406764 BF34254300 mov edi, 00432534

Cuando nos encontremos sobre la dirección cs:0040675E cambiamos el flag de cero que estará activada (Z) y la colocamos a

desactivada (z). Ahora el programa seguirá en cs:00406764. Pulsemos F5 y veamos que ocurre.

Ha aparecido una ventana que nos dice que esperemos mientras nuestro programa esta siendo preparado (Please wait while

your software is being prepared). Al fin, se "PREPARA EL SOFTWARE"

Nota: Si el proceso anterior se repite muchas veces conviene que cerremos todos los programas que tengamos activo e

incluso el mismo Norton Crashguard que tengamos en la barra de tareas.

Una vez completado este proceso habremos comprado virtualmente el Norton crashguard Deluxe.

Observaremos que han desaparecido los ficheros CGDeluxe.dl_ y CGDeltky.dll y han aparecido dos archivos de licencia

Page 36: Como crakear por estado+porcino

RSLICENS.txt y LICENSE.xxxxxx (números de licencia) Este proceso realizado en tiempo real con el Softice no trae ningún

problema… pero a la hora de hacer los parches no encontraremos problemas con los checksum .Pero..TRANQUILOS QUE

TODO TIENE SOLUCION.

MODIFICANDO EL REGISTRO

Usaremos una herramienta muy útil para los crackers el programa Regmonitor (si no lo tienes consíguelo) .Observamos

unas variables que lee el programa (no registrado) al principio y tenemos:

HKCR\ultxfile\Format\MSHAEZDC\write /* Esta nos suena */

HKCR\ultxfile\Format\MSHAEZDC\xlate

HKCR\ultxfile\Format\MSHAEZDC\open /* Esta nos suena*/

Bien, basta comparar los valores antes y después de "preparar" el software, para darse cuenta que la única modificación la

realiza en open. Cuando está registrado su valor es:

HKEY_CLASSES_ROOT \ultxfile\Format\MSHAEZDC\open

00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 10 00

08 08 00 00 10 00 00 00 - 00 00 00 00 00 00 00 00

Esta es la forma en que se comunica al resto de utilidades que la compra ya ha tenido éxito.

Y YA ESTÁ, basta con introducir este valor en el registro para que quede registrado el Norton CrashGuard Deluxe 3.0

MSHAEZDC corresponde al programa en cuestión a comprar. Usando el regmonitor vemos que clave busca el programa a

desproteger y anotamos el código (MSHAEZDC).

Esta táctica se ha probado con éxito con las siguientes aplicaciones protegidas por la compañía Release Software

Corporation : Norton utilities, Norton Uninstaller, Norton Antivirus, Xing MPEG Encoder,

Creando un archivo de registro ya tenemos hecho un crack no destructivo ya que no modifica ningún ejecutable.

----------------------------------- Cortar por aquí ---------------------------------------------------

REGEDIT4

; (c) ESTADO+PORCINO 1998

; Modificación de registro para Norton Crash Guard Deluxe

; Mr.Red & otras hierbas

;

[HKEY_CLASSES_ROOT\ultxfile\Format\MSHAEZDC]

"open"=hex:00,00,00,00,00,00,00,00,00,00,00,00,00,00,10,00,08,08,00,00,10,00,00,00,00,00,00,00,00,00,00,00

----------------------------------- Cortar por aquí ---------------------------------------------------

Para los demás programas que usan esta protección tenemos:

Xing MPEG Encoder códigoà MSHVEMAV

Norton Utilities códigoà MSHVEM0E

Norton Unisntaller códigoà MSHW2EHL

Bueno ha sido largo pero ha merecido la pena.

MORALEJA: Si quieres poner una puerta, procura que no sea de papel.

Page 37: Como crakear por estado+porcino

Es el colmo de la incompetencia. Confías la venta de tu producto a un empresa que proporciona una protección ridícula que

no vende tu producto si no que prácticamente lo regala. Por que no invertir la millonada que Symantec habrá pagado a

Release Software Corporation encontrar a unos buenos programadores en ensamblador que hicieran una protección

decente.Además, esta compañía protege y vende productos de más empresas a parte de Symantec.

Basta pasarse por su web http://www.releasesoft.com y comprobar lo orgullosos que están de sus clientes.

Realmente, no creo que esta compañía dure mucho.

La importancia de este artículo radica en que se ha conseguido solventar con éxito la protección de una casa de Software

dedicada a proteger y vender. Quedan a nuestros pies cientos de programas , con una protección de papel, gracias a la

incompetencia de una avariciosa compañía. Mejor sería que diera los programas gratis, y de dejara de hacer el ridículo.

Mr_PinK & WKT ( WHISKEY KON TEKILA )

Esperamos vuestras opiniones, sugerencias y ensayos en [email protected]

En breve analizaremos tipos de protecciones mucho más interesantes.

Recordad bebed de la fuente, buscad a +ORC en la red.

Page 38: Como crakear por estado+porcino

COMO CRAKEAR POR ESTADO+PORCINO

CAPÍTULO IV. Haciendo de Cerrajeros

-Generadores de Llaves (KeyGen)-

Revival 2.1

Mayo 1998

Indice

INTRODUCCIÓN

Generadores de Llaves

¿Es posible crear un Generador de Llaves?

¿Pos mu bien, pero que necesito pa hacer un Generador de Llaves?

¿Merece la pena hacer un Generador?

Generador de Llaves para REVIVAL 2.1:

Notas para los lectores

INTRODUCCIÓN

¡Saludos Familia!

Aprovechando las vacas estivales me he decidido por escribir un bonito

Generador de Llaves (en inglés KeyGen) para un útil programa de reparación de

discos duros y disquetes. Como siempre un poco de Teoría para que podamos

entendernos.

Generadores de Llaves.

La primera pregunta que responder es ¿qué carajo es un Generador de Llaves?

Suponed por un instante que sois unos de esos programadores perezosos y

cegados por el dinero que ha construido un programa protegido con un número

de serie. Si alguien desea registrarse debemos pagar una cifra de dinero (pequeña

o no) que hará engrosar nuestra cuenta. A cambio debemos de enviarle un

número de serie que desbloquee el programa. ¿Hasta ahora todo correcto,

Page 39: Como crakear por estado+porcino

verdad?. ¿Pero como demonios se genera un número de serie diferente para cada

usuario? . La respuesta es: con un Generador de Llaves.

Existen dos tipos de Generadores de Llaves:

A- Dependientes de los datos del cliente.

B- Independientes de los datos del cliente.

El tipo A es el más extendido, el número de serie se genera a partir del nombre del

cliente y el de su dirección de correo (por ejemplo). Así dos usuarios tendrán

números de serie diferentes, por que en principio sus datos personales son

diferentes.

El tipo B está un poco en desuso, pero se siguen viendo por que son fáciles de

programar (recordad que los programadores son por naturaleza vagos y sin

imaginación).

El mismo número de serie es válido para cualquier cliente. En estos casos, el

programador da un número diferente a los clientes pardillos que compran su

producto y reza para que no se lo den a nadie.

¿Es posible crear un Generador de Llaves?

El programa Generador de Llaves está normalmente en el ordenata del

programador, entonces, ¿cómo demonios puede un cracker construir un

Generador ?. La respuesta es sencilla pero difícil (en general) de realizar.

El programa debe verificar que el número de serie que introducimos es válido y

ésto sólo puede hacerlo verificando ciertas propiedades que debe cumplir el

número de serie y que fueron establecidas por el Generador.

¿Un poco lioso verdad?, dicho de otra forma, el Generador es un codificador de

números de serie y en el programa sólo existe un decodificador que descifra el

número de serie introducido.

Vemos un sencillo ejemplo, suponed que nuestro Generador es el siguiente:

NúmeroSerie=(89934*4)*(nombre(5))

Donde nombre(5) es la quinta letra del nombre del usuario. EL número 89934 es el

llamado número mágico, un número que es de agrado del programador (quizás el

número de veces que le ha su jefe le ha jodido) y que realmente es el corazón del

Generador

En el programa, para ver que el número de serie es correcto se debe de verificar:

(NúmeroSerie/(4 /nombre(5)) = 89934

Como podéis apreciar, lo que hay en el programa es la inversa del Generador, por

tanto si invertimos la inversa podemos obtener el Generador de Partida.

Page 40: Como crakear por estado+porcino

No os engañéis, este es un Generador sencillo, lo normal es que esté ultra enrevesao

, lleno de números mágicos y operaciones aritméticas exóticas.

Normalmente, las rutinas de verificación realizan ciertas comprobaciones sobre la

password de entrada. Generalmente pasan a mayúsculas y buscan ciertos

caracteres en ciertas posiciones. En caso de no encontrarlos la password no es

válida. Esto da pie a un truco mu útil pa localizar di una forma directa la rutina.

Pero esto lo veremos más adelante.

¿Pos mu bien, pero que necesito pa hacer un Generador de Llaves?

1.- Lo primero es aislar el código del programa que verifica el número de serie.

Además del código que las funciones que son llamadas desde la rutina de

verificación (pa Saber que narices hacen). Normalmente las rutinas de verificación

hacen uso de pequeñas rutinas: convertir a mayúsculas,convertir letras en

números...

2.- Un conocimiento exhaustivo, repito, exhaustivo del la rutina de verificación.

Debemos saber TODO lo que hace y porqué lo hace. Recordad que tenemos que

invertir su funcionamineto y esto no lo podemos hacer si no sabemos como

funciona. Este es el punto más delicado y el que consume más tiempo. Dependiendo

de las paranoias del programador podéis tardar horas o semanas. Se necesitan

conocimientos de ensamblador y de operaciones aritméticas binarias

3.- Invertir el funcionamineto del Generador y crear con un compilador, por

ejemplo de C nuestro propio Generador.

¿Merece la pena hacer un Generador?

La respuesta es depende. Hacer un Generador no es nada sencillo, consume mucho

tiempo y habilidades. Es mucho más fácil parchear la rutina de verificación para

que acepte cualquier cosa.

Pero las ventajas de crear un Generador son muy importantes, primera y ante

todo es que realmente se está cumpliendo con la filosofía crack (ingeniería inversa)

al comprender y transformar el programa para que adapte a nuestras necesidades.

Segúnda ventaja son los conocimientos que se captan sobre todo a nivel

ensamblador y de operaciones aritméricas con bits.

Tercera y no más importante la satisfacción del trabajo artesano, bien hecho. Esa

satisfacción que nos hace seguir adelante.

La cuarta ventaja tiene que ver con la historia del Software. Puedes "coleccionar"

las protecciones de tu programa favorito y ver la evolución de su software.

Y como quinta un fin práctico, al final del proceso se obtiene un número de serie

válido, lo que te convierte en un usuario "legal" y problamente no tengas que

crakear la próxima versión.

Page 41: Como crakear por estado+porcino

Generador de Llaves para REVIVAL 2.1

Objetivo: REVIVAL 2.1

Nombre: revive21.zip

Tamaño: 874.644 bytes

Versión: 2.1

Site: http://uc2.unicall.be/revival/

Herramientas: SoftIce,W32dasm o IDA 3.75 y un compilador de C.

Dificultad: No mu difícil.

Tiempo: 5 horas.

Este es un interesante programa que te permite recuperar ficheros borrados de discos

duros y disquetes que soporta FAT32 y NTFS. Tiene una típica ventana de registro a

partir de la cual podemos acceder directamente a la rutina de verificación de la pass.

Esta rutina es extremadamente sencilla e independiente de los datos del usuario, por eso

ha sido la elegida como demostración.

Aconsejo desensamblar con el IDA PRO 3.75(una pequeña maravilla de

desensamblador). Se puede hacer con el W32dasm pero el IDA nos da más información

y nos ahorra trabajo. Por ejemplo descubre de forma automática rutinas (_touper,

isdigit...) que no son reconocidas como tales por el W32dasm.

Bien, manos a la obra, desensamblemos con el IDA.

¿Ya está?

Bien, ahora sólo hay que localizar la rutina de verificación. Empleemos un viejo truco:

el 80% de las rutinas de verificación intentan localizar el carácter '-' (2D en hexa) o el

carácter '+' (2B en hexa).

No me preguntéis por qué, pero lo hacen. Sólo hace falta buscar un 2Dh o un 2Bh y con

un poco de suerte aterrizaremos en plena rutina de verificación. Debemos buscar una

comprobación con 2Dh o bien 2Bh, pero como las comprobaciones pueden ser de

muchos tipos , sólo buscaremos la parte final de la comprobación.

Resumiendo, buscaremos ", 2Dh" y ", 2Bh". En caso de existir demasiadas ocurrencias,

mejor decantarse por otro método de ataque. Al final es el olfato de cracker el que te

indica si estás en la ocurrencia correcta o no.

En este caso hay 20 ocurrencias de "2D" y 18 de "2B". UFF, quizás demasiadas (de

hecho es la primera ocurrencia de "2D" la correcta), así que probemos un método más

directo con el Softice.

Metemos como nombre ESTADO, como campañía PORCINO y como número de serie

estúpido por ejemplo 1212121212. CTRL+D y le damos al botón de OK y aparece una

ventana de error.

Esta ventana se parece a un messageboxexa (por su simplicidad y por el icono en forma

de exclamación y por el único botón que aparece). Si repetimos el mismo proceso pero

poniendo en el softice bpx messsageboxexa y pulsamos el botón de OK ...

Bingo, aparecemos en la rutina de messageboxexa. Sólo hay que seguir la secuencia de

Page 42: Como crakear por estado+porcino

llamadas hacia atrás buscando un salto que evite llamar a la ventana de mensaje de

error. La secuencia de pasos es:

* Paramos en bpx messageboxexa

* Pulsamos F12 para llegar a la rutina padre que llamó a messageboxexa.

* Aparecemos en :4313CA pero por se ve ningún salto que evite la llamada a

messageboxexa.

* Pulsamos F12 para seguir subiendo hasta la rutina padre.

* Aparecemos en :43145D. Pero de nuevo nada interesante.

* De nuevo F12 y ....

* Aparecemos en :40CAAC8, esta si tiene lo que buscamos, exactamente.

0040AA6C call sub_40CD10 ; RUTINA DE VERIFICACIÓN

0040AA71 add esp, 4

0040AA74 test eax, eax

0040AA76 jz short loc_40AABA; SALTA SI ERES UN MAL

CRACKER.

0040AA78 mov dword ptr [esi+5Ch], 1

0040AA7F mov eax, [esi+64h]

0040AA82 push eax

0040AA83 push offset aName;NOMBRE.

0040AA88 call sub_40AD70

0040AA8D add esp, 8

0040AA90 mov eax, [esi+60h]

0040AA93 push eax

0040AA94 push offset aCompany;COMPAÑÍA.

0040AA99 call sub_40AD70

0040AA9E add esp, 8

0040AAA1 mov eax, [edi]

0040AAA3 push eax

0040AAA4 push offset aSerial;NÚMERO DE SERIE.

0040AAA9 call sub_40AD70

0040AAAE add esp, 8

0040AAB1 mov ecx, esi

0040AAB3 call sub_42550E

0040AAB8 jmp short loc_40AACF

0040AABA ;

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

0040AABA

0040AABA loc_40AABA: ; CODE XREF: sub_40AA20+56_j

0040AABA push 0FFFFFFFFh

0040AABC push 30h

0040AABE push 0EF1Fh ; DIRECCION DEL MENSAJE DE

ERROR

0040AAC3 call sub_431413 ; VENTANA DE MESAJE DE ERROR

0040AAC8 mov ecx, esi

0040AACA call sub_425527

0040AACF

0040AACF loc_40AACF: ; CODE XREF: sub_40AA20+98_j

0040AACF push 0FFFFFFFFh

0040AAD1 mov ecx, edi

0040AAD3 call sub_429A33

0040AAD8 pop edi

0040AAD9 pop esi

0040AADA retn

0040AADB ;

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Page 43: Como crakear por estado+porcino

0040AADB

0040AADB loc_40AADB: ; CODE XREF: sub_40AA20+25_j

0040AADB ; sub_40AA20+40_j

0040AADB push 0FFFFFFFFh

0040AADD push 30h

0040AADF push 0EF1Eh

0040AAE4 call sub_431413

0040AAE9 pop edi

0040AAEA pop esi

0040AAEB retn

0040AAEB sub_40AA20 endp

Fijaos en el salto en :40AA76. Si saltamos caemos en la ventana de mensaje y evitamos

acceder a NOMBRE,COMPAÑÍA y NÚMERO DE SERIE. El salto está controlado por

:40AA6C call sub_40CD10 .Que interesante, una rutina que controla la ventana de

mensaje de error, ¿a qué nos suena ésto?. BINGO, estamos ante la rutina de

verificación.

Échemósle un vistazo y comentémosla.

;Desensamblado con el IDA ;p(0) indica el carácter 0 de la password. Recordad,

empiezo a contar los caracteres desde 0.

0040CD10 sub_40CD10 proc near ; CODE XREF: sub_404600+98_p

0040CD10 ; sub_40AA20+4C_p

0040CD10

0040CD10 var_24 = byte ptr -24h ; 1 variable local.

0040CD10 var_20 = word ptr -20h ; 2 variable local.

0040CD10 var_1E = byte ptr -1Eh ; 3 variable local.

0040CD10 var_1B = byte ptr -1Bh ; 4 variable local.

0040CD10 arg_0 = dword ptr 4 ; Argumento de la función que no es

más que la dirección de nuestra password.

0040CD10

0040CD10 sub esp, 24h; Ajusta la pila para reservar

espacio para las varibles locales.

0040CD13 push ebx; Guarda algunos registros.

0040CD14 push esi

0040CD15 mov esi, [esp+2Ch+arg_0] ; esi= dirección de

nuestra password.

0040CD19 push edi

0040CD1A movsx eax, byte ptr [esi] ; eax=p(0)

0040CD1D push eax

0040CD1E call _toupper ; Pasamos a

mayúsculas p(0).

0040CD23 add esp, 4

0040CD26 cmp eax, 52h ; ¿ES P(0) = R?

0040CD29 jnz loc_40CE7F ; Salta a flag de

error si p(0) no es R.

0040CD2F movsx eax, byte ptr [esi+1] ; eax=p(1)

0040CD33 push eax

0040CD34 call _toupper ; Pasamos a

mayúsculas p(1).

0040CD39 add esp, 4

0040CD3C cmp eax, 56h ; ¿ES P(1) = V?

0040CD3F jnz loc_40CE7F ; Salta a flag de

error si p(1) no es V.

0040CD45 cmp byte ptr [esi+7], 2Dh ; ¿ES P(7) = '-'?

0040CD49 jnz loc_40CE7F ; Salta a flag de

Page 44: Como crakear por estado+porcino

error si p(7) no es '-'.

0040CD4F push esi

0040CD50 call ds:lstrlenA ; Calcula el tamaño

de la password.

0040CD56 cmp eax, 0Fh ; ¿Es el tamaño 15?

0040CD59 jnz loc_40CE7F ; Salta a flag de

error si el tamaño no es 15

0040CD5F mov edi, 2 ; Segundo carácter.

0040CD64

0040CD64 loc_40CD64: ; CODE XREF: sub_40CD10+6D_j

;Bucle para comprobar que son números p(2)...p(6)

0040CD64 movsx eax, byte ptr [edi+esi]; eax=p(2)

0040CD68 push eax

0040CD69 call _isdigit ; ¿es un número

p(2)?

0040CD6E add esp, 4

0040CD71 test eax, eax

0040CD73 jz loc_40CE64 ; Salta con flag de

error si p(2) no es número.

0040CD79 inc edi ; Apuntamos al

siguiente carácter.

0040CD7A cmp edi, 7 ; ¿Hemos llegado a

p(7)?

0040CD7D jl short loc_40CD64 ; Salta si no hemos

llegado a p(7).

0040CD7F mov edi, 8 ; Octavo carácter.

;Bucle para comprobar que son números p(8)...p(14)

0040CD84

0040CD84 loc_40CD84: ; CODE XREF: sub_40CD10+8D_j

0040CD84 movsx eax, byte ptr [edi+esi];; eax=p(8)

0040CD88 push eax

0040CD89 call _isdigit ;¿es un número p(8)?

0040CD8E add esp, 4

0040CD91 test eax, eax

0040CD93 jz loc_40CE6D ; Salta con flag de error

si p(8) no es número.

0040CD99 inc edi ; Apuntamos al siguiente

carácter.

0040CD9A cmp edi, 0Fh ; ¿Hemos llegado a p(15)?

0040CD9D jl short loc_40CD84; Salta si no hemos llegado

a p(15).

0040CD9F mov ax, [esi+2] ; ax=p(2)p(3)

0040CDA3 mov [esp+30h+var_20], ax

0040CDA8 lea eax, [esp+30h+var_20]

0040CDAC mov [esp+30h+var_1E], 0

0040CDB1 push eax

0040CDB2 call _atoi ;Pasa p(2)p(3) a número.

0040CDB7 mov cx, [esi+5] ;cx=p(5)p(6)

0040CDBB add esp, 4

0040CDBE mov [esp+30h+var_20], cx

0040CDC3 sub al, 13h ; al=p(2)p(3)-19

0040CDC5 lea ecx, [esp+30h+var_20]

0040CDC9 mov [esp+30h+var_24], al

0040CDCD mov [esp+30h+var_1E], 0

0040CDD2 push ecx

0040CDD3 call _atoi ;Pasa p(5)p(6) a número.

0040CDD8 lea edx, [esp+34h+var_20];

0040CDDC add esp, 4

Page 45: Como crakear por estado+porcino

0040CDDF lea ebx, [eax-25h] ;ebx=p(5)p(6)-37

0040CDE2 lea ecx, [esi+0Ah] ;ecx=dirección de p(10)

0040CDE5 push edx

0040CDE6 mov eax, [ecx] ;ebx=p(10)p(11)p(12)p(13)

0040CDE8 mov [edx], eax

0040CDEA mov cl, [ecx+4] ;cl=p(14)

0040CDED mov [edx+4], cl

0040CDF0 mov [esp+34h+var_1B], 0

0040CDF5 call _atoi ;Pasa

p(10)p(11)p(12)p(13)p(14) a número.

0040CDFA add esp, 4

0040CDFD mov edi, eax

0040CDFF xor di, 5468h

;di=p(10)p(11)p(12)p(13)p(14) XOR 21508

0040CE04 mov ax, [esi+8] ;ax=p(8)p(9)

0040CE08 mov [esp+30h+var_20], ax

0040CE0D lea eax, [esp+30h+var_20]

0040CE11 mov [esp+30h+var_1E], 0

0040CE16 movzx edi, di

0040CE19 push eax

0040CE1A call _atoi ;Pasa p(8)p(9) a número.

0040CE1F mov byte ptr [esp+34h+var_20], al

0040CE23 add esp, 4

0040CE26 xor eax, eax

0040CE28 mov ecx, 64h

0040CE2D mov al, bl ;al=p(5)p(6)-37

0040CE2F mov ebx, 0Ah

0040CE34 lea eax, [eax+edi+3]; eax'=(p(5)p(6)-

37)+(p(10)p(11)p(12)p(13)p(14) XOR 21508) + 3

0040CE38 cdq

0040CE39 idiv ecx ;Divide eax'/100

0040CE3B mov cl, dl ;cl=resto(eax'/100)

0040CE3D xor eax, eax

0040CE3F mov al, [esp+30h+var_24]

0040CE43 lea eax, [eax+edi+3]; eax=(p(2)p(3)-

19)+(p(10)p(11)p(12)p(13)p(14) XOR 21508) + 3

0040CE47 cdq

0040CE48 idiv ebx ;Divide eax/10

0040CE4A sub dl, [esi+4] ;dl=resto(eax/10)-p(4)

0040CE4D cmp dl, 0D0h ;¿Es resto(eax/10) = p(4)?

0040CE50 jnz short loc_40CE76;Salta a flag de error si

resto(eax/10) no es p(4)

0040CE52 cmp byte ptr [esp+30h+var_20], cl;¿Es

resto(eax'/100) = p(8)p(9)?

0040CE56 jnz short loc_40CE76;Salta a flag de error si

resto(eax'/100) no es p(4)

0040CE58 mov eax, 1 ; Ok todo correcto. Flag de

éxito activado.

0040CE5D pop edi

0040CE5E pop esi

0040CE5F pop ebx

0040CE60 add esp, 24h

0040CE63 retn

0040CE64 ;

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

0040CE64

0040CE64 loc_40CE64: ; CODE XREF: sub_40CD10+63_j

0040CE64 xor eax, eax ; Eres un mal chico.Flag de

error activado.

0040CE66 pop edi

Page 46: Como crakear por estado+porcino

0040CE67 pop esi

0040CE68 pop ebx

0040CE69 add esp, 24h

0040CE6C retn

0040CE6D ;

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

0040CE6D

0040CE6D loc_40CE6D: ; CODE XREF: sub_40CD10+83_j

0040CE6D xor eax, eax ; Eres un mal chico.Flag de

error activado.

0040CE6F pop edi

0040CE70 pop esi

0040CE71 pop ebx

0040CE72 add esp, 24h

0040CE75 retn

0040CE76 ;

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Antes de seguir adelante, centremonos en un par de puntos:

- ¿Habéis descubierto los números mágicos?, sip los hay son 5468h, 0Ah y 64h.

- Como es tradición la rutina checkea en este caso la presencia del carácter '-'.

Luego con un poco de paciencia, nuestra búsqueda inicial hubiera tenido sus frutos.

- Habéis notado la pésima calidad del código. Uso innecesario de variables,

instrucciones inútiles, tamaño del código exagerado. Todo esto es debido a que se

programó en alto nivel, seguramente en C.

¿Cómo quieren los programadores proteger su software si es de pésima calidad?. Están

directamente vendidos (salvo honrosas excepciones, por supuesto.)

- Si andais un poco pegaos de operacones aritméticas y de ensamblador, buscad alguno

de los fabulosos cursos de ensamblador que hay en la Web. Resumamos los momentos más interesantes de la rutina de verificación:

A)0040CD26 cmp eax, 52h ; ¿ES P(0) = R?

B)0040CD3C cmp eax, 56h ; ¿ES P(1) = V?

C)0040CD45 cmp byte ptr [esi+7], 2Dh ; ¿ES P(7) = '-'?

D)0040CD56 cmp eax, 0Fh ; ¿Es el tamaño 15?

E)0040CD64 ;Bucle para comprobar que son números p(2)...p(6)

F)0040CD84 ;Bucle para comprobar que son números p(8)...p(14)

G)0040CDC3 sub al, 13h ; al=p(2)p(3)-19

H)0040CDDF lea ebx, [eax-25h] ; ebx=p(5)p(6)-37

I)0040CE34 lea eax, [eax+edi+3] ; eax'=(p(5)p(6)-

37)+(p(10)p(11)p(12)p(13)p(14)

XOR 21508) + 3

J)0040CE3B mov cl, dl ; cl=resto(eax'/100)

K)0040CE43 lea eax, [eax+edi+3] ; eax=(p(2)p(3)-

19)+(p(10)p(11)p(12)p(13)p(14)

XOR 21508) + 3

L)0040CE4D cmp dl, 0D0h ;¿Es resto(eax/10) =

p(4)?

M)0040CE52 cmp byte ptr [esp+30h+var_20], cl;¿Es

resto(eax'/100) = p(8)p(9)?.

Por A),B),C),D),E) y F) sabemos que la password debe de tener este aspecto:

00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15

R V x x x x x - x x x x x x x x

Page 47: Como crakear por estado+porcino

Donde x es un número del 0 al 9.

Despues hay dos bonitas ecuaciones:

Por H),I),J) y M)

I) p(8)p(9)=resto( (p(5)p(6)-0x25)+(p(10)p(11)p(12)p(13)p(14) XOR

21508) + 3) / 0x64)

Por G),K),L)

II) p(4)=resto((p(2)p(3)-0x13)+(p(10)p(11)p(12)p(13)p(14) XOR

21508) + 3) / 0x0A)

Pos ya está. Estas son las ecuaciones de la rutina de verificación, ya se puede

implementar nuestro propio Generador de Llaves, que no será más que implementar

estas dos ecuaciones.

Estas dos ecuaciones comprueban que la parte derecha sea igual a la parte izquierda

(p(8)p(9) y p(4)). Nuestro Generador calculara la parte derecha y construirá la parte

izquierda de forma adecuada. Se podrían simplificar un poco, pero no lo haré pa no

complicar el asunto.

Un posible Generador en C sería algo así como:

VER CODIGO FUENTE DEL GENERADOR

Utilizo números aleatorios (random) para generar un número de serie diferente cada vez que

se ejecute e programa. Una última curiosidad, donde creereis que guarda nuestra pass el

programa. Si lanzais el La utilidad regmon (analiza todos los accesos al Registro dels

Sistema) con el programa, podréis apreciar que se accede a

"HKEY_LOCAL_MACHINE\SOFTWARE\Revival\Revival\2.0\Serial" Poco imaginativo,

¿verdad?. Podéis modificar este número para evitar registraos y probad Con nuevas pass.

Notas para los lectores.

1.- Los mensajes del tipo "Hazme el crack para ....", "Dime como de crackea....",

"Dime donde puedo encontrar..." son automáticamente ignorados. El objetivo de estos

artículos es enseñar a crackear no enseñar a ser unos llorones ineptos que sólo saben

mendigar.

2.- Sólo responderé a preguntas teóricas sobre cracks, indicando algunas pistas que

faciliten la labor.

3.- Narices, escribid artículos sobre los programas que crackeeis.

De nada sirve lo que aprendéis si no lo repartís, se os pudre en el cabeza, palabra.

4.- Lamento no haber contestado a ciertos mails interesantes. Desde aquí mis excusas.

5.- Si os ha servido para algo mis artículos, no seáis vagos y mandad un mail

Page 48: Como crakear por estado+porcino

indicándomelo.

Mr_PinK & WKT ( WHISKEY KON TEKILA )

Esperamos vuestras opiniones, sugerencias y ensayos en [email protected]

En breve analizaremos tipos de protecciones mucho más interesantes.

Recordad bebed de la fuente, buscad a +ORC en la red.

Page 49: Como crakear por estado+porcino

COMO CRAKEAR POR ESTADO+PORCINO

CAPÍTULO V. COLOR CRACK

-Como Crackear Multimedia Builder 3.0-

Noviembre 1998

Indice

INTRODUCCIÓN

UN PRIMER VISTAZO

PRIMER OSTIAZO

ZEN CRACK

CRACK EN COLORES

CONCLUSIÓN

INTRODUCCIÓN

Victima: Multimedia Builder 3.0

Site: www.mediachance.com

Herramienta: Nuestro amado Sice y Zen crack.

Hoy es un día de Heineiken,Café de de Kenya,Moskovkaya,Guiness,Mahon y

mujeres.

Bueno, ya estamos de vuelta con un nuevo truco bajo el brazo: "Crack en Color"

que lo aplicaremos a nuestro conejillo de indias, el excelente Multimedia Builder.

Un programa para crear aplicacniones que incluyen sonido, imagen,video. Se

programa al estilovisual de VB . No os perdais el reproductor de CD que viene

con el ejemplo.

UN PRIMER VISTAZO

Realmente este programador se lo ha currado. Ha cerrado la mayoría de las

puertas de entrada a los crackers, por tanto hay que abrir otras como el "Crack

Page 50: Como crakear por estado+porcino

en Color". Veamos alguno de sus ingenios del autor:

- Existe un número de serie que se introduce desde "Help\About\Register"

- Cuando introducimos un número de serie falso no aparece ninguna ventana de

error.

Por lo que queda descartado el clásico "bpx messageboxexa".

- Las cadenas de caracteres importantes las tiene encriptadas, por lo que no

podemos buscarlas con el "Search and Replace", lo que impide un crack en 5

minutos.

PRIMER OSTIAZO

Desechados los ataques típicos, vamos a entrar por la puerta clásica siguiendo la

pista del Serial falso.

Metemos un número basura "12121212", Saltamos al sice y ponemos 's 30:00 l

ffffffff "12121212"'

En cada ocurrecia XX:xx aplicamos 'bpr XX:xx XX:xx+8 rw'. Una vez acabado

damos al botón de OK y BOOM, aparecemos en el sice. Unos F12 llegamos a la

rutina "GetwindowTextA".

Dejamos esta línea de trabajo porque es muy aburrida.

Al final conseguimos aislar una rutina en que devuelve 0 si estamos registrados y 1

en otro caso.Podemos falsearla para registrarnos. Y de hecho lo "conseguimos".

Nuestro nombre aparece en la ventana de registro. Pero hay una sorpresita. Si

ejecutamos Project/Run aparece "unregistered...". ¿Cómo es posible?

¡Pero SI estamos registrados!. La cosa es aún peor, si nos peleamos con el registro

y generamos un número de serie válido las cosas no mejorar. ¿Que está pasando

aquí?

ZEN CRACK

Si hemos pasado el algoritmo de registro satisfactoriamente, ¿porqué seguimos sin

estar registrados?.

Razonemos, la única forma de no estar registrados es que no pasemos alguna

verificación. Sabemos que hemos pasado una, luego debe de haber otra verifiación

en otra parte del código.

Este programador ha pensado un poco. HA SEPARADO LAS

COMPROBACIONES del serial.

Y lo que es todavía más interesante, en cada comprobación analiza cosas

diferentes. Así, si se pasa completamente una comprobación no se garantiza que se

pase el resto.

Sabemos ya que por lo menos hay dos comprobaciones (una que pasamos y otra

Page 51: Como crakear por estado+porcino

no).

Debe existir un nexo de unión entre las comprobaciones: Una variable que guarde

el serial que hemos introducido. Pero aquín las variantes son múltiples :la primera

comprobación puede encriptar el serial para la segunda, modificar un flag para

que siempre resulte falsa la segunda comprobación...

La pregunta que se plantea es ¿Cómo localizo la segunda comprobación?.

La única pista es el horrible letrero amarillo ".. unregistered ..". Se podrían

analizar todas las variables que modifica el primer algoritmo , pero eso es

demasiado costoso. Debemos buscar otra forma.

La única forma de saber que no hemos pasado las comprobaciones es el letrero

amarillo. Es por ahí por donde debemos atacar.

El mensaje está encriptado ,luego desechamos esa vía.

El letrero parece un Label al estilo de de JAVA o Delphi, por lo que no tiene

entidad propia como una ventana.

¿Por donde atacamos?

CRACK EN COLORES

Centremonos, ¿qué es lo que má llama la atención del letrero? , su color amarillo.

Este color debe de asignarse de alguna forma. Además el amarillo parece que es el

color de fondo del letreo. Si desensamblamos a nuestro objetivo vemos que utiliza

la función setbkcolor.

Así pues debemos localizar algo parecido a "setbkcolor(Amarillo)".Pero como se

expresa exactamente el color amarillo.

Normalmente los colores se forman a partir de la combinación de los llamados

"colores básicos" .

Lo normal es usar como colores básicos RGB="Rojo Verde y Azul." Nuestro

problema es como expresar el amarillo del letrero en función de RGB. Por suerte

nuestro amarillo es una simple combinación. Podemos utilizar la paleta de colores

de cualquier programa para comprobarlo. En mi caso he usado el Visual Café 2.5

(crackeado por supuesto).

Introduciendo Rojo=255,Verde=255,Azul=0 obtenemos el mismo amarillo que el

del letrero.

Si el color hubiera sido más complejo,capturamos la pantalla con el letrero y la

importamos a un editor gráfico como el Photoshop.Seleccionamos un pixel del

color amarillo del letreo y vemos sus componentes en términos de Rojo, Verde y

Azul.

Es posible que exita un program que realize esta función más sencilla. Si lo

encontris, por favor notificádmelo.

Asi pues debemos de localizar algo asi como "setbkcolor(255 255 0)". Necesitamos

conocer si existen más parámetros para el setbkcolor. Mirando el API tenemos:

COLORREF SetBkColor(HDC hdc, // handle of device context

COLORREF crColor // background color value

);

The COLORREF value is a 32-bit value used to specify an RGB color.

Page 52: Como crakear por estado+porcino

When specifying an explicit RGB color, the COLORREF value has the

following hexadecimal form:

0x00bbggrr

Nuestro color es un entero y se pasa como segundo parámetro. Dado que los

número se almacenan al revés debemos buscar SetBkColor(hdc,0000ffff).

Desempolvemos los manuales del Sice, por lo que nos queda

bpx setbkcolor if (*(esp+8)==ffff0000)

Expliquemos un poco el churro que ha aparecido. bpx setbkcolor indica que se

pare cuando se ejecute la rutina setbkcolor Se para cuando (*(esp+8)==00ffff), es

decir, cuando el contenido del registro EIP+8 sea 00ffff. Recordemos que los

parámteros a las funciones se pasan a través de la pila (ESP=registro stack

pointer):

Concretamente es ESP+8 porque en se apilan dos palabra de 4 bytes cada uno. Antes de la llamada ESP=000

Llamada ESP=Dirección de retorno. (palabra de 4

bytes)

ESP+4=parámetro HDC.(palabra de 4 bytes)

ESP+8=segundo parámetro

Aplicando nuestro bpx y pulsando "Proyect/Run" BOOM, aparecemos en el sice,

para ver si estamos realmente ante el setbkcolor correcto, cambiemos el color "d

esp+8" Y pasamos de "FFFF00" a "FFFFFF" .

Obtenemos un bonito color blanco de fondo. Luego hemos pillado la llamada

correcta. Un par de f12 después obsevamos

:460a15 cmp [ESI+378],43CA

Si los valores no son iguales vemos el mensaje de error. Por tanto es este el flag que

controla todo. Ya sólo basta ver quien lo inicializa. Pero este es un trabajo

conocido por todos que lo dejo como ejercicio.

Fijaos como no se utiliza un clásico flag 1,0 sino un valor difícil 0x43CA. Un nuevo

síntoma de que el autor ha leido sobre cracks.

CONCLUSIÓN

Hemos aprendido una nueva técnica: "Color Crack". Es recomendable que se

aplique cuando el mensaje de "unregistered "no sea una ventana sino una cadena

dentro de una ventana.

Debemos averiguar el color que se aplica al mensaje y colocar en el Sice:

bpx nombreRutina if (*(esp+8)==00BBGGRR)

Recordad que los valores de Blue(azul),Green (Verde) , Red (rojo) están hexa.

Page 53: Como crakear por estado+porcino

Cuando apararezcamos en el Sice cambiar el color para ver si estamos en la

ventana correcta. En tal caso buscar un salto que evite el mesaje.

Este técnica siempre es aplicable, pero se recomienda que se utulize cuando existan

pocos colores en la ventana y el mensaje esté resaltado del resto (cosa bastante

habitual).

Una posible generalización de está técina es aplicable al color del tipo de letra

(foregroundcolor), el tipo de fuente, (setFont), el aspecto (cursiva ...). Recordad de

echar mano de una buena ayuda Api para win32.

No olvidemos el esquema de protección tan original de SEPARACIÓN DE

COMPROBACIONES que ha implementado el autor. Realmente interesante, si

señor.

Notas para los lectores.

1.- Los mensajes del tipo "Hazme el crack para ....", "Dime como se crackea....",

"Dime donde puedo encontrar..." son automáticamente ignorados. El objetivo de

estos artículos es enseñar a crackear no enseñar a ser unos llorones ineptos que

sólo saben mendigar.

2.- Sólo responderé a preguntas teóricas sobre cracks, indicando algunas pistas que

faciliten la labor.

3.- Narices, escribid artículos sobre los programas que crackeeis.

De nada sirve lo que aprendéis si no lo repartís, se os pudre en el cabeza, palabra.

4.- Lamento no haber contestado a ciertos mails interesantes. Desde aquí mis

excusas.

5.- Si os ha servido para algo mis artículos, no seáis vagos y mandad un mail

indicándomelo.

Estado+Porcino

Esperamos vuestras opiniones, sugerencias y ensayos en

[email protected]

En breve analizaremos tipos de protecciones mucho más interesantes.

Recordad bebed de la fuente, buscad a +ORC en la red.

Page 54: Como crakear por estado+porcino

COMO CRACKEAR POR ESTADO+PORCINO

CAPÍTULO VI. DESVIRGANDO EXPEDIENTES X

-Como Crackear Contaplus Élite Pyme-

Junio 1999

Indice

INTRODUCCIÓN

AL ATAQUEEEEEEE

PROTECCIONES ESPAÑOLAS

PRIMERA APROXIMACION Y PRIMER ENFADO

OBJETIVOS

SEGUNDA APROXIMACIÓN Y SEGUNDA OSTIA. LAS COSAS SE COMPLICAN

LA SOLUCIÓN A LA PELUA CUESTIÓN

MODIFICACIÓN DE FICHEROS CREADOS EN TIEMPO DE EJECUCIÓN

INTENTO SER UN TIO ELEGANTE, PERO NO ESTÚPIDO

CAER EN LA CUENTA

OPCION 3 CAÑERA

VUELTA A LA PROTECCIÓN

ESTÚPIDO VELO

¿ÉXITO?

SOLUCIONES VIABLES

HORROR Y ESPANTO

Page 55: Como crakear por estado+porcino

EL MISTERIO INSONDABLE

EL EXPEDIENTE X DESVIRGADO

JUGUETEANDO

PD PARA EL PROGRAMADOR

INTRODUCCIÓN

Victima: CONTAPLUS ÉLITE PYME

Site: www.gruposp.com

HERRAMIENTAS:

Desensamblador. Por ejemplo w32dasm

Editor hexadecimal. Por ejemplo uedit

Paciencia y Confianza.

Saludos familia. Aprovecho los ratos para escribir algunas

cosillas.

En esta ocasión acometemos uns joyita con Discos llave,Números

de serie,encriptación, descompresión en tiempo de ejecución y

misterios insondables.

Un dulce para pasar el rato.

Llegó a mis manos una petición de crack. Normalmente la

desestimo, a menos que la pida un amigo, me interese o

favorezca mi entorno de trabajo.

Es mejor enseñar a crakear que enseñar a llorar para suplicar.

En fin, toda esa filosofía expuesta por +ORC y reescrita por

E+P. Son las 8:00 de la mañana y me he pasado toda la noche

crakeando.

Si señor, hay pocos placeres comparables.

Los crackers me entenderán perfectamente de lo que les hablo:-

).

El peluo maulla desesperao y la gorda duerme a mi lado.

A veces la vida te sonríe y no sabes porqué.Aprovéchala antes de

que cambie.

En este entorno , nada se puede resistir...

AL ATAQUEEEEEEE

Miremos nuestro producto. Se trata de un clásico de la

Page 56: Como crakear por estado+porcino

facturación española. Contaplus Pyme Élite Otoño 98 del 1-11-

98

Un paquete en formato CD que se compone de:

ContaPlus

FacturaPlus

NominaPlus

PersonalPlus

Utilidades (Antivirus Norton, Antivirus Mcafee, Sidekick y PC

Anywhere)

La web la tenemos en www.gruposp.com.

Despendolemos un ratico por su web a ver a cuanto tienen el

timo.

Uhmm 2 millones de ventas y nuestro producto 165.000 pelas, !!!

Precio especial !!!!

Joer, pos si que, pa una urgencia, vamos.

Se merecen que lo crackeen, si señor.

PROTECCIONES ESPAÑOLAS

A primera vista, el programa es español y por tanto la protección

también. Conociendo los antecedentes de protecciones españolas,

estimo que estará roto en 5 minutos. Sólo recuerdo una protección

española cojonuda. Era de un catalán y se la había puesto a su

programa de rompecabezas. Si sería buena que fue uno de los

"coladores"para la +HCU con +ORC y +Fravia(a ver si se

recupera pronto, leñe)

PRIMERA APROXIMACION Y PRIMER ENFADO

Empezamos mal, intentamos instalar el contaplus y nos pide un

disquete llave. Joder, ¿no habían pasado al olvido esas

protecciones basadas en discos llave?. ¿Es que no aprenden?. Los

discos llave fueron desechados porque

no eran fiables, se podían cascar en el trayecto de la fábrica al

usuario y luego vete a reclamar al maestro armero una vez que

has pagado el producto, eso sin contar

el tiempo de espera del nuevo disquete, y que el que te manden no

esté roto.

Para colmo, estos discos se formatean a medida por lo que no se

pueden

copiar (en general) ni siquiera para sacar una triste copia de

seguridad.

Como veis, una mierda, y los del CONTAPUS dale que dale.

OBJETIVOS

Page 57: Como crakear por estado+porcino

Estan claros, cepillarse al CONTAPLUS y obviar el disco llave.

Pero conseguiremos bastantes cositas más.

SEGUNDA APROXIMACIÓN Y SEGUNDA OSTIA. LAS

COSAS SE COMPLICAN

Si intentamos instalar sin disco llave nos aparece una estúpida

ventana:

"Inserte disco llave, Por favor retire el disco actual y bla,bla,bla"

La ventanita tiene pinta de dialogbox, así que nos vamos al

SoftIce y ponemos

unas bonitas trampas para osos.

bpx dialogbox

bpx dialogboxparama

Lanzamos al niño y el que pica es el bpx dialogboxparama.

Con f12 aparece la ventana de error, pulsamos NO y caemos en

kernel!alloc.

Ostias que feo. F12 antes pa asomar el pescuezo en

:10012739 dentro del proceso ~GLC000x. (la x es variable).

Ostias, que mierda es esta, ¿dónde está es fichero ese tan raro?.

En el directorio del conta no, seguro.

¿Pero entonces dónde?. Si buscamos el ficherito no está en el disco

duro.

Entonces, ¡por la madre de MITRA!, ¿que coño pasa?.

Pensad una posible solución antes de pasar al siguiente párrafo,

que os van a salir almorranas cerebrales.

LA SOLUCIÓN A LA PELUA CUESTIÓN

Pos si, seguro que ya lo habeis acertado :-)

El puto fichero se crea en tiempo de ejecución y se borra antes

salir.

Por eso no aparece en el directorio de instalación ni en el disco

duro al finalizar.

Pero entonces, segunda e importante cuestión:

¿como mangonearemos si se genera en tiempo de ejecución?

Es vital poder toquetear para saltarse la protección.

Así pues, relegamos el estudio del

para centrarnos en como se puede modificar un fichero que se

crea en tiempo de ejecución.

MODIFICACIÓN DE FICHEROS CREADOS EN TIEMPO DE

EJECUCIÓN

Page 58: Como crakear por estado+porcino

Las variantes que se me ocuren de menos a más elegantes son:

1 Entender como se crea el fichero y retocarlo antes de que se

cree.

2 Parchearlo en memoria una vez creado

- mediante un parche en tiempo de ejecución.

- Aplicando ingeniería inversa para localizar y redirigir un trozo

de código

inútil dentro del ejecutable y que parchee el fichero.

3 Dejar que se cree en memoria pero redirigirlo a un fichero en

disco ya retocado.

Recuerdo cierta protección del mismo tipo en el Hotmetal 4.0.

antes que los encerraran en la inutilidad del vbox.

INTENTO SER UN TIO ELEGANTE, PERO NO ESTÚPIDO

Pues eso, intento ser un tio elegante y opto por la primera opción

y descubro lo siguiente:

* Dentro del fichero instalar.exe del contaplus reside el famoso

~GLC000x.

En tiempo de ejecución se lee un trozo del fichero instalar.exe, se

marea un poco y se construye el nuevo fichero.

El nombre se construye a partir de una cadena constante

:~GLC%04x.tmp.

Podeis abrir el fichero instalar.exe y cambiar el nombre por algo

más decente.

Tengo destripado y pasado a C el algoritmo que extrae del fichero

instalar.exe los bytes, los marea un poco y los escribe en el

~GLC%04x.tmp.

Si quereis más datos del algoritmo mandadme un mail.

* Me quedaba la duda de si el autor de la protección había

encriptado, comprimido o encriptado/comprimido.

La respuesta es sólo comprimido siguiendo un complicado

algoritmo que tengo casi analizado.

Asi pues sólo queda otra semana para crear un compresor (el

descompresor ya lo tengo, está en el propio programa).

* Como la cosa se complicaba, deseche esta vía y me fui a la

opción 2.

Pronto la desistimé porque no sabía cuantos parches tenía que

aplicar.

Así pués, me fui a la vía 3. Ya sé, ya sé, es la más cutre, pero rula

:-)

Page 59: Como crakear por estado+porcino

CAER EN LA CUENTA

Concurrida audiencia, por si no os habeis dado cuenta, la

protección es muy buena.

RESPETAD AL PROGRAMADOR que se ha entretenido en

comprimir sus datos

y descomprimirlos en tiempo de ejecución.

Buen trabajo BBYYMMAARRCCOOSS.

Quizás no esté todo perdido dentro del panorama de

programadores españoles.

Aupa muchachos!!!

OPCION 3 CAÑERA

Lo primero es pillar una copia chachi del ~GLC%04x.tmp pa

poder

modificarla tranquilamente y después regirigir el programa para

que cargue nuestra dll y no la que ha creado.

Para ello, lanzamos el instalar y aparece la venta de error con

"si" y "no" .

Nos vamos al explorador de Windows con la teclilla nueva con el

logo del windoze

(ostias, pero si sirve pa algo y to), o bien lo abrimos antes que el

instalar y conmutamos con ALT+TAB.

Estamos seguros que el fichero debe de existir porque aún no ha

acabado el programa (nos da la opción de continuar si pusamos

"si").

Buscamos en el explorador los ficheros que empiezen por ~GLC y

bingo,

lo tenemos en c:\windows. Con mucho cuidado lo copiamos y lo

pegamos en un sitio seguro.

Nuestra cena ya está en la red :-=).

Para los descuidados como yo, habilitarle la opción de sólo lectura

con el botón derecho

del ratón y propiedades. Sino lo perderemos cuando lo utilizemos.

Recordad quitarle lo de sólo lectura para parchearlo.

Do quiera que un fichero se cargue en memoria y se ejecute en

tiempo de ejecución este debe ser una dll.

Ya sé, ya sé, no tiene extendión dll ni ná, pero no es necesario.

Para que un fichero sea considerado dll basta con tener nombre y

extensión, y la constante ~GLC%04x.tmp lo cumple.

Por tanto, instalar debe cargarlo como librería. Si lo

desensamblamos, vemos que usa la función del api

KERNEL32.LoadLibraryA y además sólo una vez.

:004024F7 740A je 00402503

:004024F9 E87E060000 call 00402B7C

:004024FE E9BD000000 jmp 004025C0

* Referenced by a (U)nconditional or (C)onditional Jump

Page 60: Como crakear por estado+porcino

at Address:

|:004024F7(C)

|

:00402503 8D85E8FEFFFF lea eax, dword ptr

[ebp+FFFFFEE8]

:00402509 50 push eax; Nombre

churro de la librería ~GLC%04x.tmp

* Reference To: KERNEL32.LoadLibraryA, Ord:0190h

|

:0040250A FF1534304000 Call dword ptr

[00403034]

Ahora hay que aplicar un poco de ingeniería inversa para

transformar y que cargue siempre nuestra librería

retocada. Os ahorro el proceso mental y obtenemos

después de verificar que nunca se pasa por

:004024F9 (con un bpx por ejemplo)

:004024F7 8D85E8FEFFFF lea eax, dword ptr

[ebp+FFFFFEE8];Dirección del nombre de la dll a cargar

:004024FD C700432E6100 mov dword ptr [eax], 00612E43

;Constante .a0 y aprovechamos la c inicial

de [eax] nos queda c.a

:00402503 8D85E8FEFFFF lea eax, dword ptr

[ebp+FFFFFEE8];Guardamos las modificaciones.

:00402509 50 push eax

* Reference To: KERNEL32.LoadLibraryA, Ord:0190h

|

:0040250A FF1534304000 Call dword ptr

[00403034]

Con esto siempre se carga la librería "c.a". Así pues

renombramos la ~GLC%04x.tmp que habiamos pescado antes

como "c.a" . Ya sé, el nombre es un poco cutre,

pero si no os gusta retocarlo vosotros. No se os

olvide indicar que es de sólo lectura si no lo queréis

perder.

Si repetimos lo del bpx dialogboxparama aparecemos en el

proceso C!text (nuestro fichero c.a). Vamos por

el buen camino. To este rollo pa redirigir un

puto fichero, la protección debe ser la ostia. Estoy

ansioso :-)

Resumiendo, buscamos en el instalar.exe 74 0A E8 7E 06

00 00 y lo encontramos en 0x18F7 y cambiamos por

8D 85 E8 FE FF FF C7 00 43 2E 61 00

VUELTA A LA PROTECCIÓN

Ya podemos mangonear tranquilos nuestro C.a.

Ahora hay que localizar donde se llama al disco llave y

neutralizarlo.

Los accesos al disco se pueden hacer de forma cutre y a alto nivel

con "deviceiocontrol"

o bien usando las interrupciones a pelo. Como podeis sospechar,

Page 61: Como crakear por estado+porcino

se han usado los deviceiocontrol.

Si en el softIce ponemos un bpx deviceiocontrol aparecemos en

una dll mu fea GLfxxxx.tmp.

Esto suena al mismo truquillo de descompresión en tipo de

ejecución.

Si pusamos unas 20 veces f12 reaparecemos en nuestra querida

c.a

:10015244 FF24858E540110 jmp dword ptr

[4*eax+1001548E]

:1001524B FF550C call [ebp+0C] ;Llamada

a la feisima glfxxxx.tmp

:1001524E E93C010000 jmp 1001538F

:10015253 FF75B4 push [ebp-4C]

:10015256 FF550C call [ebp+0C] ;2º

Llamada

Os ahorro el trabajo y os comento como funciona el

esquema de protección a este nivel.

Se crean 2 dll en tiempo de ejecución en el mismo

estilo que ya hemos comentado.

Estas dll se encargan de todo el acceso al disco

llave.

Los parámetros a las dll se pasan (agarraos) en

cadenas ascii.

Basta con poner un bpx 1001524B y echar un

vistazo a esi y edi.

Obtendremos parámetros del tipo

3HayDisco

3Esdisco

3Instalaciones

ESTÚPIDO VELO

Corramos un estúpido velo en esta parte de la protección, porque

es la más patética.

Baste decir dos cosas, para anular completamente al disco hay

que parchear :1001524B.

En :1001524B se comprueba que existe disco, que el disco tiene el

formato adecuado,

se leen el número de licencias .

Si existe algún error devuelven en eax=0, sino devuelven eax=1

Así pues cambiamos

:10015244 FF24858E540110

jmp dword ptr [4*eax+1001548E]

:1001524B FF550C

call [ebp+0C]

:1001524E E93C010000

jmp 1001538F

:10015253 FF75B4

push [ebp-4C]

:10015256 FF550C

call [ebp+0C] ;2º Llamada

Por

Page 62: Como crakear por estado+porcino

:1001524B 33 C0

xor eax,eax

:1001524D 40

inc eax

:1001524E E93C010000

jmp 1001538F

:10015253 33 C0

xor eax,eax

:10015255 33 C0

xor eax,eax

:10015257 40

inc eax

:10015257 90

nop

Buscamos FF 24 85 8E 54 01 10 en c.a y lo encontramos

en 0x1464B donde ponemos 33 C0 40 E9 3C 01 00 00 33 C0

33 C0 40 90

Con esto quedan fulminados los accesos a disco.

Si seguimos adelante nos pide un número de serie

que se puede obviar si parcheamos en

:1001525E FF75B8 push [ebp-48]

:10015261 FF75B4 push [ebp-4C]

:10015264 FF550C call [ebp+0C]; eax=0

si todo va bien.

:10015267 E923010000 jmp 1001538F

por

:1001525E 33C0 xor eax, eax

:10015260 33C0 xor eax, eax

:10015262 33C0 xor eax, eax

:10015264 33C0 xor eax, eax

:10015266 90 nop

:10015267 E923010000 jmp 1001538F

Si no parcheamos los push el programa casca.

Resumiendo, buscamos en c.a ff 75 b8 ff 75 b4 ff 55 0C

E9 23 01 00 00

y lo encontramos en 0x1465E, cambiándolo por 33 c0 33 c0

33 c0 33 c0 90

Cuando pida el serial podemos introducir cualquier

churro numérico p.e: 111-1-696969-11

En el nombre de la empresa y nombre del usuario

introducimos más de dos caracteres.

Curiosamente todas estas rutinas GLC de acceso a

disco y check del serial, aparecen como

una dll normal spptr.dll en el directorio de

instalación. Para qué, mu sencillo,

para deinstalar y eliminar una licencia del disco llave.

En teoría hay un número límite de instalaciones, cada

vez que se instala

el programa se elimina una licencia del disco llave y

cada vez que se desistala se añade una.

¿ÉXITO?

Si seguimos todos los pasos, la instalación

Page 63: Como crakear por estado+porcino

finaliza correctamente .

Ávidos lanzamos el programa y crash."Aplicación

instalada incorrectamente".

¿En qué nos hemos equivocado?. Pensad un poco.

SOLUCIONES VIABLES

Seguro que habéis llegado a la misma conclusión que yo.

Las rutinas de manejo de disco que hemos inutilizado, dejaban

algun flag en algún sitio

que indicara que el programa estaba bien instalado.

Así pues hay quedan dos opciones:

1 Saltar la comprobación en el programa principal.

2 Activar ese flag.

HORROR Y ESPANTO

Seleccionando la opción 1 nos encontramos en un avispero.

El progrma principal está hecho en CLIPPER.

Qué horror, aún se siguen usando esas herramientas del demonio.

Si queréis pasarlo realmente mál intendad, trazar un programa

en clipper.

El control se realiza por bucles

de salto del tipo call[ax+4] que conducen a otros bucles de salto

call [ebx+6], hasta el inifito.

Todo está dirigido por tabla y en código de 16bits.

Osea nada de usar la potencia de los registros de 32 bits.

Una montaña de mierda, como podreis observar.

Nada recomendabe ni saludable.

Optamos por la opción 2. Para eso llamamos a nuestro amigo y le

pedimos que nos comprima

el CONTAPLUS (bien instalado) en

disquetes para compararlo con el que tenemos. Busque las

diferencias.

EL MISTERIO INSONDABLE

Si descomprimimos el CONTAPLUS bien instalado en nuestro

disco duro nos llevamos

una desagradable sorpresa. "Aplicación mal instalada".

Joder, que coño pasa, pero si lo hemos copiado de uno que estaba

bien instalado.

A ver, a lo mejor accede al registro del sistema buscando algo

raro.

Lanzamos el regmon y vemos que la aplicación accede pero busca

cosas nada importantes.

Podréis pensar, bueno quizás busque un fichero extraño que no

hayamos copiado.

Lanzamos en filemon y sólo accede al win.ini fuera de su

directorio.

Miramos el win.ini y no vemos nada sospechoso.

Page 64: Como crakear por estado+porcino

¿To esto está mu bien, pero que coño mira para saber que no está

bien instalado?

Este es el misterio insondable que me ha tenido la noche en velo y

que me ha hecho disfrutar

como un enano cabezón. Pero hay más, si copiamos el directorio

de instalación en el disco duro

donde se instaló originalmnte, el programa deja de funcionar.

Quedan eliminados los flags en el registro del sistema y el acceso a

ficheros raros,

como ya suponíamos. Y el colmo, si copiamos y pegamos el

ejecutable en el directorio de

instalación del disco duro original de instalación el jodio

programa funciona con el

ejecutable original, pero no con la copia. ¿es mágia?

¿hay una explicación razonable o estamos ante un expediente X ?

Pensad el problema antes de mirad la solución, es apasionante.

Centraos en lo extraño que es que funcione con el ejecutable

original

y no con la copia, cuando son los mismos ficheros.

EL EXPEDIENTE X DESVIRGADO

Lo más curioso de todo es que el programa funciona con el

ejecutable original, pero no con la copia.

En principio, esto no tiene sentido, a menos, claro está que exista

una diferencia entre el original y el copiado. Exactamente, la

fecha de creación.

Para comprobarlo retrasé el reloj del windoze hasta la fecha hora

y minuto en el que se había

construido el ejecutable original.

En ese preciso momento realizé una copia del origial y BINGO, la

copia del ejecutable funcionaba.

Ya hemos encontrado el flag, pero hace falta saber donde se

guarda.

En el registro del sistema no, porque no realiza ninguna

operación extraña.

Puede guardarlo en algún campo de la base de datos , osea en los

fichero dbf. Para eliminar esta opción copie todos los ficheros

(excepto el ejecutable) de nuestro CUENTAPLUS al directorio

original, y seguia funcionando.

En conclusión, el flag está dentro del propio ejecutable.

Para comprobarlo, comparé el ejecutable original y el nuestro y

he aquí las diferencias :

FileSize: 2FA780h

DD 2F2726h

Page 65: Como crakear por estado+porcino

DB C7h

DB 7Fh

DD 2F2727h

DB A2h

DB C1h

DD 2F272Dh

DB 9Dh

DB 3Dh

DD 2F272Eh

DB 54h

DB 79h

Cambian 4 posiciones de memoria de un ejecutable a otro.

Así pues una de las rutinas de acceso a disco que hemos

desabilitado introduce en el ejecutable final la fecha

de creación.

Para más inri, esta fecha está encriptada y la llave de

la desencriptación es BBYYMMAARRCCOOSS.

Estos programadores nuncan aprenderán a ser

humildes, los muy jodidos.

Si cazamos las dll de disco que hemos anulado

(copiar y pegar como ya vimos) y desensamblamos,

observamos que

se utiliza una bonita función:

DosDateTimeToFileTime function converts MS-DOS date and

time

values to a 64-bit file time.

BOOL DosDateTimeToFileTime(

WORD wFatDate, // 16-bit MS-DOS date

WORD wFatTime, // 16-bit MS-DOS time

LPFILETIME lpFileTime // address of buffer for

64-bit file time

);

Ponemos un bpx DosDateTimeToFileTime y lanzamos el

contaplus. EUREKA, aparecemos en spptr.dll, un par de

f12 más y volvemos a al ejecutable original. No

os aburriré indicando como localizar la rutina de

comprobación del flag (ya somos mayorcitos), doy

directamente el parche:

Cambiamos

:10001545 8D542428 lea edx, dword ptr

[esp+28]

:10001549 51 push ecx

;BBYYMMAARRCCOOSS

:1000154A 52 push edx

Por

:10001545 8D542428 lea edx, dword ptr

[esp+28]

:10001549 51 push ecx

;BBYYMMAARRCCOOSS

:1000154A 51 push ecx

;BBYYMMAARRCCOOSS

Page 66: Como crakear por estado+porcino

Buscamos en spptr.dll 8d 54 24 28 51 52 lo encontramos

en 0x154A y lo cambiamos por 51 Listo y a

disfrutar.

Ya es hora de volver con la gorda y el peluo para

tomar una cerveza.

JUGUETEANDO

*Existe una forma alternativa de corregir el problema de

aplicación mal instalada. Si cogemos un dbf cualquiera del

directorio /emp y lo copiamos con el nombre menumode.dbf ,

entramos en la aplicación pero en versión demostrativa, sin copias

de seguridad y sin algunas opciones más.

* Para convertir las copias de seguridad a la versión profesional,

cambiad el nombre del fichero /emp/versione.dbf por

/emp/versionp.dbf y /emp/menuwine.dbf /emp/menuwin.dbf .

Esto provoca un pequeño error al mirar el "Acerca de" en el

CONTAPLUS, pero no tiene mayor importancia. Sospecho que

con una poyada de estas más podemos pasar del CONTAPLUS

élite al profesional, pero no he dado con la tecla.

* Podemos copiar impunemente el directorio del CUENTAPLUS

de un disco duro a otro sin necesidad de reinstalar.

* Este mismo proceso es aplicable al NOMINAPLUS y

FACTURAPLUS y el resto del paquete y muy probablemente al

resto de productos de la empresa SP. El TVPPLUS está cascado

(por lo menos en el cd) por lo que no se ha podido probar y el

PersonalPlus no necesita retoques. PAra el resto de componenetes

del paquete, simplemente se parchea el instalar.exe, y se copia el

c.a del CONTAPLUS y se comienza la instalación. Una vez

instalado, se copia el spptr.dll del contaplus en el directorio

apropiado para cada producto (NOMINAPLUS: /exe)

(FACTURAPLUS: /exe)

* Para pasar una version demostrativa (o educativa) a versión

élite, basta con aplicar el parche al spprt.dll y borrar el fichro

/emp/menumode.dbf

PD PARA EL PROGRAMADOR

Querido Marco:

Has construido una buena protección.

He estado tentado de guardarme el crack por respeto.

Pero lo que me decidió fue la decepción de ver como usabas

Clipper y tu forma relajada de acceder al disco mediante

Page 67: Como crakear por estado+porcino

deviceiocontrol.

La próxima vez esmérate un poco más, aunque he de reconocer

que he disfrutado con tu protección en grande.

Notas para los lectores.

1.- Los mensajes del tipo "Hazme el crack para ....", "Dime como

se crackea....", "Dime donde puedo encontrar..." son

automáticamente ignorados. El objetivo de estos artículos es

enseñar a crackear no enseñar a ser unos llorones ineptos que sólo

saben mendigar.

2.- Sólo responderé a preguntas teóricas sobre cracks, indicando

algunas pistas que faciliten la labor.

3.- Narices, escribid artículos sobre los programas que crackeeis.

De nada sirve lo que aprendéis si no lo repartís, se os pudre en el

cabeza, palabra.

4.- Lamento no haber contestado a ciertos mails interesantes.

Desde aquí mis excusas.

5.- Si os ha servido para algo mis artículos, no seáis vagos y

mandad un mail indicándomelo.

Estado+Porcino

Esperamos vuestras opiniones, sugerencias y ensayos en

[email protected]

Recordad bebed de la fuente, buscad a +ORC en la red.