|
|
 |
ESTUDIO
COLECTIVO DE DESPROTECCIONES
Última Actualizacion:
25/10/2001
|
 |
|
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) |
Tipo de Tutorial |
[X]Original, []Adaptación,
[]Aplicación, []Traducción |
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 |
Grupo |
Whiskey
Kon Tekila |
Fecha |
25 de Agosto de 1999 |
INTRODUCCION |
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: EL ALGORITMO DEL NUMERO 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: TECHFACTS 9x |
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
EXITO |
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.
|
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.
Cabe esperar que los programadores de este invento hubieran
desarrollado otra protección totalmente diferente
bajo NT para desalentar al cracker....? No, no cabe. Demasiado
trabajo. Un poco de maquillaje será suficiente :o).
El truco es exactamente el mismo. El contador de usos vuelve
a estar sutilmente camuflado en el registro, pero esta vez
en DOS CLAVES:
- HKEY_USERS\.DEFAULT\Control Panel\Appearance\Custom
Colours
- HKEY_CURRENT_USER\Software\Word
Magic Software\Word Magic \Tools\Preferences\Dictionary
Access
Los nombres no delatan la finalidad de estos datos que parecen
valores de configuración de la aplicación.
Pues bien, el proceso se repite. Primero hay que
eliminar las DOS claves SIMULTANEAMENTE y luego anular
la
llamada a la funcion encargada de actualizar el conteo:
:00488EB8 B1B4
mov cl, B4
:00488EBA E8859DF7FF
call 00402C44 <----Noppear
:00488EBF FF45EC
inc [ebp-14]
Ambos procesos han sido ya explicados con lo que el tema
queda zanjado.
Gracias a todos por el interés mostrado.
MrCrimson
|
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]
|
[
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
, lee
esto
antes e infórmate
de cómo puedes ayudarnos |
|
|
|
|
|