ESTUDIO COLECTIVO DE DESPROTECCIONES
Última Actualizacion: 25/10/2001

Programa ACDSee 3.0  W95 / W98 / NT 
Descripción Visor gráfico.
Tipo Shareware Trial de 30 dias. 
Tipo de Tutorial [X]Original, []Adaptación, []Aplicación, []Traducción
Url http://www.acdsystems.com
Protección Time Limit 30 Dias. Empacado.
Dificultad 1) Principiante, 2) Amateur, 3) Aficionado, 4) Profesional, 5) Especialista 
Herramientas SoftIce v3.25, W32dasm v8.9, ProcDump y Editor hexadecimal 
Objetivo Eliminar time limit.
Cracker Nopper
Fecha 1 de Abril de 2000 


NUESTRA VÍCTIMA
Hola peña, estoy orgulloso de poder escribir mi primer tutorial para el ECD.
En este tuto vamos a crujir la versión 3.0 de ACDSee. 
El impedimento que nos pone este excelente visor para no poder usarlo de forma "cómoda" es el trial de 30 días. Así que atakaremos el trial y además quitaremos un par de molestas nags que nos sale al comienzo del programa.
 
EL EMPACADO
Para comenzar adelantemos nuestro calendario más de 30 días para que caduque el programa. Al arrancar nos saldrá la ventana dandonos la opción de registranos vía on-line, desistalarlo o salir. Esa ventana será nuestro punto de referencia a la hora de crackearlo.
Bueno lo primero que solemos hacer es acudir a nuetro W32DASM y sacar la lista muerta, pero en este caso nuestro desensamblador preferido no podrá hacerlo, se quedará colgado sin hacer nada.
Bueno da igual, le meteré mano a pelo con el SI. ¿ Pero qué pasa? tampoco va el SI, no rompe inicialmente, que le ha pasado? se habrá quemado de tanto trabajar? se habrá quedao gilipollas? ...no! lo único que pasa es que nuestro archivo está empacado.
Bien acudamos a nuestro ProcDump y editemos sus secciones para echar un ojo. Aquí encontramos un par de cosas bastante interesantes. Para empezar cambia el valor de característica de la sección .text a E0000020. ¿ Que por qué hacemos esto ? este valor indica entre otras cosas que nuestra sección ahora es editable ( no lo era antes por culpa del valor que tenía originalmente ) y ahora nuestro SI funcionará (ufff! que alivio).
Otro detalle es esa sección final con ese nombre tan cantoso: "aspack". Esa sección contiene el cargador que se encargará de desempacar el archivo en tiempo de ejecución. Entonces es fácil tan solo debemos ejecutar ProcDump y decirle que desempaque el archivo eligiendo como tipo Aspack, pero.... resulta que no va ninguna de las versiones que incorpora ProcDump!!! ( por lo menos en mi versión ). Bién! así nos divertiremos más, cuanto más trabajoso es el crack más disfruto ;-D 
 
HOUSTON TENEMOS UN PROBLEMA
Bien, arranquemos nuestro SI para desempacar manualmente. Una vez cargado aterrizaremos en la dirección 00555001, cuya instrucción es PUSHAD ( empuja a la pila todos los registros de propósito general ). La mayoría de los empacadores tienen la siguiente estructura :

PUSHAD ( Salva registros )
CALL [....] ( Llama a la rutina que desempaca )
POPAD ( Recupera los valores de los registros )
JMP ... ( Finalmente salta al comienzo del programa ya desempacado ) 

Este esquema es muy habitual encontarselo, de todas formas podemos encontrar variantes donde por ejemplo la rutina desempacadora está a su vez encriptada, pero para el caso el esquema nos viene muy bien.
Ahora lo que vamos a hacer es buscar el primer POPAD que veamos para colocar un break y ver si posteriormente salta al comienzo del programa ya desempacado. Para esto debemos escribir en el shell del SI lo siguiente :

: S 00555001 L FFFFFF 61

61 es el código en hexadecimal que corresponde a la instrucción POPAD. Encontraremos un POPAD en la dirección 00555321, ahora coloquemos un break en ese punto y pulsemos F5 para seguir con la ejecución. Vaya! no ha roto, eso quiere decir que ese POPAD no era el que buscabamos. Pasemos a buscar el siguiente :

: S 00555322 L FFFFFF 61

El siguiente que encontramos está en 005554BC. Repitamos la operación anterior. Bien! ahora si ha roto, si pulsamos F10 cuatro veces pasaremos por un RET ( 005554CC ) que nos lleva a la dirección 004A33BF. Este salto es realmente grande, fijaos, la dirección ya no empieza por 5 si no por 4, parece que hemos topado con la dirección correcta. Ahora volvamos a depurar, coloquemos un break en 005554CC, cuando haya roto introduzcamos en esta dirección lo siguiente :

: A 005554CC
: JMP EIP

Con esto conseguimos que el flujo siempre salte a la misma dirección, quedando el programa en un bucle infinito. Esto se hace para poder volcar lo que nos interesa de forma limpia, evitando que el programa siga corriendo y pueda modificar línes del código que nos interesa. Como ya ha terminado de desempacar ahora tenemos nuestro programa en memoria listo para ser volcado, abre ProcDump y en la ventana donde corren las tareas actuales (task) pulsa botón derecho sobre ACDSee y elige Dump/Full, nombralo como ACDCrack, por ejemplo, ahora elige Kill para terminar la ejecución. Bueno solo nos falta modificar el punto de entrada, este punto es :

( Entry Point - Image Base ) En este caso : (4A33BF - 400000) = 0A33BF
 

BUCEANDO POR EL CODIGO. ELIMINACION DEL TRIAL
Ya tenemos nuestro archivo desempacado y las manos libres para meterle caña. 
Si ya tenemos un poco de práctica veremos que la ventana bad boy da un poco de cante a DialogBoxParam, de todas formas, si no lo veias no pasa nada, a esta rutina se llega de forma fácil.
Bueno, carguemos a la víctima en el SI y coloquemos un break para esta API :

: BPX DialogBoxParamA

El programa romperá en en 00433FFE. Vayamos a W32DASM y miremos a ver si hay algo interesante. Vamos a la dirección 00433FFE y miramos hacia arriba ( al techo no tío!, me refiero a "por encima del código" ) ;-D , para ver si encontramos alguna referencia a un salto. Efectivamente, se nos informa de que a que a esta porción de código se accede desde un CALL en 00433ABB. Pues vamos de cabeza a esa dirección :

Veis el salto que hay en 00433AB7 ?, es muy posible que bifurque el camino entre la elección de la rutina bad boy o la rutina good boy. Bien pues probemos, modifiquemos ese salto a un jmp 00433ACC. Pues resulta que si hacemos los cambios pertinentes esto no funciona, pero lo más curioso es que si le seguimos la pista cuando el programa aún no ha caducado ( retrasa el calendario, este trial no mira si hemos modificado la fecha ) vemos que este es el salto que efectivamente marca la diferencia entre good boy y bad boy, entonces que pasa?. Si nos fijamos los valores de los registros son diferentes cuando se llega a ese salto dependiendo de si está caducado o no, es posible que estos valores se utilicen luego para realizar operaciones y como hemos forzado el salto pero los registros contienen los valores incorrectos el programa no se ejecuta de forma correcta. Lo que vamos a hacer es fijarnos en los valores que contienen los registros a la altura del salto en good boy y los que contienen en bad boy, comparamos y obtenemos los valores a introducir en los registros para que el programa corra como si estuviese siempre en goodboy. Estos valores que cambian son los siguientes :

EAX=00000000
EDI=81608A9B
ECX=00000000
EDX=00000000 

Introducimos entonces en 00433AB7 ( no machacamos 00433AB4 porque podría afectar a los flags ) lo siguiente :

MOV EAX, 00000000
MOV EDI, 81608A9B 
MOV ECX, 00000000
MOV EDX, 00000000
NOP

Ya no hace falta forzar el salto a 00433ACC porque después del NOP viene esa dirección. 
Probamos y ... FUNCIONA!!! Tan solo hace falta introducir esas líneas en el archivo con tu editor hexadecimal. Los códigos de intrucción los puedes ver desde SI con la opción :

CODE ON

Estos tienen que ser los siguientes:

B8 00 00 00 00 BF 9B 8A 60 81 B9 00 00 00 00 BA 00 00 00 00 90
 

NAGS, MALDITAS NAGS.
Ya solo queda el último obstáculo, las molestas nags. Como lo "gordo" ya lo he explicado y estas nags no presenta ninguna dificultad especial ( son también DialogBoxParamA ) lo dejaré como ejercicio para aquel que todavía esté un poco verde.
La solución es :
( Saltos condicionales a cambiar por saltos incondicionales )

00407BF9 --- EB 17 ( Primera nag )
00440E5C --- EB 0E ( Segunda nag, solo aparece de vez en cuando )
 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Gracias a :

WKT! - Simplemente los mejores.
Karpoff - Por tener una página de puta madre. 
A toda la gente de los foros que me han ayudado siempre que lo he necesitado. 
CraMa - El grupo al que pertenezco, aunque todavía estamos comenzando prometemos dar mucha caña.
A toda la comunidad en general.

Nopper. 2000.

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

[ Entrada | Documentos Genéricos | WkT! Web Site ]
[ Todo el ECD | x Tipo de Protección | x Fecha de Publicación | x Orden Alfabético ]
(c) Whiskey Kon Tekila [WkT!] - The Original Spanish Reversers. 
Si necesitas contactar con nosotros, leeestoantes e infórmate de cómo puedes ayudarnos