El Usuario debe cumplir los siguientes requisitos:
-6 caracteres como mínimo
-letras solo en mayúsculas
-letras entre la "A" a la "K"
Si traceamos un poco notaremos funciones muy importantes dentro del crackme:
Citar
004015A5 |. E8 0AFDFFFF |CALL CrackMe_.004012B4
004012BD |. 83E8 30 SUB EAX,30 ; resta a cada valor de ID 30
004015AA |. 35 4D000000 |XOR EAX,4D ; realiza un XOR 4D con el resultado de la resta anterior
004015AF |. 8981 C8404000 |MOV DWORD PTR DS:[ECX+4040C8],EAX ; mueve el resultado
004012BD |. 83E8 30 SUB EAX,30 ; resta a cada valor de ID 30
004015AA |. 35 4D000000 |XOR EAX,4D ; realiza un XOR 4D con el resultado de la resta anterior
004015AF |. 8981 C8404000 |MOV DWORD PTR DS:[ECX+4040C8],EAX ; mueve el resultado
Esto quiere decir que si introducimos como serial ABCDEF
Ocurrirá lo siguiente:
A B C D E F (Serial introducido)
41 42 43 44 45 46 (Serial en hexadecimal)
Resta a cada valor del ID 30
41-30 42-30 43-30 44-30 45-30 46-30 (Operación)
11 12 13 14 15 16 (Resultado)
Luego realiza un xor con cada valor modificado(- 30) de la ID con 4D
x XOR 4D
XOR 11,4D
XOR 12,4D
XOR 13,4D
XOR 14,4D
XOR 15,4D
XOR 16,4D
Nos dará como resultado lo siguiente:
A B C D E F
5C 5F 5E 59 58 5B
Si seguimos traceando llegaremos a otra función muy interesante:
Citar
004015CB |. E8 F8FCFFFF |CALL CrackMe_.004012C8
004012D1 |. 83F0 4A XOR EAX,4A ; realiza un XOR 4A con el contenido de [ECX+4040C8] (izquierda a derecha)
004015D1 |. 8882 48414000 |MOV BYTE PTR DS:[EDX+404148],AL ; mueve el resultado
*En los comentarios podemos ver que realizará004012D1 |. 83F0 4A XOR EAX,4A ; realiza un XOR 4A con el contenido de [ECX+4040C8] (izquierda a derecha)
004015D1 |. 8882 48414000 |MOV BYTE PTR DS:[EDX+404148],AL ; mueve el resultado
XOR 5C,4A
XOR 5F,4A
XOR 5E,4A
XOR 59,4A
XOR 58,4A
XOR 5B,4A
obtendremos como resultado:
5C 5F 5E 59 58 5B
15 14 13 12 11 4A
Suma todos los caracteres=A9 (15 14 13 12 11 4A)
Suma todos los caracteres=195 (A B C D E F)
(41+42+43+44+45+46)
Fórmula del serial:
Usuario: ABCDEF
Clave: 6566676869706656667-87-1071
-Cada carácter es pasado de hexadecimal a decimal:
ABCDEF:
41=65
42=66
43=67
44=68
45=69
46=70
65 66 67 68 69 70
concatena (strcat) el número de caracteres del USUARIO
65 66 67 68 69 70 6
concatena las tres primeras letras del USUARIO
65 66 67 68 69 70 6 65 66 67
*NOTA: Copia hasta 70 (F) y lo concatena como 07
explicación:
si introducimos como serial DFGHJK el serial hasta lo explicado será de la siguiente manera:
68 70 71 72 74 75 6 68 7
verde=usuario convertido a decimal
naranja=nº de caracteres del usuario
rojo=concatena 68 7 lo lógico sería 68 70 71 pero concatena hasta 70 y no considera el 0 es decir 68 07.
Si el tercer carácter fuese una F quedaría de la siguiente forma:
ABFDEF 656670686970 6 65 66 7
luego concatena A9 en decimal (suma de todas los caracteres modificados, explicado anteriormente)
*Aclaramos que los números hexadecimales menores o iguales a 7 son positivos y mayor o igual a 8 son negativos por lo que A9 es un número negativo
FFFFFFA9 (DWORD)
por lo que quedará en negativo, nunca había visto un serial que utilizara el signo de un número como guiones intermedios.
quedando:
6566676869706656667-87
últimamente concatena FFFFF195 en decimal:
obteniendo:
6566676869706656667-87-1071
NOTA:Si el primer carácter es una F cambia queda de la siguiente manera la fórmula
ID usuario en decimal+último carácter de ID de usuario en decimal+suma de caracteres mod + suma de caracteres.
Gráfico de fórmula general:
00404010 41 42 43 44 45 46 06 41 42 43 A9 95 01
ID......................................|
LEN ID..|
3 Dígitos ID........|
Suma MOD|suma ID|
KEYGEN:
El keygen está hecho en OllyScript tiene un solo error y es que cuando muestra el serial antepone un 0, solo permite 6 caracteres, ni más ni menos (el error y la restricción se debe a que OllyScript no es un lenguaje muy fuerte), una vez mostrado el ID y SERIAL, estos son guardados en un documento .txt (ubicado en el path del mismo crackme) para su fácil copia al crackme
Código
VAR VAR70 VAR VF VAR VALLOC3 VAR LEN_AUX VAR AUX_N VAR AUX_W VAR CONTADORU VAR CONT_FIN VAR AUX_Z VAR VALLOC9_ VAR AUX__2 VAR VALLOC_TAM2 VAR VALLOC_TAM VAR VALLOC___ VAR COMPS VAR CONT4_ VAR AUX_3 VAR AUX_2 VAR CONTMOD VAR VALLOC_ VAR AUX_ VAR AUX VAR AUX2 VAR VALLOC VAR VALLOC VAR CARACTERES VAR RESP PREGUNTA: ASK "Introduzca su ID (en mayúsculas, solo letras de la A a la K, seis caracteres)." MOV RESP,$RESULT CMP RESP,0 JE EXIT EVAL "{RESP}" LEN $RESULT MOV CARACTERES,$RESULT CMP CARACTERES,6 JNE ERROR1 ALLOC 50 MOV VALLOC,$RESULT MOV VALLOC2,VALLOC MOV VALLOC3,VALLOC CMP 0,VALLOC JE ERROR2 EVAL "{RESP}" MOV [VALLOC],$RESULT,CARACTERES BUCLE: MOV AUX2,[VALLOC2],1 CMP AUX2,0 JE CONTINUAR ADD AUX,AUX2 INC VALLOC2 JMP BUCLE CONTINUAR: CMP [VALLOC],46,1 JE CONTINUAR2 MOV [VALLOC2],CARACTERES,1 JMP CONTINUAR2_ CONTINUAR2: ADD VALLOC3,CARACTERES DEC VALLOC3 MOV VALLOC3,[VALLOC3],1 MOV [VALLOC2],VALLOC3,1 MOV VF,1 JMP CONTINUAR3 CONTINUAR2_: INC VALLOC2 MOV [VALLOC2],[VALLOC],3 CONTINUAR3: MOV VALLOC2,VALLOC ALLOC 50 MOV VALLOC_,$RESULT MOV VALLOC_2,VALLOC_ SUB CARACTERES,1 INC VALLOC2 CONTINUAR3_: MOV AUX_,[VALLOC2],1 CMP CONTMOD,CARACTERES JE CONTINUAR4 SUB AUX_,30 XOR AUX_,4D XOR AUX_,4A MOV [VALLOC_],AUX_ INC VALLOC2 INC VALLOC_ INC CONTMOD JMP CONTINUAR3_ CONTINUAR4: MOV [VALLOC_],4A INC CARACTERES CONTINUAR4_: CMP CONT4_,CARACTERES JE CONTINUAR5 MOV AUX_2,[VALLOC_2],1 ADD AUX_3,AUX_2 INC VALLOC_2 INC CONT4_ JMP CONTINUAR4_ CONTINUAR5: ALLOC 50 MOV VALLOC_TAM,$RESULT MOV VALLOC_TAM2,VALLOC_TAM MOV [VALLOC_TAM2],AUX MOV AUX,[VALLOC_TAM2],1 INC VALLOC_TAM2 MOV AUX__2,[VALLOC_TAM2],1 CONTINUAR5_: ALLOC 50 MOV VALLOC___,$RESULT MOV [VALLOC___],#FFFFFF#,6 ADD VALLOC___,3 MOV [VALLOC___],AUX SUB VALLOC___,3 MOV AUX,[VALLOC___] REV AUX MOV AUX,$RESULT ITOA AUX, 10. MOV AUX,$RESULT CONTINUAR6: ALLOC 50 MOV VALLOC9_,$RESULT MOV [VALLOC9_],#FFFFFF#,6 ADD VALLOC9_,3 MOV [VALLOC9_],AUX_3 SUB VALLOC9_,3 MOV AUX_3,[VALLOC9_] REV AUX_3 MOV AUX_3,$RESULT ITOA AUX_3, 10. MOV AUX_3,$RESULT MOV VALLOC2,VALLOC MOV CARACTERES2,CARACTERES CMP VF,1 JE CONTINUAR6_ ADD CARACTERES2,4 JMP CONTINUAR7 CONTINUAR6_: INC CARACTERES2 CONTINUAR7: CMP CONT_FIN,CARACTERES2 JE SALIR_ MOV AUX_Z,[VALLOC2],1 ITOA AUX_Z, 10. MOV AUX_Z,$RESULT EVAL "#{AUX_Z}#" MOV [VALLOC2],$RESULT,1 INC VALLOC2 INC CONT_FIN MOV AUX_Z,0 JMP CONTINUAR7 SALIR_: SUB VALLOC2,2 MOV VAR70,[VALLOC2],1 CMP VAR70,70 JNE SALIR__ MOV [VALLOC2],#07# DEC CARACTERES2 JMP SALIR SALIR__: INC VALLOC2 MOV VAR70,[VALLOC2],1 CMP VAR70,70 JNE SALIR MOV [VALLOC2],#07# SALIR: CMP CARACTERES2,CONTADORU JE SALIR2 MOV AUX_N,[VALLOC],1 ITOA AUX_N MOV AUX_N,$RESULT ADD AUX_W,AUX_N INC CONTADORU INC VALLOC MOV AUX_N,0 JMP SALIR SALIR2: EVAL "Usuario:{RESP} Clave:{AUX_W}{AUX_3}{AUX}{AUX__2}" MSG $RESULT FREE VALLOC FREE VALLOC_ FREE VALLOC_TAM FREE VALLOC___ WRT "Serial.txt", $RESULT MSG "Se ha creado un .txt con el ID y SERIAL en el path del crackme" JMP EXIT ERROR1: MSG "Error:el ID debe ser de seis caracteres!!" JMP PREGUNTA ERROR2: MSG "Error inesperado" EXIT: RET
Comentario:
Primero que todo darles las gracias a cibergolen por compartir tal crackme que debe haberle quitado su buena cantidad de tiempo, considerando que utilizó ASM, también decirle que es bienvenido por todos los usuarios de este subforo, será entretenido contar con su ayuda. También disculparme por la falta de tutorial pero codear el keygen en OllyScript me quitó demasiado tiempo ya que tuve que inventar muchas ideas para poder hacer que OllyScript hiciera lo que yo quisiera.
También decirle a MCKSys Argentina que es un desesperado, le dije que me esperara un poco que estaba haciendo el keygen pero no se aguantó aun espero su tutorial de como injertar una DLL en visualbasic en fin saludos para el y para todos los que se tomaron la molestia de leer este mini tutorial y un saludo para mi.