Karpoff Spanish Tutor 1999-2001

Programa:

Todos los de Software by Designe Parte II


 

PROTECCION:

Serial y Límite de Tiempo

Objetivo:

Encontrar un serial y hacer un Keygen

Descripcion:

Bonitas utilidades, aunque específicas.

Dificultad:

Aficionado.

DOWNLOAD:

http://www.gregorybraun.com

Herramientas:

TRW2000, W32DASM, OllyDebug, Calculadora de Windows

CRACKER:

ByTESCRK

  FECHA:

14/09/2001

 INTRODUCCION

Pues en este tutorial, lo que veremos será ver como se genera nuestro serial, realmente será ver la parte del código que nos interesa, de este mismo autor hay un total de 17 aplicaciones cada una genera un serial para nuestro nombre distinto todo ello proviniendo de nuestro nombre y empresa con que nos registremos, los precios de cada uno oscilan entre los $25.00, yo en lo personal no utilizo ninguno, mas que de vez en cuando, la pura verdad, la protección de estos programas es bastante vaga. Haciendo memoria en mi primer tutorial definía la manera de encontrar un serial válido para nuestro nombre, en ese tiempo aún no comprendía muy bien como funcionan las cosas en este ambiente, aunque no he avanzado mucho, aqui les entrego esta nueva producción.

 AL ATAKE

Antes que nada debo decirles, que, nuestro serial se forma por dos cadenas de texto, es decir, nuestro nombre y la empresa, pero tambien debemos tomar en cuenta otras dos cadenas de caracteres como palabras clave.

Es decir tendremos esto:

Strg1 = CadenaClave1
Strg2 = CadenaClave2
Nombre = NuestroNombre
Empresa = CualquierCosa
Serial = NuestroSerialInválido

Una vez hayamos descargado nuestro programa (en mi caso he seleccionado el nuevo BlowFish v2.2), instalo el nuevo programa y me voy a Help > Register... he ingreso mis datos

Nombre = ByTESCRK
Empresa = Registered
Serial = 123456


Salta un hermoso mensaje que dice:

An invalid software registration number was detected.

Iniciamos primeramente el W32DASM y desensamblamos el programa BlowFish.exe, cuando este ya ha desensamblado, buscamos en las Strings Reference de W32DASM y vemos que no hay ninguna cadena que nos identifique el mensaje de error, tomando en cuenta el primer tutorial sabemos que esta es un GetDlgItemTextA, entonces cerramos el programa y cargamos nuestro TRW2000, buscamos el programa y hacemos clic en Load, cuando salta el TRW2000 presionamos Ctrl+N y esperamos a que cargue el programa, luego, ingresamos nuestros datos nuevamente, antes de hacer clic en OK, presionamos Ctrl+N y volvemos a TRW2000, ponemos un punto de ruptura en GetDlgItemTextA y volvemos al programa con Ctrl+N, hacemos clic en OK y salta el TRW2000, vemos que caemos en una llamada a Kernel presionamos F12 hasta que quedemos en BlowFish

* Referenced by a CALL at Addresses:
|:00408A12 , :00408A20 , :00408A32
|
...
...
...

* Reference To: USER32.GetDlgItemTextA, Ord:0104h
|
:0041069B FF1500924100     Call dword ptr [00419200]
:004106A1 5F                          pop edi
:004106A2 5E                          pop esi
:004106A3 B801000000          mov eax, 00000001
:004106A8 5B                          pop ebx
:004106A9 C3                          ret    
<-- Caemos aqui y volvemos a 00408A12

Primero, quitamos el punto de ruptura con la instrucción BC * al ir traceando vamos a llegar hasta aqui,

:00408A42 8BD8                  mov ebx, eax
:00408A44 E8B77B0000      call 00410600 <-- Vamos a investigar aqui, entramos con F8
:00408A49 83C438               add esp, 00000038
:00408A4C 3D92A71901     cmp eax, 0119A792
:00408A51 7518                    jne 00408A6B


En mi caso para entrar en la llamada voy a cargar el OllyDebugger "un muy buen programa en ambiente gráfico" y voy a cargar el programa blowfish.exe en el. Ya cargado y con el código listo para ser roto, presiono F9 para que el programa cargue y voy a ingresar mis datos, antes de hacer clic en OK, selecciono el Olly, presiono Ctrl+G y voy a 00410600, pongo un punto de ruptura presionando la tecla F2 una vez y listo, y cuando hago clic en OK se pausa el programa y me devuelve al BPX que coloqué, presiono F9 nuevamente y me da el error de serial no válido, presiono OK y hago clic en OK nuevamente, selecciono el Olly y voy traceando en el con F7 y voy viendo lo siguiente:

:00410600 51                                      push ecx
:00410601 53                                      push ebx
:00410602 8B5C240C                        mov ebx, dword ptr [esp+0C]     <-- EBX recibe mi nombre
...
...
...
:00410624 BE70ED4100                    mov esi, 0041ED70     <-- Aqui aparece una cadena clave
:00410629 BF01000000                     mov edi, 00000001
:0041062E 2BF3                                 sub esi, ebx
:00410630 8BCB                                mov ecx, ebx
:00410632 2BFB                                 sub edi, ebx

En la siguiente instrucción extraemos caracter por caracter de la primer palabra clave y tomamos su valor Hexadecimal, este es almacenado en EBX

:00410634 0FBE1C0E      movsx ebx, byte ptr [esi+ecx]

Lo mismo que el anterior sin embargo, es sobre la segunda palabra clave, EAX=8 que representa la longitud de caracteres de nuestro nombre; EDX va aumentando uno de acuerdo a cada vez que se realiza el ciclo y 0041ED38 alberga nuestra segunda cadena clave

:00410638 0FBEAC1038ED4100      movsx ebp, byte ptr [eax+edx+0041ED38]
:00410640 0FAFDD                           imul ebx, ebp    <-- Multiplica ebx por ebp en hexa
:00410643 8D2C0F                            lea ebp, dword ptr [edi+ecx]     <-- Suma 1 en cada ciclo
:00410646 0FAFDD                           imul ebx, ebp     <-- Multiplica nuevamente los valores
:00410649 0FBE29                             movsx ebp, byte ptr [ecx]   <-- Extrae un caracter del nombre
:0041064C 0FAFDD                          imul ebx, ebp    <-- Multiplica nuevamente los valores
:0041064F 8B6C2410                        mov ebp, dword ptr [esp+10]    <-- Recupera el acumulado
:00410653 03EB                                 add ebp, ebx   <-- Suma el valor actual y el acumulado
:00410655 42                                      inc edx    <-- Incrementa EDX en 1
:00410656 41                                      inc ecx    <-- Incremente ECX en 1
:00410657 3BD0                                 cmp edx, eax    <-- Compara EDX > EAX
:00410659 896C2410                         mov dword ptr [esp+10], ebp    <-- Guarda el acumulado
:0041065D 7CD5                                jl 00410634<-- Si EDX es menor que EAX vuelve a 00410634

Al salir EAX tendrá nuestro serial en HEXA si y solo si ya se ha realizado el proceso anterior con nuestro nombre de la empresa en mi caso "Registered".

:0041065F 8BC5                                mov eax, ebp   
:00410661 5F                                      pop edi
:00410662 5D                                      pop ebp
:00410663 5E                                      pop esi
:00410664 5B                                      pop ebx
:00410665 59                                      pop ecx
:00410666 C3                                      ret

Ya que tenemos el valor en hexa vamos a seguir traceando ahora con F8 puesto que aqui unicamente se generó el nombre y no se uso la empresa, veamos que nos depara el código, justo lo que me temía, caemos en una nueva instrucción de llamada vean esto...

:00408A74 E8B7750000       call 00410030


Vamos a entrar aqui con F7, nos aparece esto,

:00410030 8B442404              mov eax, dword ptr [esp+04]       <--Recibe nuestro nombre
:00410034 56                          push esi
:00410035 8B3574A04200     mov esi, dword ptr [0042A074]
:0041003B 50nbsp;                 push eax
:0041003C 81CE78030000     or esi, 00000378    <-- ESI igual un valor constante
:00410042 E8B9050000 call 00410600<-- Genera un valor Hexa de nuestro Nombre (devuelve EAX)
:00410047 8B4C2410             mov ecx, dword ptr [esp+10]     <-- Nuestra empresa
:0041004B 03F0                      add esi, eax     <-- ESI = ESI + EAX
:0041004D 51                          push ecx
:0041004E E8AD050000 call 00410600<- Genera un valor Hexa de nuestra empresa(devuelve EAX)
:00410053 83C408                add esp, 00000008
:00410056 03C6                      add eax, esi    <-- EAX obtiene el serial válido en hexa
:00410058 5E                           pop esi
:00410059 C3                           ret


Ahora ya hemos encontrado nuestro serial, hemos localizado la rutina de generación del serial correcto, para transformar el valor del serial válido en hexa debemos hacer uso de nuestra calculadora de windows, aqui les muestro ahora un resumen de la generación del serial válido o de la rutina en sí.@J@ QUE TODAVIA QUEDA ALGO LOS CAMPOS TIENEN UNA LONGITUD DE 49 CARACTERES ASI QUE A PENSAR... QUE PASARA SI SE LES TERMINA LA CADENA DE CARACTERES

RUTINA ESCRITA EN VISUAL BASIC

Public Function Genera(texto As String)
      strg1 = ColoqueAquiLaCadenaUnoYMayor
      strg2 = ColoqueAquiLaCadenaDosYMenor
      long1 = Len(Trim(texto))
      long2 = long1
      suma = 0
      For i = 1 To long1
             extrae = Asc(Mid(strg1, long2, 1))
             If extrae = 32 Then
                    extrae = 0
            End If
             ret = extrae * Asc(Mid(strg2, i, 1))
      ret = ret * i
      ret = ret * Asc(Mid(texto, i, 1))
      long2 = long2 + 1
      suma = suma + ret
Next
Genera = suma
End Function




Cómo siempre y como en cualquier tutorial, recuerden este es únicamente como diversión y con el único ánimo de aprender, no me hago responsable del mal uso que se le dé, recuerden que si les gusta el programa es mejor que lo ¡¡¡REGISTREN!!!.

Saludos a Karpoff, Pr@fesor_X, CaoS ReptantE (sigue no te rindas) y a todos los crackers hispanohablantes, en especial a ti por que has llegado hasta aquí.

Si tienes alguna duda o comentario escríbeme a: ByTESCRK@iespana.es

ByTESCRK

 

 

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