Buenas, perdón por no responder antes, pero decidí estudiar...
Respecto a los retos, aquí pongo la solución para el key31.exe, la del key ya la posteé anteriormente y la del key7, pues todavía no lo trato XD.
Introducción
Como dije anteriormente, esto es solo una guía por si alguien quiere tratar de resolverlo por si solo. Agarramos el crackme, lo pasamos por el peid y dice upx, como en el léeme dice que el objetivo es sacar el serial, no vamos a ser muy extensos en el tema de descompresión. Si abrimos el crackme, vemos que es EXACTAMENTE IGUAL AL ANTERIOR: una ventana feísima y un botón salir (si no lo cambias para la próxima no lo resuelvo
)
Desempacando
Cargamos el Cme en el olly y vemos que para en una instrucción pushad, usamos la función buscar comando en el código desensamblado y ponemos popad, le damos buscar y vemos que llegamos a un popad y justo debajo hay un salto que nos lleva bien lejos anotamos a donde nos lleva ese salto que es el entrypoint, el resto es igual que con todos los otros packers, dumpeamos, buscamos inicio y fin de la IAT, reconstruimos y listo, crackme desempacado (la otra es usar un programa que se cargue el packer, pero estaba aburrido así que le entré a mano)
Análisis (si se puede decir)
Vamos a usar el olly, el smartcheck, y un editor hexa. Lo abrimos con el smartcheck ponemos serial cualquiera (1234567890) clic en salir, se genera el evento en el Sc y cerramos el Cme.
Si miramos en el evento clic vemos que en un comienzo se toma nuestro serial y también vemos un string constante: 197.
Tanto los valores de esa constante como los de mi serial se pasan a los valores hexa que los representan en ASCII.
Después, de eso vemos una función que le hace algo a nuestro serial, pero no sabemos que; entonces procedemos igual que como lo hicimos con el crackme anterior (key), vemos la dirección de la instrucción en SC y nos vamos al olly. Una vez allí, hacemos un goto>expression y ponemos la dirección, traceamos un poco sin entrar en las calls, y vemos un poco después de una llamada a __vbaFreeVarList, que se suma a cada valor ASCII de nuestro serial uno de los valores ASCII correspondientes al 197, justamente de esto se encargaba esa función que no conocíamos en SC: alterna entre uno de esos caracteres que forma el 197 y lo usa como sumando junto con nuestro caracter. Queda así:
197=>Constante
1º caracter en ASCII + 31
2º caracter en ASCII + 39
3º caracter en ASCII + 31
4º caracter en ASCII + 39
5º caracter en ASCII + 31
6º caracter en ASCII + 39
7º caracter en ASCII + 31
8º caracter en ASCII + 39
9º caracter en ASCII + 31
10º caracter en ASCII + 39
Aquí vamos a obtener una combinación de letras.
Voy a ahorrarles trabajo diciéndoles, que lo que se obtiene aquí es lo que se va a comparar con una constante al final de todo, es decir que esta es la rutina que tenemos que invertir para sacar el serial que funciona partiendo de iiajjqepfljnb que es lo que tiene que dar nuestro serial después de pasar por la rutina anterior
Posible dificultad...
Los números se comparan por medio de la función __VbaVarTstEq, y no se muestra la variable con la que se comparan las constantes, esto lo solucionamos como lo veníamos haciendo, tomamos la dirección con el SC, y en la función __VbaVarTstEq traceamos hasta llegar a la instrucción
REPE CMPS WORD PTR ES:[EDI],WORD PTR DS:[ESI]
Esta está dentro del módulo Oleaut32, así que van a tener que tracear entrando en las calls :-S
Si ponemos un BP ahí y vamos tocando F9 vamos a ver que se compara, esto sirve para ver todas las comparaciones porque todas se hacen con __VbaVarTstEq
Calculando Serial
No vamos a encontrar la constante completa, sino que es una combinación de otras dos:
iiajj y qepfljnb, formando iiajjqepfljnb, entonces
(usando un editor hexa escribimos las letras para conocer los correspondientes valores en hexa)
i=69
i=69
a=61
j=6a
j=6a
q=71
e=65
p=70
f=66
l=6c
j=6a
n=6e
b=62
69-31=38=8
69-39=30=0
61-31=30=0
6a-39=31=1
6a-31=39=9
71-39=38=8
65-31=34=4
70-39=37=7
66-31=35=5
6c-39=33=3
6a-31=39=9
6e-39=35=5
62-31=31=1
8001984753951=> Serial!!
Para que mi pérdida de tiempo no sea en vano, voy a poner cuales son las rutinas de generación de otros números, que supongo que son para despistar.
Hay una generación de un segundo número a partir del que obtenemos luego de la rutina anterior. Se usa un numero constante 127 y se hace lo mismo que en la rutina anterior pero al revés.
127=>Constante
1º caracter en ASCII de N1 - 31
2º caracter en ASCII de N1 - 32
3º caracter en ASCII de N1 - 31
4º caracter en ASCII de N1 - 32
5º caracter en ASCII de N1 - 31
6º caracter en ASCII de N1 - 32
7º caracter en ASCII de N1 - 31
8º caracter en ASCII de N1 - 32
9º caracter en ASCII de N1 - 31
10º caracter en ASCII de N1 - 32
Este número aparentemente no se usa para nada... :-S
Después de esto, hay una constante que se compara con un número que se genera a partir de otro numero constante dentro del crackme, y no son iguales, por ende, NUNCA VAN A SER IGUALES (sospecho que este crackme es una modificación del primero...)
658245853514=>Constante
[(658245853514*5)+(658245853514/3)]*9=31595800968672
33 xor 4f = 7c= |
31 xor 4f = 7e= ~
35 xor 4f = 7a= z
39 xor 4f = 76= v
35 xor 4f = 7a= z
38 xor 4f = 77= w
30 xor 4f = 7f= .
30 xor 4f = 7f= .
39 xor 4f = 76= v
36 xor 4f = 79= y
38 xor 4f = 77= w
36 xor 4f = 79= y
37 xor 4f = 78= x
32 xor 4f = 7d= }
Por último Tenemos una comparación de nuestro serial (1234567890) con una cadena de caracteres raros que supongo que es la que hace que largue el cuadro de texto con el mensaje "casi pero no", pero no la probé porque la verdad que no se como escribir esos "cuadraditos"
Bueno, como últimas palabras, voy a pedir encarecidamente que para los próximos que no pongas comparaciones con esas cadenas tan raras :-P. podes hacer más difíciles las cosas pero usa números y letras que conozcamos y no esos caracteres raros
Al parecer el otro crackme esta comprimido con neolite, nunca lo vi, así que supongo que va a ser entretenido
Cualquier duda, error o acotación, posteen
Saludos