Crackeando un componente para Delphi
Hola a todos, estoy nuevamente para mostrarles lo sencillo que puede ser crackear un componente para el entorno de desarrollo Delphi.
Las otras noches, nos juntamos en la casa de un amigo a comer unos canelones, después de comer, charlar y reirnos un rato, sacamos nuestras notebooks… fue ahí cuando me dije, ¿porque no crackear estas compos que hacen muy lindas interfaces a nuestras aplicaciones delphi?
No diré el nombre de estas componentes, ya que obviamente son pagas, sino no sería necesario crackearlas , no? xD
Pero sí daré una pista, empiezan con estas dos letras VGS y las que le siguen, sin espacios son 4 letras, muy conocida palabra en el “ambiente” en el que nos solemos mover.
a alguien le gusta la demoscene? xD
Bien, no doy mas pistas, si no lo han agarrado dedíquense a otra cosa… xD
La protección es muy, pero muy sencilla, pero molesta, como todas.
Una pequeña NAG Screen, cuando se instala el componente en Delphi, aparecerá, si arrancamos el entorno, aparecerá, porque Delphi carga todas sus librerías al comienzo… si compilamos un proyecto de ejemplo que viene en el paquete, saldrá el NAG de nuevo, y obviamente si corremos el EXE generado aparte, también… en algún lugar más? xD
Lo que haremos serán dos parcheos simples y no aparecerán nunca más en ningún lado, solo con parchear un fichero. Hay que ir a la fuente, delphi compila y reconvierte todo a varios formatos para que todo en “su mundo” salga bien.
Podemos rompernos la cabeza parcheando 3 o 4 archivos, o 1 solo simplemente.
De que se trata todo esto
Bueno, como ya expliqué es un simple NAG molesto, las demás funcionalidades parecen completas, así que les mostraré el mensajito:

Bien, como les dije, este cartelito, todas las veces que les comenté aparece, ahora vamos a sacarnóslo de encima
Si miramos la carpeta de los componentes estos, veremos que tenemos la carpeta packages, dentro hay archivos con estas extensiones dpk, dcu, res, bpl y dcp.
Los DPK son Delphi Package, los DCU son Delphi Compiled Unit, los BPL son Borland Package Library y los DCP son Delphi Component Package.
Cuando abrimos un DPK, compilamos e intalamos, éste contiene las DCU compiladas, y la DPK utilizada se guardara en la carpeta de proyectos de Borland.
Con esto quiero decir, que si crackeamos lo que genera un DPK que es un BPL, no lo crackearemos del todo…
Miremos primero lo más facil.
Donde atacar
Si compilamos un ejemplo y lo abrimos con el IDA, buscaremos una parte del string del NAG, por ej, “trial”.
Encontraremos la parte de código como la siguiente:
CODE:004F4704 mov eax, offset _str_This_applicatio.Text
CODE:004F4709 call unknown_libname_164 ; BDS 2005-2006 and Delphi6-7 Visual Component Library
CODE:0050BED0 mov eax, offset _str_Resources.Text CODE:0050BED5 call sub_4F7E78 CODE:0050BEDA call nullsub_13
Ok, entonces, podemos parchear el segundo CALL.
Si miramos el código en hexa, será el siguiente: E8 C1 87 FE FF deberíamos NOPearlo, y listo, lo tenemos arreglado.
Pero!, siempre hay un pero, no nos conviene parchear cada EXE que compilamos, o si?
sería muy tedioso, deberíamos correr el parche por cada ejemplo o aplicación que utilice estas librerías, entonces deberíamos parchear la fuente, donde se genera la cuestión, no creen?…
Buscando la fuente
Ok, busquemos lo mismo en el BPL que si lo abrimos es un PE armado por Delphi. En cambio no podremos hacerlo con un DPC.
Encontramos esto:
CODE:004560C1 call @Vg_scene@RegisterVGObjects$qqrx17System@AnsiStringpxpx17System@TMetaClassxi ; Vg_scene::RegisterVGObjects(System::AnsiString,System::TMetaClass **,int) CODE:004560C6 call @Vg_version@ShowVersion2$qqrv ; Vg_version::ShowVersion2(void)
Con esto lograremos que Delphi 7 no sea interrumpido por la molesta NAG, pero al compilar los ejemplos, y al ejecutarlos saldrá nuestro NAG…
Entonces, donde está la magia de esto? nos queda una de las extensiones que expliqué antes: DCU.
Las DCU NO son PE’s así que tendremos que ver como los “atacamos”, la mejor idea creo que es con DEDE.
Mirando en la carpeta fuera de packages, vemos tooodos los DCU, así que encontraremos uno de ellos que es vg_version.dcu
Podemos abrir el DEDE y hacer lo siguiente:
Como vemos, abrimos DEDE, y en el menú dumpers, podemos elegir la opcion Dumpeador de DCU. Si hacemos click en esa opción se abrirá la siguiente pantalla, donde elegimos el archivo vg_version.dcu y hacemos click en procesar.
Obtendremos lo siguiente:
Obtendremos el código de nuestra DCU, entonces ahí veremos lo siguiente:
procedure ShowVersion2; const AboutText = 000: ÿÿÿÿP...This app|FF FF FF FF 50 01 00 00 54 68 69 73 20 61 70 70| 010: lication uses a |6C 69 63 61 74 69 6F 6E 20 75 73 65 73 20 61 20| 020: trial version of|74 72 69 61 6C 20 76 65 72 73 69 6F 6E 20 6F 66| 030: VGScene.....Ple|20 56 47 53 63 65 6E 65 2E 0D 0A 0D 0A 50 6C 65| 040: ase contact the |61 73 65 20 63 6F 6E 74 61 63 74 20 74 68 65 20| 050: provider of the |70 72 6F 76 69 64 65 72 20 6F 66 20 74 68 65 20| 060: application for |61 70 70 6C 69 63 61 74 69 6F 6E 20 66 6F 72 20| 070: a registered ver|61 20 72 65 67 69 73 74 65 72 65 64 20 76 65 72| 080: sion.....%s..Cop|73 69 6F 6E 2E 0D 0A 0D 0A 25 73 0D 0A 43 6F 70| 090: yright (C) 1998-|79 72 69 67 68 74 20 28 43 29 20 31 39 39 38 2D| 0A0: 2009 by Eugene K|32 30 30 39 20 62 79 20 45 75 67 65 6E 65 20 4B| 0B0: ryukov....For co|72 79 75 6B 6F 76 0D 0A 0D 0A 46 6F 72 20 63 6F| 0C0: nditions of dist|6E 64 69 74 69 6F 6E 73 20 6F 66 20 64 69 73 74| 0D0: ribution and use|72 69 62 75 74 69 6F 6E 20 61 6E 64 20 75 73 65| 0E0: , see LICENSE.TX|2C 20 73 65 65 20 4C 49 43 45 4E 53 45 2E 54 58| 0F0: T.....Visit our |54 2E 0D 0A 0D 0A 56 69 73 69 74 20 6F 75 72 20| 100: web site for the|77 65 62 20 73 69 74 65 20 66 6F 72 20 74 68 65| 110: latest versions|20 6C 61 74 65 73 74 20 76 65 72 73 69 6F 6E 73| 120: of VGScene:....|20 6F 66 20 56 47 53 63 65 6E 65 3A 0D 0A 0D 0A| 130: http://www.ksdev|68 74 74 70 3A 2F 2F 77 77 77 2E 6B 73 64 65 76| 140: .com/..support@k|2E 63 6F 6D 2F 0D 0A 73 75 70 70 6F 72 74 40 6B| 150: sdev.com. |73 64 65 76 2E 63 6F 6D 00|; var
Aquí vemos que está el mensaje de nuestra NAG, tenemos nuestro objetivo en la mira.
Como veremos, tenemos 2 procedimientos ShowVersion y ShowVersion2.
Lo que haremos será sencillo, en vez de parchear DENTRO, parchearemos solamente y PUSH EBP:
begin
00000000 : 55 PUSH EBP
00000001 : 8B EC MOV EBP,ESP
00000003 : 83 C4 F4 ADD ESP,-12
00000006 : 53 PUSH EBX
00000007 : 56 PUSH ESI
00000008 : 33 C0 XOR EAX,EAX
0000000A : 89 45 FC MOV DWORD PTR [EBP-4],EAX
0000000D : 33 C0 XOR EAX,EAX
0000000F : 55 PUSH EBP
00000010 : 68(95 00 00 00 PUSH ShowVersion2{0x26}+149
Justamente el PUSH EBP, podemos cambiarlo por un RETN, entonces no entrará directamente a nuestra función, es decir, entrará y luego se irá y no habrá pasado nada.
Entonces tendremos que cambiar el 55 que es el código de operación del PUSH EBP, por un RETN que es un C3.
Parcheando
La pregunta que tendremos inmediatamente, es ¿cómo podemos interceptar ese PUSH EBP, en realidad los dos por las dudas…?
Lo mejor, es buscar el patrón de bytes, así nos aseguraremos que estamos en el lugar indicado..
El patrón que utilicé yo para buscar en ShowVersion2 es: 55 8B EC 83 C4 F4, será el mismo en ShowVersion, ya que es la “cabecera” de la función, y siempre es igual, idéntica.
Así que cambiaremos el 55 por un C3, y san se acabó la maldita NAG.
Conclusión
No hay mucho más que decir, son buenos componentes, si los utilizarán con fines lucrativos, cómprenlos, pero la forma en que está protegido esto, es… deplorable.
Luego podremos recompilar nuestro DPK y reemplazar los nuevos por los viejos, la NAG no aparecerá nunca más ni en Delphi, ni en ningún lado.
Espero que les haya gustado.
Nos vemos en la próxima.






































