Karpoff Spanish Tutor 1999-2002

Programa:

Source Insight v3.1


 

PROTECCION: Name / Serial, Limitacion de Tiempo
Objetivo: Extraer el serial
Descripcion: Un bello programa para escribir otros programas en código fuente con resaltado de sintaxis. Sencillamente me encanta.
Dificultad: Novato
DOWNLOAD: http://www.sourceinsight.com
Herramientas: TRW2000 W32dasm file insPEctor
CRACKER: ByTESCRK
  FECHA: 05/03/2002

 INTRODUCCION

Después de hace algún tiempo, casi tres meses de descanso en este aspecto, creo que he salido de invernar y aquí vamos nuevamente a la carga, para poner a su disposición un tuto más.

La verdad es que no tengo ninguna inspiración para escribir una introducción solo sé decirles que este programa es muy bueno y lo mejor aún es que la generación del serial es bastante sencilla, hubiese preferido que fuera más fácil al principio puesto que en lo que yo se los presento aquí, ya me había llevado un día pensando, sin embargo la solución es bastante sencilla.

Creo que por el momento hemos llegado al final de la intro y por lo tanto procedemos....

 AL ATAKE

Primeramente veremos como está formada nuestra pequeña victima. Abrimos el file insPEctor de ViPER y procedemos a buscar la carpeta en donde instalamos el programa y procedemos a analizarlo, hacemos clic en la pestaña Compilador y vemos que está hecho con Microsoft Visual C++ 6.0 y no está comprimido. Cargamos el programa y vemos que aparece una ventanita para registrarnos pero unicamente nos aparece un campo para ingresar el serial y cuatro botones (Ok, Exit, Try it, Buy it...), vamos a ingresar un valor cualquiera para el serial en mi caso los de siempre 19770424, hacemos clic en el botón de Ok y nos aparece una MessageBox con la cadena siguiente "You typed an invalid serial number", ya que tenemos esta información que es suficiente para nosotros nos vamos al W32DASM y descompilamos a nuestra victima para buscar esta cadena y ver desde donde procede el mensaje. Cuando ya lo tengamos vamos a las References Strings y buscamos la cadena, nos encontraremos con esto.

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0043CADA(C), :0043CAF9(C), :0043CB38(C), :0043CB56(C), :0043CB67(C)
|:0043CB86(C), :0043CB9E(C), :0043CBB8(C)
|

* Possible StringData Ref from Data Obj ->"You typed an invalid serial number."
                                  |
:0043CC30 68D4F74F00              push 004FF7D4  <= Si hacemos dobleclic caemos aqui...

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043CBE0(U)

Vamos a chequear en 0043CADA y veremos lo siguiente...

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0043CAAD(C)
|
:0043CAC7 6A2D                    push 0000002D
:0043CAC9 689C627B00          push 007B629C
:0043CACE E8CD170B00          call 004EE2A0 <= Pondremos aquí un breakpoint
:0043CAD3 8BF0                    mov esi, eax
:0043CAD5 83C408                add esp, 00000008
:0043CAD8 3BF5                    cmp esi, ebp
:0043CADA 0F8450010000       je 0043CC30 <= De aquí procede el salto...

* Possible StringData Ref from Data Obj ->"SI3US" <= Me parece extraño }:)
                                  |
:0043CAE0 BF78335300          mov edi, 00533378
:0043CAE5 83C9FF                or ecx, FFFFFFFF
:0043CAE8 33C0                   xor eax, eax
:0043CAEA 8BD6                   mov edx, esi
:0043CAEC F2                      repnz
:0043CAED AE                      scasb
:0043CAEE F7D1                   not ecx
:0043CAF0 49                      dec ecx
:0043CAF1 81EA9C627B00      sub edx, 007B629C
:0043CAF7 3BD1                   cmp edx, ecx
:0043CAF9 0F8531010000       jne 0043CC30

* Possible StringData Ref from Data Obj ->"SI3US"

Agregaremos esta palabra a nuestro serial malo, el cual quedaría así SI3US19770424. Reiniciamos el programa con el TRW y ponemos el breakpoint (bpx 0043CACE), presionamos Ctrl+M o F5 y a hacer el traceo al programa, vemos que aunque ingresemos cualquier número siempre el programa nos da el mensajito de que no es el correcto si subimos veremos lo siguiente...

:0043CA40 83EC0C                  sub esp, 0000000C <= Pondremos el nuevo breakpoint aqui...
:0043CA43 53                         push ebx
:0043CA44 55                         push ebp
:0043CA45 33ED                     xor ebp, ebp
:0043CA47 56                         push esi
:0043CA48 57                         push edi
:0043CA49 894C2418               mov dword ptr [esp+18], ecx
:0043CA4D C74424149C627B00  mov [esp+14], 007B629C
:0043CA55 896C2410               mov dword ptr [esp+10], ebp
:0043CA59 EB02                      jmp 0043CA5D
:0043CA5B 33ED                     xor ebp, ebp
:0043CA5D 8D442414               lea eax, dword ptr [esp+14]
:0043CA61 BA64010000            mov edx, 00000164
:0043CA66 50                         push eax
:0043CA67 B9D0E34F00            mov ecx, 004FE3D0
:0043CA6C C6059C627B0000     mov byte ptr [007B629C], 00
:0043CA73 E87856FCFF            call 004020F0 <= Esta es la función que solicita el serial
:0043CA78 83F802                  cmp eax, 00000002
:0043CA7B 0F84C9010000         je 0043CC4A
:0043CA81 83F801                  cmp eax, 00000001
:0043CA84 0F8558010000         jne 0043CBE2

:0043CA8A A09C627B00            mov al, byte ptr [007B629C]
:0043CA8F 84C0                      test al, al
:0043CA91 0F84B3010000          je 0043CC4A
:0043CA97 B99C627B00             mov ecx, 007B629C
:0043CA9C E83F55FFFF            call 00431FE0
:0043CAA1 A09C627B00            mov al, byte ptr [007B629C]
:0043CAA6 BE9C627B00            mov esi, 007B629C
:0043CAAB 84C0                     test al, al
:0043CAAD 7418                     je 0043CAC7
:0043CAAF 25FF000000            and eax, 000000FF          <= Aqui 
:0043CAB4 50                         push eax                            se
:0043CAB5 E8701A0B00            call 004EE52A                     empieza
:0043CABA 83C404                  add esp, 00000004               a
:0043CABD 8806                     mov byte ptr [esi], al            comparar
:0043CABF 8A4601                  mov al, byte ptr [esi+01]       todo
:0043CAC2 46                        inc esi                                el
:0043CAC3 84C0                     test al, al                           serial
:0043CAC5 75E8                     jne 0043CAAF                 <=========
:0043CAC7 6A2D                     push 0000002D
:0043CAC9 689C627B00           push 007B629C
:0043CACE E8CD170B00           call 004EE2A0
:0043CAD3 8BF0                     mov esi, eax
:0043CAD5 83C408                 add esp, 00000008
:0043CAD8 3BF5                    cmp esi, ebp
:0043CADA 0F8450010000       je 0043CC30

Hemos vuelto a la dirección 0043CADA sin embargo, ya avanzamos cierto tramo en este camino, sin embargo siento como si estamos dando vueltas en la misma dirección.

Ahora probemos con separar el serial de la palabra SI3US así SI3US-19770424 probamos y.... hemos pasado al siguiente pasado, no nos ha dado mensaje de error... y vemos lo siguiente aunque no es nada interesante sino nada más que algunas operaciones...

:0043CAE0 BF78335300           mov edi, 00533378
:0043CAE5 83C9FF                 or ecx, FFFFFFFF
:0043CAE8 33C0                    xor eax, eax
....
....

En esta parte el programa empieza a comparar los caracteres de la palabra SI3US

:0043CB15 33C9                    xor ecx, ecx
:0043CB17 8A8D78335300       mov cl, byte ptr [ebp+00533378]
:0043CB1D 51                       push ecx
:0043CB1E E8071A0B00          call 004EE52A
:0043CB23 33D2                    xor edx, edx
:0043CB25 8BD8                    mov ebx, eax
:0043CB27 8A959C627B00       mov dl, byte ptr [ebp+007B629C]
:0043CB2D 52                       push edx
:0043CB2E E8F7190B00          call 004EE52A
:0043CB33 83C408                add esp, 00000008
:0043CB36 3BC3                    cmp eax, ebx
:0043CB38 0F85F2000000       jne 0043CC30
:0043CB3E 45                       inc ebp
:0043CB3F 8BC7                    mov eax, edi
:0043CB41 4F                       dec edi
:0043CB42 85C0                    test eax, eax
:0043CB44 75CF                    jne 0043CB15

Luego de comparar el programa regresa y chequea una segunda separación por lo que se puede deducir que si no está sale y da error por lo que podemos deducir que el tipo de serial es

SI3US-19770424-SI3US

:0043CB46 46                       inc esi
:0043CB47 6A2D                    push 0000002D
:0043CB49 56                       push esi
:0043CB4A E851170B00          call 004EE2A0 <= Aqui se extrae el guión
:0043CB4F 8BE8                    mov ebp, eax
:0043CB51 83C408                add esp, 00000008
:0043CB54 85ED                   test ebp, ebp
:0043CB56 0F84D4000000       je 0043CC30 <= Si no está da error...
:0043CB5C 8BCD                   mov ecx, ebp
:0043CB5E C6450000             mov [ebp+00], 00
:0043CB62 2BCE                   sub ecx, esi <= Extrae ESI-ECX
:0043CB64 83F906                cmp ecx, 00000006 <= Si el serial no es igual a 6 es falso
:0043CB67 0F85C3000000      jne 0043CC30 <= Aqui va al mensaje de error

Por lo que procederemos a hacer una nueva modificación a nuestro serial... ahora quedará así...

SI3US-197704-SI3US

Haciendo todo nuevamente podemos ver que el programa luego de comparar continua pues no se cumple la condición de que si no es igual de error

:0043CB6D 8A06                   mov al, byte ptr [esi] <= Extrae el primer valor de 197704
:0043CB6F 8BCE                   mov ecx, esi <= Mueve el valor de ESI = 197704 a ECX
:0043CB71 8AD0                   mov dl, al
:0043CB73 3AC2                   cmp al, dl
:0043CB75 750C                   jne 0043CB83

Vemos que no ocurre nada interesante hasta... aquí...

:0043CB8C 8D5D01               lea ebx, dword ptr [ebp+01] <= Extrae el último valor
:0043CB8F 83C9FF                or ecx, FFFFFFFF
:0043CB92 8BFB                   mov edi, ebx
:0043CB94 33C0                   xor eax, eax
:0043CB96 F2                      repnz
:0043CB97 AE                      scasb
:0043CB98 F7D1                   not ecx
:0043CB9A 49                      dec ecx
:0043CB9B 83F905                cmp ecx, 00000005 <= Compara que tenga tamaño de cinco
:0043CB9E 0F858C000000      jne 0043CC30 <= Si así es continua
:0043CBA4 8BCE                   mov ecx, esi <= Mueve 197704 a ECX
:0043CBA6 E825D80800         call 004CA3D0 <= Calcula un valor para comparar con la tercera parte
:0043CBAB 8BF0                   mov esi, eax <= Mueve el valor de EAX a ESI
:0043CBAD 53                      push ebx
:0043CBAE E8CF160B00         call 004EE282 <= Transforma el valor de Decimal a Hex
:0043CBB3 83C404                add esp, 00000004
:0043CBB6 3BF0                   cmp esi, eax <= Compara los dos valores
:0043CBB8 7576                    jne 0043CC30 <= Si no son iguales da error
:0043CBBA 8B0D7CF55300      mov ecx, dword ptr [0053F57C]
:0043CBC0 689C627B00         push 007B629C

Al escribir el comando ? EAX vemos que nuestro valor está guardado en el y el valor original está en ESI, por lo tanto podemos resumir que el serial del programa es igual a

SI3US-NNNNNN-NNNNN

EL FIN

"EL motivo de este tutorial es solo con el fin de conocer la seguridad en ciertos programas de manera educacional y tambien como diversión, aunque como RAZiEL nos dice que podemos hacer y deshacer con el programa, realmente yo tambien los invito a hacerlo ;o)"

Y así doy por concluído un tuto más, saludando a mis buenos amigos Karpoff, Pr@fesor_X, CaoS ReptantE, [Kalisto (okaruzic) "Salute"] y a todos los crackers hispanohablantes.

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