Podeis hecharme una mano??

Iniciado por aguml, 19 Enero 2007, 18:34 PM

0 Miembros y 1 Visitante están viendo este tema.

aguml

Pues estoy intentando ver como hago para sacar el serial para el nombre que ponga en el crackme que viene con la primera parte del tuto de ricardo narvaja y se donde se cocina todo y que es lo que hace pero no se que tengo que hacer para conseguir mi serial correcto. Aqui os pongo unas capturas y os voy explicando lo que he averiguado:

Aqui suma el valor hexadecimal de cada letra pasada a mayusculas anteriormente.



Aqui hace XOR entre la suma total que hizo anteriormente con todas las letras y el numero hexadecimal 5678 y este resultado lo guarda para comparar (en mi caso puse AGUSTIN y el resultado total es 5463)



Aqui hace operaciones de sumas, restas y multiplicaciones con los numeros del serial y se que es lo que hace exactamente pero no se como aplicar lo que se para que me de un valor igual al que dan las letras para que la comparacion se cumpla y mi serial sea correcto (use como serial el 080876 y el resultado que me da es 129D8).



Lo facil seria o bien cambiar el JE de la siguiente imagen por un JMP para que salte siempre y me de como valida la contraseña que sea o bien cambiando la comparacion a CMP EAX, EAX o CMP EBX, EBX pero yo quiero sacar el serial para aprender mas y no quiero la opcion facil.



¿podeis explicarme como se sacaria en este caso?

frankener1986

#1
Hola, le metí mano a ese crackme justito ayer, que casualidad :P, a ver si consigo ayudarte..

Como creo que ya pudiste comprobar, este crackme, genera un codigo a base del nombre introducido y otro a base del serial introducido, los compara y si no son iguales salta y saca el cartelito diciendote que has fallado.

Bueno, para llegar ahi yo puse un bp en MessageBoxA, cuando llegue ahi, al igual que tu, vi dos calls, la 1º para el nombre (40122D) y la 2º donde hace operaciones con el serial (401238).

En la primera call, pasa el nombre a mayusculas, y vemos otras operaciones.. llama a una call para hacer otras operaciones.. y luego un XOR EDI, 5678h, vale, y con esto genera un codigo.

Supongo que el problema lo tuviste aqui, las operaciones con el serial??, no es mas que un XOR SERIAL, 1234h...
Así que deducimos que nuestro serial si no fuese por este xor, deberia ser igual que el codigo que salio generado del nombre en la 1º call, por lo tanto, como hacer dos xor al serial es como no hacerle nada, el serial que deberemos introducir es el codigo que nos genero la 1º call XOReado a 1234 y pasado a decimal... no se si me he explicado bien, aqui te dejo el ASM que utilize para mi keygen...
No le puse muchos comentarios, si no entiendes alguna parte dimelo:

__asm {
PUSH ESP
MOV ESI, DATA /// METEMOS EL VALOR DEL USERNAME
PUSH ESI
J04:
MOV AL, BYTE PTR DS: [ESI]
TEST AL, AL
JE J01
CMP AL, 41h // Debe ser de la A-Z
JB J02
CMP AL, 5Ah
JNB J03
INC ESI
JMP J04
J03:
SUB AL, 20h
MOV BYTE PTR DS:[ESI], AL
INC ESI
JMP J04
J01:
POP ESI
XOR EDI, EDI
XOR EBX, EBX
J05:
MOV BL, BYTE PTR DS:[ESI]
TEST BL, BL
JE JS01
ADD EDI, EBX
INC ESI
JMP J05
JS01:
XOR EDI, 5678h // Xor 1º call
MOV EAX, EDI
J02:
XOR EAX, 1234h // Xor 2º call inversa pa comprobacion del serial; 2 xor a un mismo numero no lo altera
MOV SERIAL, EAX /// AKI GUARDA EL SERIAL
POP ESP
}


Username: FreeSoul
Serial: 17961

aguml

#2
Pues no entiendo nada de como llegas a la deduccion de que el serial es el resultado del codigo que sale con las operaciones del nombre xoreado a 1234 pero la verdad es que lo he probado y ha funcionado. ¿me puedes explicar mejor como llegas a esa deduccion si para conseguir el codigo del serial el programa hace unas pocas de sumas, restas y multiplicaciones y ademas el xoreo y en el nombre solo suma los valores de las letras? esque soy nuevo en esto y no comprendo donde esta la relacion.
Con tu deduccion me sale que:
Nombre: AGUSTIN
Serial: 18007
...y funciona perfecto.

frankener1986

Mira, todo esto lo he sacado de las dos calls que te he dicho arriba,
el XOR por 1234h está en la segunda call... puedes ver un resumen de todo esto en el código ASM que te he dejado justo arriba :P, ve intentando verle la relacion, al fin y al cabo he copiado y pegado los trozos de codigo de ambas partes, solo he cambaido la direccion de los saltos, y poco mas, si quieres ver lo que vale cada cosa mientras se hacen operaciones, es tan simple como mirar los valores de los registros y el stack, y si quieres ver lo que hay en una direccion de memoria, ve a la ventanita de dump, click derecho, go to expresion, pones la direccion y ves lo que vale,... ^^

Ch@CaL

Es mas facil de lo que parece a mi me costo bastante averiguarlo y cuando lo descubri pense soy gilipollas!!jajaja la clave esta en que tu a cualquier serial que metes le haces una operacion XOR 00001234 y esta se produce en la direccion 004013f5 xo la direccion que nos interesa es la 00401241 que compara EAX,EBX(serial XOR 1234) x lo tanto si le haces un XOR 1234 a EAX en esta direccion te dara el serial bueno x ejemplo para tu nombre AGUSTIN el serial seria 18007
Ch@CaL

aguml

si, pero lo que sigo sin entender es porque hace eso de multiplicar el numero una y otra vez uno a uno contra el resultado del anterior. Lo de la resta ya lo entendi que era para pasarlo a decimal pero eso sigo sin entenderlo y no entiendo que mi numero de serie sea igual al que me de el nombre xoreandolo por 1234 porque en el nombre lo unico que hace es sumar lo que vale cada letra y en los numeros hay multiplicaciones y eso es lo que no entiendo.