Karpoff Spanish Tutor 1999-2001

Programa:

LogoManager 1.2.1


 

PROTECCION: Empacado (UPX), Nag, y "DEMO" por tos lados 
Objetivo: Simular Estar Registrados
Descripcion:
??????????
Dificultad: intermedio
DOWNLOAD: http://www.logomanager.uk.com
Herramientas: ProcDump,Sice,W32dasm,Editor Hex. IAT Reconstructor y Regmon (Opcionales)
CRACKER: KIDD   FECHA: 18/11/2001

 

 INTRODUCCION

 

Bienvenidos a mi 5o tutorial (creo).  El prorama víctima de hoy es el Famoso editor de logos y demas tonterías para los nokia "Nokia Logomanager" El programa en si esta curradillo por el hecho de que puede editar imagenes .bmp y te las pasa al formato de logo.  Para enviarte el logo al movil puedes hacerlo por IR o bien por cable, si no tienes nada de eso te tendrás que buscar un amigo con Infrarojos y mandarlo a través de su movil (que también se puede)

La protección de este programa es un tanto chunga, o sea que no voy a explicar cosas básicas p.ej. como cambiar un byte o cosas así.

 

Instalamos el programa y lo ejecutamos... ops!

1.-Hay una nag screen muy "mona" que nos esta tocando los webos cada vez que cargamos el programa.

2.-No nos deja guardar los logos en formato .ngg

3.-Vemos un Unregistered en la parte inferior y en el "about".

4.- En nuestros Logos vemos en la esquina izquierda algo tan molesto como la palabra DEMO recordándonos lo que ya sabéis: A PAGAR! 

 

 AL ATAKE

  

UPX al descubierto

 Bien, el programa está empacado con el UPX 1.01.  Esto se merece una descompresion manual ;)

Primero, tal y como vimos en el Artemis Crackme cambiaremos los flags de las secciones a E0000020 para que SICE salte en el punto de entrada del progama, con cualquier editor PE (procdump, pojemplo).

La mayoría de empacadores (y UPX no es una excepción) usan en sus desempacados las funciónes pushad (60h) en el principio y popad (61h) al final de la rutina de descompresión.  Vamos ahora a buscar donde hay el 61 (popad) más proximo para saber donde se acaba la descompresión y hay el salto hacia el OEP (Original Entry Point).

Abrimos el Programa con el Loader de Soft-Ice y justo en el principio del programa buscamos un POPAD mediante el comando s.

s 4880A1 l ffffff 61 ======>  SICE buscara en ffffff a partir de 4880A1 un 61h

cuando encontramos el popad la ventana de datos se nos irá a la direccion del popad.

desactivamos el breakpoint que teniamos en el bucle y ponemos uno en el popad (:004881F7).  Pulsamos F5 para salir de Soft-Ice y SICE nos rompe de nuevo en :

004881F7    popad    ==>rompe aquí

004881F8    jmp 43A575.    ==> salto al OEP

Una vez estamos en 4881F8 cambiamos el salto a un bucle infinito:

a <intro> => Para editar en ASM

jmp eip <intro> => Crea un bucle infinito

Esc <intro> 

F5  <intro>

Luego abriremos el ProcDump, seleccionamos la tarea (logomanager) con el botón derecho, pulsamos Dump (Full) y le escogemos un nombre(Logomanagerdumped.exe).

Ahora cerramos el logomanager con Kill task de ProcDump y abrimos el Logomanagerdumped.exe con el PE editor del ProcDump, cambiamos el OEP por el auténtico mediante la simple formula:  Entry Point = OEP - Image base

Así queda el Entry point en 3A575.

Parcheando la nag

Esta nag screen se las trae: no queda delatada a través de ninguna  string reference ni pica con los breakpoints más típicos.  Lo único que pude hacer para evitarla es pillarla por los mensajes de windows (Nunca falla ;).  Si no tienes ni idea de como funciona esto de los mensajes te recomiendo que leas el tuto que hizo Dek_OiN sobre las nags donde se explica BIEN todo eso de los mensajes de windows.

Abrimos el programa y cuando sale la nag entramos en soft-Ice (Ctrl+D) escribimos task y pulsamos enter.  Entonces nos aparecerá una lista con todos los procesos activos en este momento.  Anota entonces como llama al que nos interesa: "logomana".  Justo después pon el comando hwnd logomana y te saldrán todas las ventanas y ventanitas que estan en este momento en logomanager. Tienes que fijarte en las que pone #Dialog en Class_name:  Una de ellas se ven 3 tonterías (Button, Button, Button y Static) y en la otra se ven infinidad de cosas debajo suyo.  Nos centraremos pues en la pequeña (que es la que nos interesa) y nos fijaremos en su handle (en cada ejecucion en handle es diferente) y en el SICE mismo teclearemos:

bsmg <handle> wm_destroy 

salimos del SICE y cerramos la ventana cuando el boton para hacerlo se habilite.  Entonces el SICE peta y pulsamos F12 unas cuantas veces para ir donde el programa llamó a la ejecucuión de esta nag (imaginamos que en la registered no saldrá esta nag), es decir, cuando en la parte inferior del SICE entre el codigo ASM y la ventana donde introduces comandos ponga algo como logomanagerdump!XXXX.

 

:00410A11 A160614400 mov eax, dword ptr [00446160]
:00410A16 68FFFF0000 push 0000FFFF
:00410A1B 85C0 test eax, eax
:00410A1D 6A00 push 00000000
:00410A1F 744F je 00410A70
=> En caso de efectuarse el salto, evitamos la nag
:00410A21 8B4624 mov eax, dword ptr [esi+24]
:00410A24 8B0DD0294500 mov ecx, dword ptr [004529D0]
:00410A2A 6800E54000 push 0040E500
:00410A2F 50 push eax

* Possible Reference to Dialog: DialogID_00A1 
|
:00410A30 68A1000000 push 000000A1
:00410A35 51 push ecx
:00410A36 E875090200 call 004313B0
=> llama a la nag
:00410A3B 83C418 add esp, 00000018
:00410A3E 48 dec eax
:00410A3F 741A je 00410A5B
:00410A41 83E802 sub eax, 00000002
:00410A44 7544 jne 00410A8A
:00410A46 8B5624 mov edx, dword ptr [esi+24]
:00410A49 6A01 push 00000001

* Possible StringData Ref from Code Obj ->"Registering/Order.html"
=> Sea lo que sea, no puede ser bueno...
|
:00410A4B 68786D4400 push 00446D78

 

Nos tenemos que centrar en la parte del salto que viene determinado por el valor de eax (que se ha inicializado en :00410A11) asi pues, se ve claramente que dependiendo del contenido que hay en [00446160] el salto se efectuará o no .  Esto se puede hacer con SICE poniendo un bpx en :00410A11 y entonces d 00446160 para que en la ventana de datos se muestre el valor que contiene (1).  Si en W32Dasm miramos en la misma dirección podemos ver que el valor sigue siendo 1, o sea que si cambiamos este 1 por un 0 mediante un editor hexadecimal la nag no aparecerá....

Coño! Sin saber como el valor 01 se ha restaurado en la dirección 00446160!  Vamos a machacarlo*: Ejecutamos el Loader del SICE y abrimos logomanagerdumped.  Cuando SICE nos pete al principio del programa ponemos lo siguiente:

bpm 00446160 w para que SICE nos avise cuando se sobreescriba encima de esta dirección.

Cuando Soft-Ice nos peta en nuestras narices nos encontramos en estas líneas:

:0040C3DB 33C0 xor eax, eax
:0040C3DD 3BF3 cmp esi, ebx
:0040C3DF 0F94C0 sete al
=> esto ha puesto un 1 a eax
:0040C3E2 A360614400 mov dword ptr [00446160], eax => coloca el 1 en 446160
:0040C3E7 8B44241C mov eax, dword ptr [esp+1C] => Caemos aquí
:0040C3EB 50 push eax
:0040C3EC 8B08 mov ecx, dword ptr [eax]

Para evitar esto lo único que debemos hacer es invertir el sete (0F94C0) a setne (0F95C0). Ahora sí...... NAG MUERTA! 

*Lo más fácil para evitar la nag screen sería cambiar el salto pero es mejor cambiar variables ya que puede que la misma variable se use para diferentes comprovaciones

Unregistered?

En la parte inferior de la ventana vemos el mítico texto "Unregistered". Esta parte no es excesivamente difícil ya que solamente tenemos que abrir nuestro programa desempakado con un desensamblador y buscar la stringReference* "Unregistered".  Encontramos repetida 2 veces esa string pero se ve claramente que la primera no nos interesa para nada.  Centremonos pues, en la segunda:

*si no te salen ni imported functions ni String References en tu listado muerto usa programas del tipo IAT Reconstructor (Thnx Meta).

:00411B8F A100C04500 mov eax, dword ptr [0045C000] => Variable que determina si se muestra "Unregistered"
:00411B94 85C0 test eax, eax => Si eax (valor de 45C000) es 0 la flag Z se activa.
:00411B96 B8BC244500 mov eax, 004524BC
:00411B9B 7505 jne 00411BA2
=> Salto que determina si se muestra o no la palabra unregistered (si la flag Zero NO está activada salta)

* Possible StringData Ref from Code Obj ->"Unregistered"
|
:00411B9D B870704400 mov eax, 00447070 

 

Vamos a hacer lo mismo que antes para saber qué se halla en la dirección :0045C000 aunque podríamos hacerlo también mirando nuestro listado muerto o con una simple deducción y un poco de ASM:

Corremos el programa con un bpx en 00411b8f y cuando el SICE nos pete en las narices miramos el valor de 45C000 mediante d 45C000 y vemos que hay un fantástico 00 que si lo cambiamos (mediante un editor hexadecimal) por un 01 evitará que se muestre el "Unregistered" y algunas cosillas más.  Alguno de vosotros podría pensar:¿Y porqué no cambiamos el salto y listos? La respuesta es sencilla:si sólo cambiamos el salto evitamos que se muestre el "Unregistered" pero, por ejemplo, el programa sigue sin dejarnos grabar logos en formato .ngg  

 

Si miramos en el about veremos que se sigue mostrando la famosa palabra.  La manera más sencilla de evitar esto es buscar la cadena Unregistered en ASCII dentro del ejecutable (en Unicode) y cambiarlo por lo que se os antoje pero sin pasaros del numero de letras que tiene la palabra Unregistered.  Yo cambié

U.n.r.e.g.i.s.t.e.r.e.d.

por

^.^.K.i.d.d.^.^. .E.C.C.

Esto sería el procedimiento "cutre" para olvidarte de la palabra "Unregistered" pero si realmente quieres que el programa te reaccione como si estuvieses registrado realmente suda de esta sección y espera a después (sección Rizando el rizo) donde veras más bien como funciona eso.

 

DEMO

Lo más difícil de esta protección llega ahora.  El modo que usaremos para quitar del medio la palabra DEMO digamos que es "diferente" a lo común.

Primero busqué la palabra DEMO como un loco En todas la String References y toda búsqueda fue en vano.  Luego con un editor de recursos miré a ver si se trataba de un bitmap que se colocaba o no en función de si uno estaba registrado o no pero nada de esto....

Para empezar abriremos el logomanager y guardaremos un logo vacío (sólo con la palabra obligada) con nombre xxx.nlm .  Una vez guardado lo abriremos con un editor hexadecimal (yo uso hex workshop) y miramos su contenido

 

 

Vemos que casi todo son ceros excepto al principio, el tipo de archivo (NLM) y los bytes CEA4.....A8EA.....ACAA....A8AA.....CEA4.  Estos bytes, pues son los que traducidos a logo muestran la palabra DEMO, pillas? así pues buscaremos estos bytes en el ejecutable ya que para insertarlos en los logos tiene que conocer estas posiciones.

Si buscamos en el ejecutable desempacado el la cadena CEA4 vemos que solo hay 2 entradas. Estaremos en el buen camino? SI!ahora miramos el offset en que se encuentra el primer CEA4 y vemos que esta en el offset  472BCh ahora podemos mirar que dirección del programa corresponde a ese offset (eso se puede hacer con el W32Dasm o con progs como el KrackPE) y vemos que es la dirección 447CBC. 

Así pues ya sabemos lo que hay que hacer:

bpm 447cbc r para poner un breakpoint cuando se lea lo que hay en dicha dirección.

y arrancar el programa, pintar algo y......POP!

:00417513 8808 mov byte ptr [eax], cl
:00417515 A12CA04500 mov eax, dword ptr [0045A02C]
=>Valor determinante de la escritura de "DEMO"
:0041751A 85C0 test eax, eax
:0041751C 7543 jne 00417561
=> Salto determinante
:0041751E 33C9 xor ecx, ecx
:00417520 B8BD7C4400 mov eax, 00447CBD

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041755F(C)
|
:00417525 8B561C mov edx, dword ptr [esi+1C]
:00417528 8BBE60010000 mov edi, dword ptr [esi+00000160]
:0041752E 83C203 add edx, 00000003
:00417531 8A58FF mov bl, byte ptr [eax-01]
=> eax-01 contiene el principio de "DEMO" y lo pasa a bl
:00417534 83E2FC and edx, FFFFFFFC => Caemos aquí
:00417537 83C002 add eax, 00000002
:0041753A 0FAFD1 imul edx, ecx
:00417540 8B561C mov edx, dword ptr [esi+1C]
:00417543 83C203 add edx, 00000003
:00417546 8A58FE mov bl, byte ptr [eax-02]
:00417549 83E2FC and edx, FFFFFFFC
:0041754C 8BBE60010000 mov edi, dword ptr [esi+00000160]
:00417552 0FAFD1 imul edx, ecx
:00417555 41 inc ecx
:00417556 3DC97C4400 cmp eax, 00447CC9
:0041755B 885C3A01 mov byte ptr [edx+edi+01], bl
:0041755F 7CC4 jl 00417525
=> Si todavía no ha acabado de copiarlo todo vuelve "parriba"

En 00417515 miramos el valor de [0045a02c] y vemos que es un 0 seguramente cambiandolo por un 1 se aclarará la cosa.... Pues NO! Este Mike Bradley se lo ha currado más y ha puesto comprobaciones suplementarias que vienen dadas por variables distintas.......

ZENNNNN.......ZENNNNN..... Pensemos un poquito en vez de ir como locos al código: si nosotros intentamos borrar el DEMO y se vuelve a escribir EN EL MISMO SITIO, que podemos hacer para enganchar al programa mientras escribe en la pantalla? La solución está en 

:0041753D 881C3A mov byte ptr [edx+edi], bl => Escribe bl en la pantalla

Para pillar al programa escribiendo miramos que hay en la dirección [edx+edi] (En cada ejecución la dirección varia) y le ponemos un bpm en escritura (bpm 81BE0B2C w) entonces vemos que SICE nos peta en diferentes lados, Uno en el mismo sitio de antes...pulsamos F5 y SICE nos vuelve a petar y vamos analizando mediante backtrace a ver que variables hay que ir cambiando, el problema es, si a cada inicio de sesión el programa corrige esos bytes si los hemos modificado, como podemos pillalo en bragas? Pues muy facil, con un bpm de escritura en alguna de estas direcciones que aunque cambiemos con el editor hexadecimal el prog. restaura.  Probemos con bpm 0045A02C w y veremos que ahí se no s hace la luz:

:00428957 8BC7 mov eax, edi

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

:00428959 3BC3 cmp eax, ebx => ebx contiene 0
:0042895B A32CA04500 mov dword ptr [0045A02C], eax => Pasa eax a una variable determinante
:00428960 7421 je 00428983 => según lo que había en eax continua el proceso de registro
:00428962 B901000000 mov ecx, 00000001 => (Sobran explicaciones)
:00428967 891D60614400 mov dword ptr [00446160], ebx => Pasa ebx (0) a una variable determinante
:0042896D 3BC1 cmp eax, ecx => El prog se asegura otra vez de lo que hay en eax
:0042896F 890D0C864500 mov dword ptr [0045860C], ecx => Pasa ecx a una variable determinante
:00428975 890D00C04500 mov dword ptr [0045C000], ecx => Pasa ecx a una variable determinante (te suena esa dirección?, mira más arriba del tutorial)
:0042897B 7406 je 00428983
:0042897D 891DD8294500 mov dword ptr [004529D8], ebx

Vemos que aqui se les asigna valor a unas cuantas variables (algunas de ellas ya las hemos tratado pero ez iguá) y podemos trastear un poquito para que este código juegue a nuestro favor modificando la linea anterior 

:00428957 8BC7 mov eax, edi

por

:00428957 B001 mov al, 01

Así podemos comprovar ( al decir que podemos comprobar me refiero a que lo comprovéis por vuestra cuenta y entendáis el porque y no que sudéis de mirarlo más) que las variables se van asignando ellas solitas al numero correcto.

Alguien puede estar pensando:-Y porque me he matado a sacar lo de Unregistered si con esto ya se solucionaba? La respuesta es: Porque hasta el final del tuto no me percaté de que había un sitio donde se solucionaba este problema y además aki se va a aprender a hacer cosas y no a robar programas, si no quieres trabajo bajate el keyfile de porahí, te registras con tu nombre y listo!

Rizando el rizo

Una vez sacada la palabra DEMO del medio ya no nos queda ningún símbolo de Unregistered pero.... cuando cargamos el programa nos sale la nag de usuario registrado pero no sale ningún nombre.... Habéis oído hablar de un programa llamado Regmon (http://www.sysinternals.com)? Espero que sí porque ahora lo vamos a usar para averiguar donde se gurda el nombre de usuario.

El proceso es sencillo y el programa más. La cuestión es abrir el Regmon (con filtros si sabéis y si no no pasha nada) y luego abrir el logomanager y checkear las cosas que busca el prog en el registro hasta localizar una llamada Username (¬_¬) nos vamos a aquella entrada del registro, doble cilck y se nos abre el regedit.exe o puedes hacerlo también con el regview (pilla mi tutorial de cracking Regview y si te mola, te lo pillas i practicas) y pones tu nombre, sales  

El proceso es sencillo y el programa más. La cuestión es abrir el Regmon (con filtros si sabéis y si no no pasha nada) y luego abrir el logomanager y checkear las cosas que busca el prog en el registro hasta localizar una llamada Username (¬_¬) y otra Password, nos vamos a aquella entrada del registro, doble cilck y se nos abre el regedit.exe o puedes hacerlo también con el regview (pilla mi tutorial de cracking Regview y si te mola, te lo pillas i practicas) y pones tu nombre, y lo que quieras como pwd, sales y  listo!

 

Para que en la pantalla del About no te muestre lo del Unregistered vamos al desensamblado y vemos una string reference que pone "Internet Release - Registered" que se parece mucho a lo que nos salia a nosotros:

* Referenced by a CALL at Address:
|:0040DE68 
|
:0040DD30 56 push esi
:0040DD31 57 push edi
:0040DD32 E839D5FFFF call 0040B270 => Llamada determinante
:0040DD37 85C0 test eax, eax
:0040DD39 744E je 0040DD89
:0040DD3B 8B74240C mov esi, dword ptr [esp+0C]

* Reference To: USER32.USER32.dll, Ord:0000h
|
:0040DD3F 8B3D40234400 mov edi, dword ptr [00442340]

* Possible StringData Ref from Code Obj ->"Internet Release - Registered "
->"to:"
|
:0040DD45 68586B4400 push 00446B58

 

Miramos en :0040DD32 y encontramos 

* Referenced by a CALL at Addresses:
|:0040DD32 , :0040F955 , :00410C79 
|
:0040B270 B894140000 mov eax, 00001494

...

Como vemos que se llama tres veces a esta dirección vamos a currarnos una modificación valida para las tres: Vamos a ponerle un parche para que siempre devuelva un 1.  El sistema es fácil: Cambias la dirección 0040b270 por mov al,01 seguido de un ret: B0 01 C3 y yasta!

PROGRAMA CRACKEADO.

Nota Final: Ahora te tienes que currar un loader o un inline patching que yo, por supuesto no te voy a explicar porque me duelen las manos de tanto escribir.

FINALIZANDO

Bueno, hemos visto que este programa tenía una protección un bastante "abrupta" (para mi muy abrupta) pero, sin embargo hemos podido petarla sin tener puta idea de keyfiles.  Esto ha sido la proteción más chunga que he conseguido petar hasta el momento pero continuaremos trabajando.

Básicamente ha sido un tutorial chapuza pero que nos muestra muchas cositas distintas: como petar una nag (sea cual sea), editar texto en ASCII..... que nos pueden ayudar en otros casos.  Espero que hayáis disfrutado tanto como yo al crackear este programa que, por cierto, me merece un aplauso acerca de su protección.  Ya sabéis, dudas, suggerencias, erratas, lo que queráis: kiddcrack @ hotmail . com. 

Quiero agradecer/saludar a toda la peña se curra tutoriales INTERESANTES  y que se esfuerza para que los newbies podamos aprender.

Deseo mandar un saludo a toda la peña de #crackers del IRC, desde los más newbies a los más jefes.

Un saludo también a todo ECC!!!

 

Aviso Legal: El contenido expuesto en este site es sólo y únicamente para uso educativo. ECC no se hace responsable del mal uso que se le puedan dar a los documentos y/o herramientas que se exponen en este site.

 

 

 

Karpoff Spanish Tutor: Pagina dedicada a la divulgacion de informacion en Castellano, sobre Ingenieria Inversa y Programacion. Email "Colabora con tus Proyectos"
www.000webhost.com