Cubase VST Score 3.65 Dongle Crack.  By Black Fenix

Bienvenidos de nuevo a mi noveno tutorial sobre cracking, en esta entrega vamos a tratar un tema bastante esperado por todos y que de hecho os será de gran utilidad: Como crackear mochilas, para el ejemplo he utilizado un conocido programa de composición musical, podria decirse casi que el mejor de su categoria se trata del Cubase VST Score 3.65, sin más preambulos vamos a por la chicha.... ;)  

necesita.gif (15203 bytes)

Como viene siendo habitual:

marcador.gif (1024 bytes)SoftIce para Windows
marcador.gif (1024 bytes) W32DAsm
marcador.gif (1024 bytes) Un editor hexadecimal (Ultraedit 32 o similar)

Nota: Puedes buscar estas tools en www.astalavista.box.sk
 
 

comenza.gif (16493 bytes)

Una vez instalado el programa, cargaremos el SoftIce y con este activo ejecutaremos el programa. Pero sorpresa, este no funcionará, ni tan siquiera nos mostrará ningún mensaje de error. mmm...... ¿Es posible que el Cubase detecte la presencia de nuestro querido SoftIce y no funcione debido a esto ? Pues efectivamente, si descargamos el SoftIce el Cubase se ejecutará perfectamente hasta que no encuentre la mochila. Conclusión: El programa esta usando alguna tecnica anti-debugging que detecta el SoftIce y si este está presente sale del programa sin mostrar nada.
Bueno pero ahora que pasa, como lo engañamos ?

Hay varias respuestas posibles:

marcador.gif (1024 bytes)Usando el FrogsIce, este herramienta es un dispositivo VXD que oculta el SoftIce y permite que este no sea detectado ademas de detectar si algun programa intenta averiguar si el SoftIce esta en memoria. Nos permite además engañar al programa detector ;).

marcador.gif (1024 bytes)Artesanalmente, es decir probando los metodos que a continuación explicaré.

He dedidido usar la 2ª técnica por ser más instructiva y más didacta para nosotros, usando la primera demostrariamos ser unos crackers un poco vagos, con la segunda aprenderemos como pueden engañarnos y así poder evitarlo.

Bueno dicho esto nos vamos a meter en algo que hasta ahora no nos habiamos metido, y es el anti-anti-debugging, en pocas palabras: engañar a los que intentar detectar si les estamos engañando ;). En este caso concreto la técnica que utiliza el Cubase para engañarnos es un metodo conocido como MeltIce, que es usado por los mismos creadores del SoftIce para comprobar si este está en memoria y así poder cargar simbolos de exportación (Symbol Loader), aquí teneis como sería el código en C:

BOOL IsSoftIce9XLoaded()
{
   HANDLE hFile;
   hFile = CreateFile(
"\\\\.\\SICE", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
                                      NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
   if( hFile != INVALID_HANDLE_VALUE )
   {
      CloseHandle(hFile);   
// SoftIce no está presente
      return TRUE;
   }
   return FALSE;            
  // SoftIce está presente
}

Como vemos se usa la funcion CreateFile (CreateFileA para nuestros propositos) la cual intenta obtener un handle al dispositivo VXD llamado SICE el cual pertenece al SoftIce si este está en memoria. Si la función retorna un valor diferente que INVALID_HANDLE_VALUE = 0xFFFFFFFFh (-1) SoftIce está en memoria y la función retornará TRUE. Existen variantes de este metodo las cuales cambian el nombre del VXD, aqui tienes una tabla con los nombres de dispositivos más usados, para detectar la presencia del SoftIce:
 

NTICESoftIce para Windows NT
SICESoftIce para Windows 95/98
WINICESoftIce para Windows
SIWVIDControlador de video del SoftIce

Pues vale, podriamos poner un BPX en la función CreateFileA y así poder ver si están intentando detectarnos, es una buena opción pero da la casualidad que la función CreateFileA se suele usar mucho por lo que deberiamos hacer el BPX cuando verdaderamente se estuviera pasando a la función una de las cadenas de la tabla anterior y esto lo hariamos de la siguiente manera:

BPX CreateFileA if *(esp->4+4)=='SICE' || *(esp->4+4)=='SIWV' || *(esp->4+4)=='NTIC'

con esto sólo interrunpiremos cuando se este pasando una de las cadenas anteriormente dichas.

Una vez establecido el BPX en el SoftIce ejecutaremos de nuevo el programa y boom! el BPX habrá surtido efecto, si tecleamos:

d esp->4

veremos el nombre del VXD que se está intentando detectar, como seguro que es uno de los nuestros, sólo deberemos ejecutar la llamada a CreateFileA (pulsar F10) y cambiar el valor del registro EAX a FFFFFFFFh (no detectado) con

r eax

esto nos permitirá que el programa siga su curso con el SoftIce cargado, hasta que este nos muestre el mensaje

The copy protection key could not be found bla,bla,bla.....

pulsaremos Aceptar y saldremos del programa,si se nos hace pesado estar cambiando todo el rato el valor de EAX, podemos editar el fichero cubase.exe, buscar las cadenas SICE y NTICE y reemplazarlas por XXXX, esto hará que nuestro BPX ya no se ejecute ya que ahora el programa buscará un VXD llamado XXXX el cual no existe ;), ahora podemos borrar el BPX ya que el Cubase no volverá a detectarnos :)
 

Continuamos usando la técnica de las referencias a cadena...

Bueno, una vez desactivado el truco anti-debugging, podremos proceder como normalmente veniamos haciendo, BPX MessageBoxA y ejecutar el Cubase, F12 para mostrar el mensaje y veremos lo siguiente.

:004BBA4B0FBF55F4movsx edx, word ptr [ebp-0C]
:004BBA4F52push edx
:004BBA506A00push 00000000
:004BBA52E859F9FFFFcall 004BB3B0 // realiza una llamada que tarda bastante en ejecutarse... Dongle Check ?
:004BBA5783C408add esp, 00000008// reajusta la pila
:004BBA5A668945F8mov word ptr [ebp-08], ax  // guarda parte baja del valor de retorno de la función
:004BBA5E0FBF45F8movsx eax, word ptr [ebp-08]// copia de nuevo a EAX extendiendo el signo, sospechoso...
:004BBA628945F0mov dword ptr [ebp-10], eax// guarda valor en EBP-10
:004BBA658B4DF0mov ecx, dword ptr [ebp-10] // y lo copia a ECX
:004BBA6883C104add ecx, 00000004 // suma 4
:004BBA6B894DF0mov dword ptr [ebp-10], ecx // y guarda de nuevo en EBP-10
:004BBA6E837DF003cmp dword ptr [ebp-10], 00000003 // comprueba un valor con 3
:004BBA72775Aja 004BBACE// salta bastante lejos si es superior, EAX debe de ser mayor que -1
:004BBA748B55F0mov edx, dword ptr [ebp-10] // si es más pequeño que 3
:004BBA77FF249584BC4B00jmp dword ptr [4*edx+004BBC84] // salto indirecto usando EDX como escala
:004BBA7E0FBF45F4movsx eax, word ptr [ebp-0C]
:004BBA8250push eax
:004BBA83E888FDFFFFcall 004BB810
:004BBA8883C404add esp, 00000004
:004BBA8B85C0test eax, eax
:004BBA8D751Djne 004BBAAC// salta si EAX=0
:004BBA8F6810100000push 00001010
:004BBA946870487300push 00734870
:004BBA996A1Bpush 0000001B
:004BBA9BE890450000call 004C0030
:004BBAA083C404add esp, 00000004
:004BBAA350push eax
:004BBAA46A00push 00000000
* Reference To: USER32.MessageBoxA, Ord:0195h
:004BBAA6FF157CB56E00Call dword ptr [006EB57C] // Esto muestra el mensaje de error
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004BBA8D(C)
:004BBAACE9CD010000jmp 004BBC7E

Estamos en la linea 4BBAAC después de llamada a MessageBoxA, si miramos hacia atrás buscando un salto que nos envie o nos aleje de la llamada al cuadro de dialogo, veremos uno en la linea 4BBA8D , si vemos hacia donde nos envia, veremos que nos dejaría justo debajo de la llamada a MessageBoxA, que es donde estamos ahora, por lo que este salto no nos sirve, si seguimos buscando el siguiente salto lo encontraremos en 4BBA77 , un salto indirecto mmm..., creo que buscaremos un poco más arriba, en la línea 4BBA72 , si examinamos el código previo a este salto, comprobaremos como se realiza una copia del valor devuelto por la función 4BB3B0 y se le suma 4 a este valor. Si mi olfato no me engaña está es nuestra función y podemos deducir que para que el salto en 4BBA72 se ejecute, esta función debe devolver un valor mayor que -1. Pues nada, vamos a poner un BPX en 4BB3B0 y ejecutaremos de nuevo el SoftIce. Cuando el BPX surta efecto trazaremos la función con F8 y luego continuaremos trazandola con F10 hasta llegar al final del código, donde veremos:

mov eax, dword ptr [00734758]       // carga un valor en EAX
mov eax, dword ptr [eax+08]          // EAX = FFFFFFFFh = -1
mov esp, ebp                                // restaura la pila
pop ebp
ret                                                // retorna con EAX=-1, el salto no se ejecutará

mientras trazamos veremos que se carga una libreria llamada SYNSO32.DLL encargada de controlar la mochila, después se realizan unas llamadas a diferentes funciones de esta y por último se retornan los valores de las llamadas a estas funciones, que es el código anteriormente visto, nuestra intención es hacer que se devuelva un valor mayor que -1, con lo que el valor 0 nos serviría, entonces el código que substiuiría al anterior sería así:

33C0                 xor eax, eax
90                      nop
90                      nop
90                      nop
90                      nop
90                      nop
90                      nop
8BE5                mov esp, ebp
5D                     pop ebp
C3                     ret
 

El crack definitivo?

Pues nada, desensamblamos el cubase.exe y nos vamos a la dirección de código 4BB6F2 apuntamos el offset que nos marca el W32DAsm, (recuerda salvar el proyecto, ya que tardaras menos si tienes que volver a desensamblar el ejecutable) y salimos de este.
Nos vamos a nuestro editor hexadecimal y reemplazamos los bytes correspondientes (ya deberias saber como).
Con esto habremos pasado el primer control de la mochila, el programa parecerá funcionar normalmente, pero si trabajamos durante un rato con el veremos que este peta en determinadas ocasiones y nos dara una GP fault en determinadas direcciones, esto es debido a que el programa comprueba la mochila o algun valor de memoria que se guarda en la primera comprobación y que indica la ausencia de la mochila.
 

Problemas y soluciones...

Estos errores se dan cuando se ejecutan determinadas ordenes de menus, por ejemplo al editar más de una vez la partitura (Score) de una pista (Track) obtendremos un error en la dirección 56A55D y en la 595173.
Para solucionarlo seguiremos la siguiente técnica, apuntaremos estas direcciones y editaremos el proyecto que habiamos salvado del cubase.exe en el W32DAsm. Iremos a estas direcciones y buscaremos un salto que nos aleje de estas direcciones o mejor aún ver donde se llama a la función que hace que el cubase se cuelgue e intentar buscar un salto que nos aleje de estas funciones, si lo hacemos así para las dos direcciones anteriores veremos que para la dirección 55A55D hay dos llamadas desde las lineas 0056A430 y 0056ABA0, para la dirección 56A430 encontraremos un salto en 0056A40F y para la 56ABA0 otro en 0056AB7F, estos dos saltos los sustituiremos por NOP's ya que despues de estos hay siempre un salto incondicional (jmp).
Ahora para la dirección 595173 veremos que sólo hay una llamada en 5950FA y esta no está precedida de ningún salto, por lo que podremos hacer 2 cosas:

marcador.gif (1024 bytes) Borrar la llamada en 5950FA, esto significa cinco NOP -> 90h
marcador.gif (1024 bytes) Poner un RET al inicio de la función 5950FA, esto significa una sola modificación (RET -> C3h), esto es posible ya  que después de la llamada a la función la pila se reajusta.

La segunsa solución es la sólución más idonea ya que sólo cambiamos un byte, frente a los 5 de la opción A

Pues lo dicho, haremos los cambios pertinentes y a disfrutar del mejor programa de composición musical para PC, si surgiera algún otro error procederiamos de manera similar a una de las dos anteriores, pero creo que el programa funciona con sólo estas modificaciones. ¿ Alguien por ahí se atreve a testear todas las opciones del Cubase VST ? ;)


You are inside Reversed Minds pages.

por Mr. Silver / WKT!
La información aquí vertida es exclusivamente para uso educacional, no puedo hacerme responsable del uso que se haga de esta, por lo que atiendo a la honradez de cada uno :), recuerda que debes comprar el software que utilices :)