ESTUDIO COLECTIVO DE DESPROTECCIONES | ||
WKT Tutorialz Site | ||
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: A lo que el bicho respondio (con una voz que la daba un susto al miedo): Cuando formulé la misma pregunta en modo ôEXPIREDö el muy imbécil respondió: 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:
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:
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).
|
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(
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
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 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(
Con el siguiente trocito de código añadido al parcheador
resolvemos el tema:
.const
.data?
;Abre
;Borra
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]
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...
:0063BE96 FF058C7F6400 inc dword ptr [00647F8C] cambia a: :0063BE96 909090909090 nop nop nop nop nop nop Y eso es todo lo que hace falta. |
ADDENDUM: El caso Win NT |
Por lo general, las protecciones de software no suelen depender de
si el software corre bajo Win9x o NT. Este no es el caso.
Las instrucciones detalladas anteriormente NO desprotegen ESI
bajo NT.
El truco es exactamente el mismo. El contador de usos vuelve a estar
sutilmente camuflado en el registro, pero esta vez en DOS CLAVES:
Pues bien, el proceso se repite. Primero hay que eliminar las
DOS claves SIMULTANEAMENTE y luego anular la
:00488EB8 B1B4
mov cl, B4
Ambos procesos han sido ya explicados con lo que el tema queda zanjado.
MrCrimson
|
Finale |
Y huelga decirlo, a estas alturas, pero: Up The Hammer!
|