Estoy jugando un poco con unos crackmes y estoy con uno que no sé resolver. Me explico:
Llego a la rutina que calcula el serial y es como sigue:
Código:
004013C0 /$ 60 PUSHAD
004013C1 |. C1C0 02 ROL EAX,2
004013C4 |. A3 6D314000 MOV DWORD PTR DS:[40316D],EAX
004013C9 |. 05 79740000 ADD EAX,7479
004013CE |. 35 33323100 XOR EAX,313233
004013D3 |. C1E0 06 SHL EAX,6
004013D6 |. A3 72314000 MOV DWORD PTR DS:[403172],EAX
004013DB |. 61 POPAD
Hasta donde entiendo, lo que hace es (en decimal):
Multiplico por 4 (en realidad se añaden al final del número en binario dos ceros lo que es lo mismo que multiplicar por 4)
Le sumo 29.817
Hago un XOR con 3.224.115
Multiplico por 64 (técnicamente no es esto pero el resultado que obtengo es el mismo, no?)
Cuando acaba la rutina, lo compara con 3.272.071.856 y en función de eso decide si es válido o no. Por lo que entiendo, la solución a este problema es:
Código:
x = {XOR [(3.272.071.856/64) , 3.224.115] - 29.817}/4
El resultado que obtengo de esto es 13.577.784 (o 13.577.783 si hago las operaciones en hexadecimal). En cualquier caso cuando introduzco el serial, el resultado después de las operaciones el 3.272.071.691.
Haciendo todas las operaciones en hexadecimal el número con el que se compara es el C307DA80 y el que obtengo usando mi serial C307DA0B, siendo la diferencia entre estos dos números en hexadecimal de 75 (117 en decimal), que es distinto de la diferencia si hago todos los cálculos en decimal.
No tengo muy claro el porqué de esto y quería saber si alguien me lo podría explicar.
Un saludo