Pues eso, instalemos el Kryptel en nuestro ordenador y ejecutémoslo
como siempre... Aparece la típica pantallita que nos dice que es
una versión de evaluación, que nos quedan 30 días de
prueba y esas cosas. Damos a OK y jugamos un poco con el programilla...
parece útil para esconder ciertas cosillas de los curiosos.
Hacemos lo de siempre, adelantar el reloj dos o tres meses y ver que pasa....
Sale una pantalla que dice que ha caducado y que no quiere volver a funcionar
mientras no le introduzcas un serial válido. Ahora podemos hacer
dos cosas: buscarnos el serial o buscamos la comprobación que le
dice que lo hemos registrado... Personalmente prefiero la segunda porque
es más rápido y deja más tiempo para hacer otras cosillas...
PRIMERA SORPRESA:
Cómo el programa ya ha caducado, volvamos a poner el reloj del ordenador
en hora para evitar problemas con otras aplicaciones. Por curiosidad ejecutamos
otra vez el brw.exe y vemos que aún nos quedan 30 días de
prueba (¿? ...si había caducado...); genial, sólo mira
la fecha y la compara con algo, pero no escribe en ningún sitio que
ha caducado, con sólo cambiar la fecha ya funciona siempre. :-)
SEGUNDA SORPRESA:
Bueno, no puede ser tan fácil... seguro que tiene truco
en algún sitio, así que vamos a desensamblarlo con el WDasm
y ver las SRef para ver que podemos hacer por ahí ( nos interesan
las que dicen "Wrong registration code" (para los que no
sepan inglis pitinglis "Código de registro incorrecto")
y la que dice "The evaluation period has expired" ("El
período de evaluación ha expirado"). Haciendo doble
click sobre ellas aparecemos en el código que transcribo editad o
a continuación:
:00404106 FF1578484100 Call dword ptr [00414878]
:0040410C A17C234100 mov eax, dword ptr [0041237C]
:00404111 390578234100 cmp dword ptr [00412378],
eax
:00404117 7510 jne 00404129<-
¡OOPS! Caliente caliente
:00404119 85C0 test eax, eax
:0040411B 750C jne 00404129<-
¡Otra vez!
:0040411D C6059034410001 mov byte ptr [00413490],
01<-Se parece a un flag...
:00404124 E9D5000000 jmp 004041FE<-
Nunca formará la MessageBoxa si llega hasta aquí ahora.
:00404129 8B0D742B4100 mov
ecx, dword ptr [00412B74] <- Rutina que se ejecuta cuando no estamos
registados
:0040412F 8B155C2B4100 mov edx, dword ptr [00412B5C]
:00404135 3BCA cmp ecx, edx
:00404137 7F6D jg 004041A6 <-
Salta si ecx es mayor que edx (superados los 30 días)
:00404139 A1702B4100 mov eax, dword ptr [00412B70]
:0040413E 7C08 jl 00404148 <-Salto
normal si no ha caducado
:00404140 3B05582B4100 cmp eax, dword ptr [00412B58]
:00404146 775E ja 004041A6 <-
Cuidadín con esta dirección
:00404148 8B1D582B4100 mov ebx, dword ptr [00412B58]
:0040414E 2BD8 sub ebx, eax
:00404150 8BF2 mov esi, edx
:00404152 1BF1 sbb esi, ecx
:00404154 BF92170000 mov edi, 00001792
:00404159 3BF7 cmp esi, edi
:0040415B 7F49 jg 004041A6<-
Salta si esi es mayor que edi ( segunda comprobación de superados
los 30 días por si has superado la primera )
:0040415D 7C08 jl 00404167<-Salto
normal si no ha caducado (pero lleva el flag a 0 -> versión
evaluación)
:0040415F 81FB008064F8 cmp ebx, F8648000
:00404165 773F ja 004041A6 <-
Última comprobación que nos lleva a esta dirección
:00404167 2B05582B4100 sub eax, dword ptr [00412B58]
*************
* Reference To: USER32.PostMessageA, Ord:01B1h
|
:0040419E FF1538474100 Call dword ptr [00414738]
:004041A4 EB58 jmp 004041FE
*************
* Possible Reference to String Resource ID=00570: "The
evaluation period has expired! <-
Aquí está la referencia
Please, register the sof"
*************
:004041D2 683A020000 push 0000023A
* Reference To: USER32.MessageBoxA,
Ord:0195h
:004041F8 FF158C474100 Call dword ptr [0041478C]
Ahora llega el momento de pensar un ratito... sabemos seguro que si se
ejecutan las llamadas a PostMessageA y MessageBoxa no vamos a ningún
lado, así que habrá que buscar hacia arriba algo que le
diga que no vaya a esa dirección o a sus cercanías...
( jn , jnz , jg , jge, ja y similares). Este método es el
típico "de libro", y aparece en muchos programas shareware
y en algunas aplicaciones comerciales (échale un vistazo a la Demo
del Vegas Pro de Sonic Foundry y verás..)
. Creo que no hace falta decir lo que hay que hacer con esos dos
saltos condicionales, así que carga el UltraEdit y cambia esos
75 tan feos por algo más bonito, no sé.. un 90 quizás
(NOP).
Fijaros en la instrucción que aparece señalada en verde
antes del salto incondicional. Lo que hace es poner un uno en esa dirección
de memoria señalando que estamos registrados y que hemos pagado
por el programa, si cambias el 01 por 00 con el SoftIce mira lo que pasa...
A ese tipo de instrucciones es a lo que se le llama flag, y más
o menos funciona como un semáforo 0 = rojo y 1 = verde.. :-)...
La razón de elegir esos puntos para poner nuestro parche es porque
los demás condicionales que hay por debajo son los encargados de
verificar las fechas del ordenador y otra interna del programa (almacenadas
en ecx y edx que da la impresión de que están encriptadas..),
si la primera es mayor salta a 4041A6 y nos deja sin programa, sino continúa
y aún hace dos verificaciones más antes de llevarnos a 4041FE
con el flag puesto a 0 (no estamos registrados). Si hubiésemos
parcheado más abajo en los jg para que nunca saltase a 4041A6 lo
único que habríamos hecho es conseguir que nunca mostrara
la pantalla de caducidad ni dejara de funcionar, pero seguiría
siendo una versión de evaluación.
Ok, ahora con el brw.exe parcheado vamos a ejecutarlo. Ya no aparece
la nag que recuerda que es una versión de evaluación...
y ya no aparece lo de Evaluation Copy en la ventana.... !, vamos al About
y dice que la copia está licenciada a alguien... Como se puede
ver la comprobación de si estamos registrados o no y si la fecha
es correcta o no están juntas y pegaditas a la línea que
nos avisa que ha caducado ...
Bueno, pues sólo nos queda buscar la forma de meter nuestro nombre
en el About. Lo ponemos en el Kryptel.ini y listo, pero visto lo visto,
vamos a echar un vistazo al codigo que nos dice que el serial no es válido:
:004012A2 E87D000000 call 00401324
:004012A7 83C40C add esp, 0000000C
:004012AA 84C0 test al, al
:004012AC 752D jne 004012DB <-Más
de lo mismo
:004012AE 6810200000 push 00002010
* Possible StringData Ref from Data Obj ->"Registration
Error"| <-Caption de la MessageBoxA
:004012B3 682C214100 push 0041212C
* Possible StringData Ref from Data Obj ->"Wrong registration
code." <- El string de marras
:004012B8 68D0204100 push 004120D0
* Referenced by a (U)nconditional or (C)onditional Jump
at Address:
|:0040127C(U)
:004012BD FF7508 push [ebp+08]
* Reference To: USER32.MessageBoxA, Ord:0195h
Sobra decir lo que hay que hacer para que acepte cualquier
cosa que le metas..... Si sigues mirando hacia arriba hay un código
exactamente igual para el nombre.
RESUMIENDO:
Para conseguir que el Kryptel nos reconozca como usuarios
registrados hay que anular los dos saltos condicionales en 404117 y 404124,
y para que nos admita cuaquier serial el que hay en 4010AC convertirlo en
un salto incondicional. Fin de la historia del Kryptel.
REFLEXIONES:
Un software de encriptación que dice ser indescifrable,
por lo menos debería dar algo más de trabajo, al suponerse
que el programador tiene conocimientos suficientes para proteger como Dios
manda su programa. De todas las protecciones que he tratado en el poco tiempo
que llevo en esto, está es la más fácil de cascar con
diferencia.., pero se agradece que aún haya software así para
pasar el tiempo y que los newbies aprendamos... no todo van a ser achivos
PE, VBox y antidebuggers (últimamente las pillo todas juntas ...).
AGRADECIMIENTOS:
A WKT por poner a disposición de todo el mundo el ECD,
a KUT por su Forum, a ArcangeL por ayudarme con el Vbox y a todos los que
ponéis a disposición de los demás vuestro conocimiento...
Próximamente : Protección de Allaire HomeSite
4.5 y creación de un loader con RPP.
|