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.... ;)
Como viene siendo habitual:
SoftIce para Windows
W32DAsm
Un editor hexadecimal (Ultraedit 32 o similar)
Nota: Puedes buscar estas tools en www.astalavista.box.sk
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:
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 ;).
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:
NTICE | SoftIce para Windows NT |
SICE | SoftIce para Windows 95/98 |
WINICE | SoftIce para Windows |
SIWVID | Controlador 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.
:004BBA4B | 0FBF55F4 | movsx edx, word ptr [ebp-0C] | |
:004BBA4F | 52 | push edx | |
:004BBA50 | 6A00 | push 00000000 | |
:004BBA52 | E859F9FFFF | call 004BB3B0 | // realiza una llamada que tarda bastante en ejecutarse... Dongle Check ? |
:004BBA57 | 83C408 | add esp, 00000008 | // reajusta la pila |
:004BBA5A | 668945F8 | mov word ptr [ebp-08], ax | // guarda parte baja del valor de retorno de la función |
:004BBA5E | 0FBF45F8 | movsx eax, word ptr [ebp-08] | // copia de nuevo a EAX extendiendo el signo, sospechoso... |
:004BBA62 | 8945F0 | mov dword ptr [ebp-10], eax | // guarda valor en EBP-10 |
:004BBA65 | 8B4DF0 | mov ecx, dword ptr [ebp-10] | // y lo copia a ECX |
:004BBA68 | 83C104 | add ecx, 00000004 | // suma 4 |
:004BBA6B | 894DF0 | mov dword ptr [ebp-10], ecx | // y guarda de nuevo en EBP-10 |
:004BBA6E | 837DF003 | cmp dword ptr [ebp-10], 00000003 | // comprueba un valor con 3 |
:004BBA72 | 775A | ja 004BBACE | // salta bastante lejos si es superior, EAX debe de ser mayor que -1 |
:004BBA74 | 8B55F0 | mov edx, dword ptr [ebp-10] | // si es más pequeño que 3 |
:004BBA77 | FF249584BC4B00 | jmp dword ptr [4*edx+004BBC84] | // salto indirecto usando EDX como escala |
:004BBA7E | 0FBF45F4 | movsx eax, word ptr [ebp-0C] | |
:004BBA82 | 50 | push eax | |
:004BBA83 | E888FDFFFF | call 004BB810 | |
:004BBA88 | 83C404 | add esp, 00000004 | |
:004BBA8B | 85C0 | test eax, eax | |
:004BBA8D | 751D | jne 004BBAAC | // salta si EAX=0 |
:004BBA8F | 6810100000 | push 00001010 | |
:004BBA94 | 6870487300 | push 00734870 | |
:004BBA99 | 6A1B | push 0000001B | |
:004BBA9B | E890450000 | call 004C0030 | |
:004BBAA0 | 83C404 | add esp, 00000004 | |
:004BBAA3 | 50 | push eax | |
:004BBAA4 | 6A00 | push 00000000 | |
* Reference To: USER32.MessageBoxA, Ord:0195h | |||
:004BBAA6 | FF157CB56E00 | Call dword ptr [006EB57C] | // Esto muestra el mensaje de error |
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004BBA8D(C) | |||
:004BBAAC | E9CD010000 | jmp 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:
Borrar la llamada en 5950FA, esto significa cinco NOP -> 90h
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! |