ERDAS IMAGINE v8.2 - Tutorial

<http://www.erdas.com> - Pagina web

Me parece que ahora mas programadores alguna vez usan protecciones de hardware para proteger sus aplicaciones (cuando en realidad unas rutinas de ASM bien formadas causarian mucha mas molestia a la mayoria de crackers). De hecho si tuviese el dongle para todos los programas de mi ordenador la parte trasera de este tendria una extension de 3ft. Si Ud va a usar un dongle entonces recuerde que la utilizacion de ellos no es bastante note tambien que en mi opinion una proteccion de CERROJO basica es probablemente mejor que un Centinela.

ERDAS IMAGINE es un software bastante complejo, lanzando el prorama nos da un error messagebeep (ponemos un bpx para que saltemos al interior de una dll (elib.dll), F12 nos lleva dentro de eml.exe (debajo de la llamada que nos dio este error un scroll con Ctrl + Up nos mostrara algun codigo interesante.
Desensamblamos eml.exe (12,5K), el programador estaba obviamente versado en una dll que escribe porque el programa principal realmente carga el codigo para todas las importaciones de dll. Aunque el desarrollo sabio recomienda su utilizacion un cracker experto no tendra ningun problema para encontrar su proteccion den un 12 k.exe

este es el codigo devuelto por el messagebeep:

:004013BB CALL EMLLIB.eeml_Init <-- Aqui el dongle esta conectado.
:004013C0 ADD ESP,14 <-- Stack correcto.
:004013C3 MOV EBX,EAX <-- Almacena la funccion y devuelve el valor.
:004013C5 CMP DWORD PTR [ESP+10], 00000000 <-- Compara.
:004013CA JZ 004013F3 <-- Salto Correcto
.

Entonces tenemos el nombre de la proteccion dll (el que ahora vamos a parchear), un valor de DWORD que sabemos que vinieron del dongle y un punto de entrada conveniente para seguir nuestro sondeo. Volveremos a la utilizacion de nuestras teorias que usan un deadlisting. El codigo continua aqui.

:004013F8 PUSH 004051BC <-- "Chequea las Licencias..."
:00401410 CALL Elib.esec_CheckSecurity <-- Otra dll usada.
:00401415 ADD ESP,10 <-- Stack.
:00401418 TEST EAX,EAX <-- EAX>= cero por favor.
:0040141A JGE 00401455 <-- Obviamente correcto.

Puedo recordar la lectura en una guia de puesta en practica de Centinela en la que decia que nunca debe decir a un cracker lo que hace..., aunque el programador parezca usar otro dll para realizar esta comprobacion. Ahora que tenemos nuestras teorias dejan el Cargador y un bpx para 004013BA, entonces traceatemos la 2ª proteccion de dlls exportadas para ver donde estan las instrucciones de ofensa, obviamente el resultado ideal es tambien el prche de este dll por si acaso las llamadas son exportadas en otra parte (aunque yo dude de ello).

Esta es la primera posicion que examinaremos (el desensamblaje de emllib.dll).

:6202A3CC CALL Elib.esec_CheckSecurity <-- Despues de todo esta es la dll.
:6202A3D4 MOV DWORD PTR [EBP-18],EAX <-- Usa el valor de EAX.
:6202A3D7 CMP DWORD PTR [EBP-18],00000000 <-->= 0.
:6202A3DB JNL/JGE 6202A408 <-- Salto correcto.

El CheckSecurity tambien es llamado dentro de elib.dll y debe devolver EAX <= 0 para que una licencia deba existir, tristemente elib.dll mide 5,69 Mb's para desensamblar y a los que pueden ver que el metodo de desensamblaje es por SoftIce. El archivo de tronco del codigo lo arrebate mediante la utilizacion del Symbol Loader.

0137:61499C45 CALL 61499CDE <-- Llama a la maravillosa proteccion.
0137:61499C4A ADD ESP,04 0137
:61499C4D MOV EAX,[EBP-20] <-- Mueve el dato del dongle a EAX.
0137:61499C50 MOV [EBP-24],EAX <-- Almacena @ [EBP-24].
0137:61499C53 CMP DWORD PTR [EBP-24],00 <-- Esto es 0.
0137:61499C57 JZ 61499CA3 <-- Este es un buen salto.
.....
0137:61499C99 MOV EAX,FFFFFFFF <-- Devuelve un mal EAX.
0137:61499C9E JMP 61499CD9 <-- Devuelve la funccion.

El JZ 61499CA3 es evidentemente un salto bueno, los datos DWORD del dongle[EBP - 20] necesita ser 0, sinembargo instucciones subsecuentes afectan el valor de EAX que entonces devolvera FFFFFFFF (-1) por equivocacion. Claramente una opcion sensible es parchear el mal MOV EAX,FFFFFFFF para que resulte MOV EAX,00000000 (B8 00 00 00 00), esto asegura que EAX es devuelto como valor 0 (el correcto), la unica cuestion potencial es en cuanto 61499CDE es llamado, muchos acontecimientos necesitaran la investigacion.

Como esto resulta que 61499CDE es llamdo desde 2 sitios. El que esta encima y que conocemos 6149C2DD. Si chequeamos la 2ª referencia veremos que usa el valor de EAX (almacenando esto en [EBP-14]),0 es el resultado deseado.
Esto significa que al menos para el empleo de un solo usuario devolviendo el MOV EAX, incorrecto que describi antes es bastante. Cmo la opcion de red tambien llama al ChecSecurity el patch resulta efectivo.


1999 CrackZ. 7th February 1999
Traduccion: § Deejay Mihai §

 

www.000webhost.com