ESTUDIO COLECTIVO DE DESPROTECCIONES
WKT Tutorialz Site
WKT
Programa  English-Spanish Interpreter 2000 W95 / W98 / NT 
Descripción  Traducción y lectura de textos. 
Tipo  Demo totalmente funcional. Número limitado de usos (4)
Url  http://ssl.pair.com/magicw
Protección  Serial / Malfuncionamiento una vez superado numero de usos
Dificultad  1) Principiante, 2) Amateur, 3) Aficionado, 4) Profesional, 5) Especialista 
Herramientas  SoftIce v3.25 y TechFacts95
Objetivo  Uso ilimitado
Cracker  MrCrimson/[WkT!99]
Fecha  25 de Agosto de 1999 
Introducción

La primera vez que ejecutamos este software aparece una splash de tintes futuristas que se desvanece para dar paso a un programa totalmente funcional. 
La segunda vez ocurre lo mismo. 
A la tercera ocasión, aparece además una NAG más fea que un pecado que nos recuerda que SÓLO nos quedan 2 usos del programa y nos da a elegir entre teclear un ‘Registration Number’ o proceder en modo ‘Free Demo’. 
Después de insistir en el penoso recordatorio, y una vez agotados los 4 usos volvemos a ejecutar para encontrar una curiosa amenaza: “El programa NO funcionará correctamente  a partir de ahora”.... 
Ñtchs...! Donde habeis estudiado marketing...? Por correspondencia...? NUNCA se debe degradar el producto que se vende. Ni siquiera para protegerlo. Crea mala imagen. 

Pero veamos como se lleva a cabo la amenaza. Durante los 4 primeros usos “DEMO”, pedi la traducción al castellano de: 

“Do you think I am completely stupid?.”

A lo que el bicho respondio (con una voz que la daba un susto al miedo): 

“Piensa usted que soy completamente estúpido?.”

Cuando formulé la misma pregunta en modo “EXPIRED” el muy imbécil respondió: 

“Hace usted lo imposible?.”

Despues de probar algunas frases, comprendi que, sin registrar, generaba las traducciones de forma aleatoria.... 
 

Primer intento: estudio del algoritmo del número de serie

El primer intento, como siempre, es obtener el algoritmo de comprobación del número de serie e invertirlo para generar un keymaker. El algoritmo, en este caso,  es un genuino ejemplo de spaghetti-code que activa, durante la comprobación de validez, un elevadísimo número de flags no binarios que son chequeados durante toda la sesión de uso del software... Ok, no es imposible pero puede llevar muchas, muchas horas trazar toda esta porquería.
Ok Boyz, esto demuestra que al igual que existen cracks de fuerza bruta también se pueden encontrar protecciones de este estilo, donde la falta de originalidad se suple con miles de líneas de código de chequeo redundante (el exe principal tiene 3,4 Mb!!!). Desde el punto de vista del programador será un éxito... aunque ello implique tener que bajarse 20Mb para 4 usos de evaluación.
Es bien sabido que MrCrimson debe atender a diario una infinidad de compromisos amorosos y por ello, la opción más rápida tomó cuerpo definitivamente: Let’s crack!
Segundo Intento: TechFact95

La pregunta de siempre: ¿Cómo sabe esta bestezuela que hemos agotado el número de usos permitidos?. La información al respecto debe haberse almacenado en:
  • El registro
  • Algún fichero INI
  • En algún fichero de la instalación
  • Alguna combinación esoterica de las anteriores
Para saberlo usamos TechFacts95. Que se puede decir de esta joyita que no se haya dicho ya...? Bueno, pues os la recomiendo porque sólo hay una cosa peor que NO tener información y es TENER DEMASIADA. Eso es lo que sucede a menudo con el clasico Regmon, por ejemplo. Trazar TODAS las ocurrencias en el registro durante la ejecución de un programa suele reportar cientos de lecturas/escrituras que dificilmente nos permite ver las cosas con claridad.
TechFact, entre otras muchas cosas genera un informe compacto de cambios en el sistema (INIs, ficheros en general, Registro, etc) ocurridos al ejecutar un programa.
Al aplicarlo a este caso, NO reportó ningúna modificación relevante... nada en el registro, nada en ficheros, nada en INIs...
Era de esperar. Una vez que ha expirado el programa ya no se hace ninguna modificación y por tanto es indetectable el mecanismo de conteo de usos...
Así las cosas volvemos al origen para tener de nuevo el programa recien instalado. Ahora SI monitorizamos con TechFacts los cambios en las sucesivas ejecuciones del programa (las 4 primeras modo ‘demo’ y las sucesivas en modo 'Mal-function’:

1ª ejecución:
se crean algunas entradas en el registro que tienen por nombres cosas como: Custom Colours, Custom Windows, General Settings y cosas por el estilo...
Y algo más...aparece una key llamada:

HKEY_LOCAL_MACHINE\Config\0001\Other Flags

Esta clave contiene mas de 2000 bytes y lo que la hace singular, aparte de ese nombre tan sospechoso, es que NO ESTA en el registro junto con el resto de claves del programa. Al contrario está en una zona en la que NADIE la relacionaria con ESI...(llamadlo Zen si os place).

  • 2ª,3ª y 4ª ejecuciones: En cada ejecución se producen cambios en algunos valores contenidos en ‘Other Flags’
  • 5ª ejecución (primera ilegal): Vuelven a modoficarse los valores de ‘Other Flags’ pero esta vez será la definitiva.
  • 6ª y sucesivas ejecuciones: NO se producen más cambios.
Sea lo que sea está claro que mantiene una relación con el número de usos...!
Primer éxito

Si mis sospechas son ciertas prodriamos 'resetear' el conteo de usos introduciendo en el registro la clave ‘Other Flags’ tal y como era después de la primera ejecución (momento en que se creó). Para esto exporté al principio la clave ‘virgen’ desde el regedit de manera que pudiera volver a introducirla ejecutando el script *.reg
Voilà. Al ejecutar el programa todo parece funcionar EXACTAMENTE igual que la primera vez.
Hasta ha desaparecido el ‘Expired version’ de la cabecera de la ventana. Al preguntar al programa por el status nos dice que nos quedan 4 usos...:o)
Sucesivas ejecuciones reproducen la secuencia explicada al inicio de este tute, de manera que a la quinta vez estamos de nuevo ‘expired’... En este punto podemos tener tantos usos como queramos, eso si, ‘refrescando’ el registro cada cuatro ejecuciones.... :o(
Parece que todo sería perfecto si pudieramos evitar la modificación de los valores en ‘Other Flags’
Manos arriba

Empieza la acción. Hay que buscar la llamada a la función de la API RegQueryValueEx que es la responsable de cargar en memoria el contenido de una clave del registro. Siguiéndole la pista sabremos donde se modifica y podemos EVITARLO. La sintaxis de esta función es como sigue:

LONG RegQueryValueEx(
    HKEY hKey,          // handle of key to query 
    LPTSTR lpValueName, // address of name of value to query 
    LPDWORD lpReserved, // reserved 
    LPDWORD lpType,     // address of buffer for value type 
    LPBYTE lpData,      // address of data buffer 
    LPDWORD lpcbData    // address of data buffer size 
   );

Se suceden muchas llamadas a esta función, aunque después de trazar un poco se hace evidente que las de interés suceden en :

* Reference To: advapi32.RegQueryValueExA, Ord:0000h
                                  |
:0045210A E83150FBFF              Call 00407140
:0045210F 85C0                    test eax, eax
:00452111 742E                    je 00452141
:00488D8D B1B4                    mov cl, B4
:00488D8F E8B09EF7FF              call 00402C44 --> Modificación
:00488D94 FF45EC                  inc [ebp-14]

Para poner un breakpoint a la que nos interesa hacemos:

Bpx 0045210A IF *(*(ESP+4))==6568744F

El segundo argumento de la función, ya en la pila, debe apuntar a “Other Flags”, 6568744f son los codigos ascii de los primeros 4 caracteres invertidos (“ehtO”.)
El valor de la clave leído por RegQueryValueExa es apuntado a la salida por el 5º argumento y en esa posicion de memoria instalamos un BPM [address] W para detectar escritura...

El resultado no es muy sorprendente. El CALL en 488D8F es el responsable de las actualizaciones. Para poder neutralizar este CALL, primero comprobamos que la pila permanece igual despues de la ejecución. A continuación procedemos a escribir un crack que cambie:

:00488D8F E8B09EF7FF              call 00402C44 

 por

:00488D8F 9090909090              nop nop nop nop nop

Hacemos los chequeos de rigor y comprobamos que restaurando el registro al valor original de ‘Other Flags’ y ejecutando esi.exe parcheado como se ha indicado disponemos del programa como si fuera SIEMPRE la primera vez...:o)
 

Ahora todo junto...

La cosa marcha pero debemos arrastrar los 2Kb de datos de ‘Other flags’ como parte del crack???...no es muy elegante. 
Forcemos un poco la máquina. 
La clave se crea en el registro durante la primera ejecución y a partir de ese momento cambia en cada uso. Realmente el estado original no ocurre con la clave virgen sino CON NINGUNA CLAVE en absoluto!.
Probamos borrando la ‘Other flags’.... Yeah! En la primera ejecución se crea una nueva clave que permite 4 usos más. Al haber parcheado la rutina actualizadora (descontadora de usos) esta situacion se mantiene para siempre.
Nuestro crack ahora es infinitamente más manejable: parchear 5 bytes y borrar una clave del registro.
Borrar datos en el registro

Para eliminar claves del registro no son validos los scripts *.reg que usamos para añadirlas. Además pretendemos que el crack este contenido en un UNICO fichero. 
Como eliminamos nuestra ‘Other Flags’...?
Pues con autoexplicada funcion de la API:

LONG RegDeleteKey(
    HKEY hKey,        // handle of open key 
    LPCTSTR lpSubKey  // address of name of subkey to delete 
   );

Con el siguiente trocito de código añadido al parcheador resolvemos el tema:
(crackeamos en winasm32, nooo?)

.const
Clave      db   "Config\0001",0
Flags      db   "Other Flags",0

.data?
Hwndr      dd ?

;Abre
invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,  ;rama
                    offset Clave,        ;clave
                    NULL, 
                    KEY_SET_VALUE,       ;modo apertura
                    offset Hwndr         ;handle de clave abierta

;Borra
invoke RegDeleteValue,Hwndr,             ;handle de clave a borrar 
                      offset Flags       ;nombre de valor a borrar
;Cierra
invoke RegCloseKey,Hwndr                 ;cierra clave abierta 

 Sencillo, ein?
 

Estertores

Una vez concluidos los arreglos anteriormente comentados pasé algun tiempo haciendo pruebas. Todo parecía funcionar correctamente hasta que un amiguete detectó que cada 100 frases traducidas aparecía una ventana recordando que en la version demo ese era precisamente el límite. Esto NO bloqueaba el programa, sólo esperaba confirmación y continuaba funcionando correctamente.
Muy engorroso, el  recordatorio, eso sí..
.
"Un MessageBox...", pensé y busqué el disparador, la comparación que activaba la llamada... No fue facil.
Tenía todo el aspecto de una MessageBox PERO NO LO ERA. Se trataba de una ventana construida a trozos, el icono, el botón, el texto. Todo se añadía paso a paso a lo largo de un proceso muy dificil de detectar en origen. Comparando la secuencia de instrucciones que se ejecutaban cuando se traducía la frase Nº 98 con la correspondiente a la Nº 99 encontramos la bifurcación en:

:0063BE96 FF058C7F6400            inc dword ptr [00647F8C]
:0063BE9C 833D8C7F640064          cmp dword ptr [00647F8C], 00000064
:0063BEA3 0F8C34010000            jl 0063BFDD   <--- bifurca
 

La verdad es que me sorprendió encontrar una comparacion directa con el 100 (64h). Ni siquiera había intentado buscar el literal porque no imaginé un conteo tan transparente en este código de protección celulítica...
Obviamente, en [647F8C] se mantiene la cuenta de frases traducidas que al llegar a 100 bifurca el código para comenzar a montar su ventana a trozos. Como os podreis imaginar, para acabar con esto eliminamos la instrucción de incremento:

:0063BE96 FF058C7F6400            inc dword ptr [00647F8C]

cambia a:

:0063BE96 909090909090            nop nop nop nop nop nop

Y eso es todo lo que hace falta.

Finale
  • Hay otros detalles cosméticos que no afectan a la proteccion ni al funcionamiento del programa y que por tanto no voy a detallar. 
  • Tampoco he quitado la NAG porque en este caso NO forma parte de la protección (no tiene mayor complicación).
  • El presente software se plantea como una suite que en su version demo contiene además otro programa: WordMagic. El razonamiento para desprotegerlo es exactamente el mismo.
  • La suite completa alberga otros programas NO incluidos en la DEMO y por lo tanto no analizados.
Espero que este texto te sirva para ampliar tu repertorio de técnicas.
Y huelga decirlo, a estas alturas, pero:

Si te gusta el programilla de marras, paga los derechos de uso!
el presente tute SOLO pretende poner de manifiesto la inutilidad de este
tipo de protecciones densas. Además, perjudican al usuario hinchando
los ejecutables e  incrementando el tiempo de descarga.

Up The Hammer!
MrCrimson/[WkT!99]