Karpoff Spanish Tutor 1999-2001

Programa:

Second Copy 6.0


 

PROTECCION: Serial
Objetivo: Obtener un serial válido.
Descripcion: ?????????
Dificultad: INICIADO
DOWNLOAD: ??????????
Herramientas: Softice
CRACKER: MrRidk   FECHA: 18/11/2001

 

 INTRODUCCION

 Wenassssssssssss !!!, cuanto tiempo sin escribir ni un solo tutorial :). Esta vez vuelvo a la carga con una proteccion que a mi me ha resultado ' curiosa ', pero todo a su tiempo ;-)... Como siempre si tienes alguna duda, mandame un e-mail a: ridk@hotmail.com

 

 AL ATAKE

  

Weno, weno, weno .. pues como ya dije el algoritmo de generacion del serial del programa, es un tanto ' curioso ', y te preguntaras .. pq ?, pues pq para generar el serial, se basa ademas de en el nombre en el propio serial. El serial se divide en 2 partes...

La primera se usa para generar la segunda ... de la siguiente forma ..

Se genera un numero de 4 digitos ( en hexadecimal ). Ese numero ya pasado a string se situa delante del nombre. Y tras hacer un bucle conseguimos el resto del serial .. el cual sera un numero hexadecimal, que dejaremos tal cual se vea .. dividiendolo por la mitad con un '-'. Quedando asi el tipo de serial XXXX-BBBB-BBBB, siendo las XXXX la primera parte y las BBBB-BBBB el resto del serial ( el calculado ). Asi pues para genera el serial, el bucle lo realiza con esos 4 digitos mas el nombre pasado a mayusculas ( XXXX+NombreENMaysucuas).

Bien empezemos con el meollo de la cuestion .. para empezar ejecutamos el programa... y le damos a la opcion de introducir serial .. tras esto nos aparece una ventana pidiendo nombre y key ... Ejecutamos nuestro adorable soft-ice y ponemos los breakpoints reglamentarios ( bpx GetWindowTextA; Bpx GetDlgItemTextA, Bpx HMemcpy ).

En esta ocasion salta el HMemcpy .. asi que damos F12 hasta conseguir entrar en el codigo del programa .. una vez alli vamos traceando a lo largo de un buen numero de ret's, hasta que veamos codigo seguido, es decir sin un ret 5 instrucciones mas para abajo.

Ahora toca tracear con F8, durante un BUEN rato ;-). Buscando lugares donde se acceda a la info del nombre, multiplicaciones .. etc.

Bien el algoritmo tiene tres puntos clave ... el primero se trata de comprobar si los 4 primeros caracteres del serial son 'X' y en tal caso pasarlas a '0'...esto lo hace asi ..


:004A547D 8B45F8 mov eax, dword ptr [ebp-08] // Cogemos caracter
:004A5480 807C18FF58 cmp byte ptr [eax+ebx-01], 58 // Miramos si es 'X' = 58h
:004A5485 750D jne 004A5494 // Sino es saltamos
:004A5487 8D45F8 lea eax, dword ptr [ebp-08]
:004A548A E859ECF5FF call 004040E8
:004A548F C64418FF30 mov [eax+ebx-01], 30 // Pero si es una 'X' ponemos un '0' = 30h


En la 2º parte ... se trata de pasar el nombre a mayusculas .. para ello comprueba si esta en 'a' y 'z' y si es asi la eleva a mayusculas ... Lo hace de esta manera ...


:00408975 8A02 mov al, byte ptr [edx] // Coge caracter
:00408977 3C61 cmp al, 61
:00408979 7206 jb 00408981 // entre 'a' ...
:0040897B 3C7A cmp al, 7A
:0040897D 7702 ja 00408981 // ... y 'z'
:0040897F 2C20 sub al, 20 // de ser asi .. le pasa a mayusculas


Y la tercera parte es la propia de generacion el serial ... y es esta ..


:004A55E5 8A4410FF mov al, byte ptr [eax+edx-01] // Cogemos caracteres
:004A55E9 3C20 cmp al, 20 // Miramos que no sea un espacio en blanco
:004A55EB 750C jne 004A55F9
:004A55ED 648F0500000000 pop dword ptr fs:[00000000]
:004A55F4 83C408 add esp, 00000008
:004A55F7 EB2E jmp 004A5627
:004A55F9 8B55FC mov edx, dword ptr [ebp-04]
:004A55FC 8B4DF4 mov ecx, dword ptr [ebp-0C]
:004A55FF 25FF000000 and eax, 000000FF
:004A5604 F7EB imul ebx // Multiplicamos el valor del caracter por el contenido de ebx ( en principio = 14DAFh )
:004A5606 030520B94C00 add eax, dword ptr [004CB920] // Sumamos ese valor al valor que salio en la pasada anterior del bucle ..
:004A560C 8BD8 mov ebx, eax // Ponemos en ebx el valor que hemos calculado .. para usarlo en la siguiente pasada
:004A560E 33C0 xor eax, eax // Borramos eax
:004A5610 5A pop edx
:004A5611 59 pop ecx
:004A5612 59 pop ecx
:004A5613 648910 mov dword ptr fs:[eax], edx
:004A5616 EB0F jmp 004A5627
:004A5618 E9BFDDF5FF jmp 004033DC
:004A561D BBE7030000 mov ebx, 000003E7
:004A5622 E811E1F5FF call 00403738
:004A5627 FF45F4 inc [ebp-0C]
:004A562A FF4DE8 dec [ebp-18]
:004A562D 75A2 jne 004A55D1 // Si aun no hemos acabdo volvemos arriba.


Weno pues eso era todo .. no es demasiado dificil verda ? ;P

Bien ahora toca elaborar el keygen, usaremos delphi para esta labor ;P. Ahora pensemos .. tenemos 2 opciones .. que los 4 primeros numeros del serial sean fijos.. o bien que sean aleatorios .. Yo voy a usar la 2º opcion ;).

Un posible codigo del serial seria el siguiente ...


function calculanombre(Nombre2 : string) : String;
var
Ebx, Ecx, Esi, Edx,Esi2: Dword;
i: Integer;
Texto : String;
Temp : Integer;
begin
Temp := Random(65535);
Texto := IntToHex(Temp,4)+UPPERCASE(Nombre2);
Esi := $14DAF;
Esi2 := $14DAF;
For I := 1 to Length(Texto) do begin
If Texto[i] <> ' ' then begin
Ebx := Ord(Texto[I]);
Edx := Ebx * Esi;
Ecx := Edx + Esi2;
Esi := Ecx;
end;
end;
Result := IntToHex(Temp,4)+'-'+Copy(IntToHex(Esi,8),1,4)+'-'+Copy(IntToHex(Esi,8),5,4);
end;


Y esto es todo .. no ha sido muy dificil , verdad ? ;-). Como siempre si algo no esta claro o teneis sugerencias, criticas etc .. mandadme un mail a: ridk@hotmail.com

FINALIZANDO

 Weno gente, pues esto es todo por ahora .. un saludo para toda la gente de ECC [Extreme Computing Core].

 

 

Karpoff Spanish Tutor: Pagina dedicada a la divulgacion de informacion en Castellano, sobre Ingenieria Inversa y Programacion. Email "Colabora con tus Proyectos"
www.000webhost.com