El crackme está implementado como una aplicación para Windows que muestra una caja de diálogo, la verificación de la clave se efectúa en el procedimiento de ventana del dialogo. Justo al principio del procedimiento de ventana se ven dos llamadas a GetDlgItemInt, por lo que inmediatamente se deduce que habrá que introducir dos números enteros en la caja de diálogo, dichos números deberán guardar cierta relación entre sí para ser correctos. Esa relación es la que debemos averiguar. Inmediatamente después de las llamadas a GetDlgItemInt el código empieza a estar ofuscado. Nada complicado que no se pueda arreglar ajustando un poco el código desensamblado con IDA Pro. La ofuscación se limita a insertar un par de saltos condicionales consecutivos e inmediatamente uno o dos bytes basura, los saltos apuntan al código que está después de los bytes basura. Uno de los saltos es siempre JZ y el otro JNZ, ambos apuntando hacia el mismo destino, lo que equivale a insertar un solo salto incondicional, la razón por la que se ha hecho de este modo es la de confundir al desensamblador (a IDA Pro en particular, porque otros desensambladores se confunden incluso con un salto incondicional seguido de basura). Después de dejar el código más o menos legible se puede ver que al valor de uno de los enteros (llamémosle "x") se le suma uno y se le pasa como parámetro a una función que llamaremos f. El valor retornado por f se multiplica por 12 y luego se le suma el duplo del segundo entero (le llamaremos "y"). El resultado se compara con una constante que aparece en el programa (12500) más seis veces "y". En otras palabras, se tiene que cumplir: 12 * f(x + 1) + 2y = 12500 + 6y Simplificando: 12 * f(x + 1) = 12500 + 4y Hay que decir que la operación de sumar x + 1 no se hace de forma directa. Para efectuar la suma se llama a una función que instala un marco de excepciones, se provoca una excepción de división por cero, y al capturar dicha excepción es que se incrementa el valor de x. La función "f" tiene un bucle que se repite 16 veces, y va haciendo operaciones con el número que recibe como parámetro y con otro valor que se inicializa dentro de la función. No voy a entrar en detalles de lo que hace la función porque no es necesario para resolver el crackme, lo único necesario es lograr que la función devuelva un valor mayor que 12500/12 (aprox= 1041). Probando con unos cuantos valores y observando los resultados devueltos, no se tarda mucho en encontrar un número apropiado, en mi caso me quedé con 4000000, ya que f(4000000) = 2000. Por lo tanto: x = 3999999 mientras que 4y = 12 * 2000 - 12500 = 11500 y = 2875 Para acabar diré que el programa tiene otra técnica antidebug, que consiste en una función TLS que enumera los procesos del sistema en busca de alguno que contenga el valor 0x891C478B en la dirección 0x407622. Por cada proceso que cumpla esta característica se incrementa en uno el valor de la constante 12500 (que deja de ser una constante :) ), afectando la validación de la clave. Desde el principio me llamó la atención esa función TLS, pero como no tenía en mi sistema ningún proceso que cumpliera con eso no le dí importancia y seguí adelante., luego mi colega Mario me comentó que su OllyDbg 1.10 sí cumplía con la condición. Estar desactualizado tiene sus ventajas, mi OllyDbg es el 1.09d.