Karpoff Spanish Tutor

Programa:

Parches "inteligentes" :-)


 

PROTECCION:

Name / Serial.

Objetivo:

Registrarse con el serial correcto sin saber cual es :-)

Dificultad:

Principiante++.

Herramientas:

Softice, W32dasm, Editor Hexadecimal.

CRACKER:

CaoS ReptantE

  FECHA:

20/09/2001

 

 INTRODUCCION

Este es, según se hagan las cuentas, mi tutorial número 13. Me temo que no es gran cosa pero se trata de romper la maldición y poder pasar al siguiente ;-) El sistema que propongo aquí es el de buscar una alternativa para esos programas (de los que - por suerte o por desgracia - cada vez hay menos) en los que la decisión entre chico bueno y chico malo se toma confrontando los dos seriales: el chungo, introducido por nosotros y el correcto, calculado por el programa. En este caso, lo más sencillo es hacer un parche, para que el programa acepte cualquier número. Aquí vamos a tratar de hacer que el programa se registre con el serial correcto, haciendo que el programa copie éste en el lugar donde está situado el serial chungo. ¿Que ventaja tiene el hacer esto cuando ya hemos encontrado el serial correcto? Una es que, si un colega quiere evaluar el programa sin prisas ;-) no es necesario que él lo tenga registrado a nuestro nombre, sino que lo puede tener registrado al suyo, sin que para ello tengamos que rastrear con el SoftIce, buscándole su serial. Otra ventaja es que una vez registrados con el serial correcto, podemos substituir el programa parcheado por el programa original. Veremos unos ejemplos con unos cobayas que se prestan a esta manipulación, ya que este sistema, como os podéis suponer, no se puede aplicar a cualquier programa. A esto me refiero pues, al hablar de parches "inteligentes" ;-)

 

 AL ATAKE

Programa:

Icon Extractor 3.4

Descripcion:

Creo que el nombre es lo bastante explícito :)

DOWNLOAD:

http://www.gregorybraun.com/ICONX32.ZIP

Estos programas de Software by Design van bien para cuando se está deprimido, se crackea alguno de ellos y ya está :-D claro que ahora que ByTESCRACK ha hecho un keygen polivalente para todos sus programas, las cosas ya no serán como antes :´-( De todos modos, como únicamente se trata de mostrar el funcionamiento del parche inteligente, este programa nos sirve. Ejecutamos el programa con el SoftIce agazapado, vamos a Help/Register y le introducimos un serial chungo para intentar registrarnos. Antes de aceptar, ctrl+D para entrar en el SIce, introducimos un breakpoint, mi favorito: bpx hmemcpy, F5 para salir de SIce y OK para registrarnos. Salta el SIce, le damos dos veces más a F5 para que el programa lea las otras ventanas de texto y ocho o nueve veces a F12 hasta que aparecemos en:

:0040DE61 5F                      pop edi

A partir de aquí, debemos ver lo que hace el programa con nuestro serial chungo. Averiguaremos la posición o posiciones que ocupa en la memoria nuestro número, mediante la instrucción s 0 l ffffffff 'serial_chungo'. A continuación, empleando las instrucciones bpm dirección_obtenida r o bpr inicio_dirección_obtenida final_dirección_obtenida r sabremos cuando el programa lee nuestro número para compararlo con el correcto. Vamos dándole a F5 para continuar cuando el SIce se detiene, pero al fin, vemos como en EAX y EBX se están formando unos números. Finalmente, en EBX aparece nuestro serial pasado a hexadecimal. Es conveniente utilizar como serial, un número que nos resulte fácilmente reconocible, tanto en formato decimal como hexadecimal. Ahora sólo falta llegar a la comparación de seriales, lo que ocurre aquí:

:00407D98 3BD8                    cmp ebx, eax
:00407D9A 5F                      pop edi
:00407D9B 741D                    je 00407DBA
:00407D9D 68CFEA0000              push 0000EACF
:00407DA2 6888130000              push 00001388

Podemos comprobar que en EBX está nuestro serial chungo en hexadecimal, y en EAX, el serial correcto. Ahora vamos a parchear, pero no para que el programa acepte la comparación, sino que vamos a copiar el serial correcto en el lugar donde está nuestro serial chungo. Como la comparación en estas condiciones, resultará positiva, el código que hay a continuación del salto, no llegará a ejecutarse, por lo que podemos utilizarlo para nuestros siniestros propósitos :-)

:00407D98 EB03 jmp 00407D9D

:00407D9A 5F pop edi
:00407D9B 741D je 00407DBA

:00407D9D 8BD8 mov ebx, eax
:00407D9F 3BD8 cmp ebx, eax
:00407DA1 EBF7 jmp 00407D9A

Si, ya sé que es una chapuza, pero funciona y hace posible que quedemos registrados con el número correcto, como podemos comprobar en el propio programa y en el registro (HKEY_USERS \ .DEFAULT \ Software \ Software by Design \ Icon Extractor for Windows 95/NT \ Registration). Ya tenemos uno, vamos a por el siguiente...

 

Programa:

AltoMP3 Maker 3.02

Descripcion:

Para pasar CDs de música a MP3

DOWNLOAD:

http://www.yuansoft.com/altom302.zip

Aquí el procedimiento para llegar a la comparación de seriales, es muy parecido y no lo vamos a ver con detalle, bastará con decir que llegamos a la comparación entre seriales aquí:

:0042A944 8A10                    mov dl, byte ptr [eax]
:0042A946 8A1E                    mov bl, byte ptr [esi]
:0042A948 8ACA                    mov cl, dl
:0042A94A 3AD3                    cmp dl, bl
:0042A94C 751E                    jne 0042A96C
:0042A94E 84C9                    test cl, cl
:0042A950 7416                    je 0042A968
:0042A952 8A5001                  mov dl, byte ptr [eax+01]
:0042A955 8A5E01                  mov bl, byte ptr [esi+01]
:0042A958 8ACA                    mov cl, dl
:0042A95A 3AD3                    cmp dl, bl
:0042A95C 750E                    jne 0042A96C
:0042A95E 83C002                  add eax, 00000002
:0042A961 83C602                  add esi, 00000002
:0042A964 84C9                    test cl, cl
:0042A966 75DC                    jne 0042A944

Como en el caso anterior, modificaremos la rutina de comprobación para que se copien los bytes del serial correcto (dirección señalada por EAX) en el lugar de los del serial chungo (dirección indicada por ESI). 

:0042A944 8A10                    mov dl, byte ptr [eax]
:0042A946 8816                    mov byte ptr [esi], dl
:0042A948 8ACA                    mov cl, dl
:0042A94A 3AD2                    cmp dl, dl
:0042A94C 751E                    jne 0042A96C
:0042A94E 84C9                    test cl, cl
:0042A950 7416                    je 0042A968
:0042A952 8A5001                  mov dl, byte ptr [eax+01]
:0042A955 885601                  mov byte ptr [esi+01], dl
:0042A958 8ACA                    mov cl, dl
:0042A95A 3AD2                    cmp dl, dl
:0042A95C 750E                    jne 0042A96C
:0042A95E 83C002                  add eax, 00000002
:0042A961 83C602                  add esi, 00000002
:0042A964 84C9                    test cl, cl
:0042A966 75DC                    jne 0042A944

Como en el caso anterior, quedaremos registrados con el serial correcto como podemos comprobar en el propio programa y en el archivo REGKEYCR.INI. De todos modos, lo más curioso de este programa es que tiene ¡23! rutinas iguales a esta. ¿Para que servirán? ¿Para despistar? No creo que sean tan zoquetes. Yo no he visto otro camino para registrarse que el que he seguido, pero si alguien descubre algo sobre esto, le agradecería me lo hiciera saber. Bueno ya tenemos dos, vamos a por el tercero...

 

Programa:

Super Cleaner 2.21 Víctima cedida gentilmente por ByTESCRK ;-)

Descripcion:

Como su nombre indica, hace la limpieza. (del PC, claro)

DOWNLOAD:

http://www.southbaypc.com/download/cleansetup.exe

En este caso es aún más sencillo encontrar el código de la comparación. El problema es que está en muy mal sitio, ya que se hace en KERNEL32... y no vamos a tocar ahí por razones obvias :-(  Así que como conocemos el lugar donde sitúa el código correcto, vamos a pillar al programa cuando lo escribe, de nuevo mediante la instrucción bpr. Así localizamos el call que coloca el serial correcto en su sitio.

:0040C59D E8AE000000              call 0040C650
:0040C5A2 8B8C2414010000          mov ecx, dword ptr [esp+00000114]
:0040C5A9 83C408                  add esp, 00000008
:0040C5AC 8D442404                lea eax, dword ptr [esp+04]
:0040C5B0 50                      push eax
:0040C5B1 51                      push ecx

* Reference To: KERNEL32.lstrcmpA, Ord:0329h
                                  |
:0040C5B2 FF15F8914100            Call dword ptr [004191F8]

Como no tenemos espacio para colocar nuestro código vamos a buscar un espacio vacío al final de la sección y colocaremos una instrucción jmp para saltar a él. Sería más limpio poner un call, pero esto nos complicaría mucho la vida porque como podéis ver, todas estas instrucciones están relacionadas con la pila. Modificamos el código que quedará así:

:0040C59D E8AE000000              call 0040C650
:0040C5A2 8B8C2414010000          mov ecx, dword ptr [esp+00000114]
:0040C5A9 83C408                  add esp, 00000008
:0040C5AC E91BCA0000              jmp 00418FCC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00418FE3(U)
|
:0040C5B1 51                      push ecx

* Reference To: KERNEL32.lstrcmpA, Ord:0329h
                                  |
:0040C5B2 FF15F8914100            Call dword ptr [004191F8]

Como he dicho antes, colocaremos nuestro parche en el final de la sección:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040C5AC(U)
|
:00418FCC 50 push eax
:00418FCD 53 push ebx
:00418FCE 51 push ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00418FD9(U)
|
:00418FCF 8A18 mov bl, byte ptr [eax]
:00418FD1 8819 mov byte ptr [ecx], bl
:00418FD3 0ADB or bl, bl
:00418FD5 7404 je 00418FDB
:00418FD7 40 inc eax
:00418FD8 41 inc ecx
:00418FD9 EBF4 jmp 00418FCF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00418FD5(C)
|
:00418FDB 59 pop ecx
:00418FDC 5B pop ebx
:00418FDD 58 pop eax
:00418FDE 8D442404 lea eax, dword ptr [esp+04]
:00418FE2 50 push eax
:00418FE3 E9C935FFFF jmp 0040C5B1

Creo que está claro el funcionamiento. En todo caso diré que los push y pop son para que los valores de los registros sean los mismos al volver al código "normal" (hay que tener cuidado del orden en que se ponen) y que las dos últimas instrucciones antes del jmp de regreso son las que nos hemos "comido" para poner el jmp que nos ha traído aquí. El programa así parcheado, nos registra con el serial correcto (ver en el registro: HKEY_CURRENT_USER \ Software \ SuperCleaner \ Registration) por lo que, una vez registrados, podemos deshacernos de él. Haced que parezca un accidente :-D

¿Cuál es la manera más sencilla de ensamblar este código? Para mí, lo más fácil es hacerlo con el SoftIce, colocando un bpx a la dirección de la primera instrucción a ensamblar (en este último caso: bpx 40c5ac), e introduciendo a continuación, la instrucción o instrucciones correspondientes (jmp 00418FCC), finalizando con <esc> o un doble <return>. Luego se busca el siguiente código a ensamblar mediante F10, y se repite la operación. Esto tiene dos ventajas: la primera es que el SIce se encarga de codificar las instrucciones, calculando además la distancia relativa de los saltos, algo engorroso de hacer a mano (aparte de que es fácil equivocarse); la segunda es que, traceando con F10 las instrucciones que hemos ensamblado, podemos ver su ejecución paso a paso y detectar fácilmente los posibles errores (se trata de utilizar el SofIce como debugger que era su utilidad original, antes de que unos individuos sin escrúpulos ;-) se dedicaran a crackear programas con él). Como no hay rosa sin espinas, hay también un inconveniente: los cambios efectuados con el SoftIce, se hacen en la memoria, por lo que hay que tomar nota de los códigos de las instrucciones para pasarlos al programa mediante un editor hexadecimal. Os recuerdo que la dirección que se le ha de indicar al editor es el offset, el cual se puede ver en la línea inferior del W32dsam, junto a la dirección de la instrucción sobre la que estamos.

Podréis pensar que es mucho código para tan poco programa, pero en este tuto he tratado únicamente de buscar una alternativa para cierto tipo de programas a los que se puede dar un "tratamiento" distinto del habitual. Además estos trapicheos nos darán algo de práctica, que nos valdrá para empresas más ambiciosas.

Para elaborar los parches podéis fabricaros un parcheador o utilizar alguno de los existentes. Yo utilizo el ScAEvoLa's PatchEngine.

Como siempre, quiero recordaros que debéis pagar los programas que utilicéis regularmente. No estaría bien que condenarais al hambre a unas buenas gentes, mientras vosotros os gastáis el dinero a manos llenas en actividades viciosas y de más que dudosa moralidad ;-)

Por último, quiero agradecer a ByTESCRK su colaboración en este tuto y enviar un saludo a mis amigos Act MagO, Pr@fEsOr X, DeK_OiN, Karpoff, Silver Storm, KuaTo_ThoR, y vLuGo.

Si queréis alguna aclaración sobre mis tutos, mi dirección de e-mail es: caos_reptante@hotmail.com

 

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