Tutorial del software de cifrado VMProtect: uso del generador de claves de Windows, Net y UNIX

VMProtect es una utilidad de protección de software de nueva generación. VMProtect es compatible con los compiladores Delphi, Borland C Builder, Visual C/C++, Visual Basic (nativo), Virtual Pascal y XCode.

Mientras tanto, VMProtect tiene un desensamblador incorporado que funciona con ejecutables de Windows y Mac OS X, y también puede vincular archivos MAP creados por el compilador para seleccionar rápidamente fragmentos de código para proteger.

Para automatizar fácilmente las tareas de protección de aplicaciones, VMProtect implementa un lenguaje de secuencias de comandos incorporado. VMProtect es totalmente compatible con los sistemas operativos de 32/64 bits de la familia Windows (a partir de Windows 2000) y Mac OSX (a partir de la versión 10.6). Es importante destacar que VMProtect es compatible con la gama completa de ejecutables independientemente de la plataforma de destino, es decir, la versión de Windows puede manejar la versión de Mac OS X y viceversa.

Descargue la última versión de VMProtect (número: 766135708) icono-predeterminado.png?t=N4P3https://www.evget.com/product/1859/download

VMProtect  es una herramienta sólida para proteger el código de la aplicación del análisis y el descifrado, pero solo se puede usar de manera más efectiva si el mecanismo de protección en la aplicación está construido correctamente y libre de errores típicos que pueden destruir toda la protección.

generador de números de serie

¿Cuál es el uso?

Además de VMProtect, otro software también puede generar números de serie. Esto es necesario para enviar automáticamente el número de serie. Un cliente compra un producto, un corredor de comercio electrónico envía una consulta HTTP al sitio web del proveedor y un generador se ejecuta en el servidor para generar un número de serie basado en los datos del cliente. Los números de serie se envían a clientes y proveedores. Luego, el proveedor agrega manualmente el número de serie a VMProtect mediante el cuadro de diálogo Importar licencia.

como correr

El sistema de licencias de VMProtect se basa en un algoritmo asimétrico, por lo que se requiere una clave de producto secreta para generar el número de serie. Puede exportar esta clave en la ventana de propiedades del proyecto y pasarla al generador de cualquier manera adecuada.

El proxy de comercio electrónico invoca al constructor con una consulta HTTP. Los generadores de PHP se pueden llamar directamente, los generadores basados ​​en DLL, indirectamente, pero el principio es el mismo:

  • Reciba datos de usuario del corredor de comercio electrónico
  • Agregue toda la información requerida especificada por el proveedor
  • generar número de serie
  • Cifrarlo usando uno de los algoritmos.
  • Enviar el resultado al agente de comercio electrónico

¿Existe un generador de números de serie?

El sistema de licencias viene con tres generadores de números de serie listos para usar como DLL para la plataforma .Net y PHP.

¿Es posible crearlo usted mismo?

Sí tu puedes. El formato del número de serie está aquí y el algoritmo de cifrado del número de serie se describe aquí.

¿es seguro?

En general sí, sin embargo, debes seguir estas sugerencias:

  • Use HTTPS: si su proveedor de comercio electrónico puede enviar consultas HTTPS y su proveedor de alojamiento web puede responder a dichas solicitudes, debe preferir esta variante al HTTP típico, porque en este caso, todos los datos se transmiten en forma encriptada y la secuencia generada no puede interceptar el número.
  • "Oculte" su generador : asegúrese de que nadie pueda encenderlo por accidente. La dirección www.site.com/keygen.php es una mala idea. Aunque www.site.com/abc123.php es mucho mejor. Asegúrese de no poner ningún enlace externo al generador de claves, no figura en el directorio del sitio web y no lo pone en ningún archivo de servicio como robot.txt. Cuanto menos sepa sobre la ubicación del generador, mejor. Alternativamente, incluso podría alojar el generador en otro sitio web.
  • Asegúrese de que sea un proxy de comercio electrónico el que esté llamando al generador ; los programas que procesan consultas de proxies deben verificar la dirección IP de la persona que llama. Los proveedores de comercio electrónico suelen publicar rangos de IP para consultar los generadores de números de serie. Encuentre ese listado en su agencia y agregue un cheque al programa. No genere un mensaje de error inteligible si la dirección IP que envía la consulta está fuera del rango de IP especificado. O no devuelves nada o generas un 404 simple. No dé ninguna pista de por qué falló la consulta.
  • Verifique los parámetros de entrada : la configuración del producto en el Panel de control del agente de comercio electrónico generalmente le permite especificar una cadena de consulta que el agente debe realizar para recibir la licencia. Por ejemplo, desea recibir el nombre de usuario, la dirección de correo electrónico, la fecha de compra y el ID del pedido. Así que asegúrese de que se pasen todos estos parámetros y que todos los parámetros tengan el formato correcto. No responda a consultas incorrectas. Envíe un mensaje a su propio correo electrónico cada vez que se realice una consulta de error al generador. Esto debería ayudar a investigar el problema.
  • Agregar "Contraseña" especifica un parámetro adicional en la consulta enviada por el proxy de comercio electrónico, la contraseña. Debe tener un nombre y un valor no obvios. Compruebe este parámetro desde el receptor. Si el valor es incorrecto o no se especifica el parámetro, no se genera ningún número de serie.

generador de números de serie

  • versión de Windows
  • Versión neta
  • versión UNIX
  • formato de número de serie
  • Algoritmo de cifrado de número de serie

Generador de claves de Windows

El generador de claves de Windows es un archivo DLL para plataformas x86 y x64, un archivo de encabezado en lenguaje C y un archivo de biblioteca compatible con MSVC. Por lo tanto, las bibliotecas pueden vincularse estáticamente y cargarse dinámicamente.

Todos los archivos del generador se encuentran en la carpeta Keygen\DLL. La aplicación de prueba que genera el número de serie también está allí.

API del constructor

El generador exporta solo dos funciones: la primera función genera un número de serie y la segunda función libera la memoria asignada por la primera función. Empecemos por la primera y principal:

VMProtectErrors __stdcall VMProtectGenerateSerialNumber ( 
VMProtectProductInfo * pProductInfo,
VMProtectSerialNumberInfo * pSerialInfo,
char ** pSerialNumber 
);

El primer parámetro es un puntero a una estructura VMProtectProductInfo cuyo contenido se cargó en VMProtect (consulte Exportación de parámetros de productos). Esta estructura contiene la clave privada del producto, el algoritmo utilizado y el identificador del producto. A continuación se ofrecen más detalles sobre cómo completar esta estructura.

El segundo parámetro es un puntero a una estructura VMProtectSerialNumberInfo cuyo contenido se traslada al número de serie generado. Esta estructura contiene todos los campos del número de serie y una máscara de bits que define qué campos deben escribirse en el número de serie.

estructura VMProtectSerialNumberInfo 
{ 
        banderas INT; 
        wchar_t * pUsuario; 
        wchar_t * correo electrónico; 
        DWORD dwExpDate; 
        DWORD dwMaxBuildDate; 
        BYTE nLímite de tiempo de ejecución; 
        char * ID de hardware; 
        size_t nUserDataLength; 
        BYTE * pUsuarioDatos; 
};

El campo de banderas empaqueta las banderas de bits en VMProtectSerialNumberFlags, que se describe antes de la estructura:

  • HAS_USER_NAME: coloca el nombre de usuario de la variable pUserName en el número de serie.
  • HAS_EMAIL: coloca el correo electrónico en la variable pEMail en el número de serie.
  • HAS_EXP_DATE: el número de serie caducará después de la fecha especificada en la variable dwExpDate.
  • HAS_MAX_BUILD_DATE: el número de serie se aplica solo a las versiones del producto construidas antes de la fecha especificada en la variable dwMaxBuildDate.
  • HAS_TIME_LIMIT: el programa deja de funcionar después de la expiración del tiempo especificado por la variable nRunningTimeLimit (el tiempo se especifica en minutos y no debe exceder los 255).
  • HAS_HARDWARE_ID: el programa solo funcionará en hardware con el ID especificado en la variable pHardwar.
  • HAS_USER_DATA: coloque la longitud nUserDataLength de los datos de usuario personalizados en la dirección de pUserData para el número de serie.

El tercer parámetro es un puntero a un puntero. Allí se escribe la dirección del número de serie generado. Después de generar el número de serie, debe copiarse y la dirección debe pasarse a la segunda función API del generador, que liberará la memoria ocupada por el número de serie.

void __stdcall VMProtectFreeSerialNumberMemory (char * pSerialNumber);

La función VMProtectGenerateSerialNumber devuelve un valor VMProtectErrors que contiene 0 si el número de serie se generó correctamente o un código de error . Los posibles códigos de error son:

  • ALL_RIGHT - Sin errores, número de serie generado.
  • UNSUPPORTED_ALGORITHM: se pasó un algoritmo de cifrado de clave incorrecto en el primer parámetro de la función.
  • UNSUPPORTED_NUMBER_OF_BITS: se pasó un número incorrecto de bits en el primer argumento de la función.
  • USER_NAME_IS_TOO_LONG: el nombre de usuario codificado en UTF-8 tiene más de 255 bytes.
  • EMAIL_IS_TOO_LONG: el correo electrónico de usuario codificado en UTF-8 tiene más de 255 bytes.
  • USER_DATA_IS_TOO_LONG: los datos de usuario tienen más de 255 bytes.
  • HWID_HAS_BAD_SIZE: el tamaño del identificador de hardware es incorrecto.
  • PRODUCT_CODE_HAS_BAD_SIZE: el identificador de producto pasado en el primer parámetro de la función no tiene el tamaño correcto.
  • SERIAL_NUMBER_TOO_LONG: el número de serie es demasiado largo para la cantidad de dígitos especificados en el algoritmo.
  • BAD_PRODUCT_INFO: el primer parámetro de la función es incorrecto o NULL.
  • BAD_SERIAL_NUMBER_INFO: el segundo parámetro de la función es incorrecto o NULL.
  • BAD_SERIAL_NUMBER_CONTAINER: el tercer parámetro de la función no apunta a la memoria donde se escribirá la dirección del número de serie.
  • NOT_EMPTY_SERIAL_NUMBER_CONTAINER: el tercer parámetro de la función no apunta a una ubicación de memoria vacía, que debe ser NULL.
  • BAD_PRIVATE_EXPONENT: el primer argumento de la función contiene un valor de exponente privado incorrecto.
  • BAD_MODULUS: el primer argumento de la función contiene un valor de módulo incorrecto.

Los errores se pueden dividir en dos categorías: errores causados ​​por parámetros incorrectos o un valor incorrecto para el primer parámetro y todos los demás errores. El primer tipo de errores son raros e indican que la estructura no está configurada correctamente. Debe volver a cargar la información del producto y verificar que la estructura esté completa correctamente. A continuación se puede encontrar un ejemplo de una estructura correctamente poblada.

El segundo tipo de error se produce al intentar poner más datos en una clave de los que puede contener su tamaño. En este caso, recomendamos enviar al proveedor de comercio electrónico un mensaje con texto como "La clave se enviará dentro de las 24 horas" en lugar del número de serie real y enviar toda la información requerida a su propio correo electrónico. En este caso, la clave se generó manualmente en VMProtect y algunos datos se truncaron para ajustar toda la información clave al tamaño máximo de clave.

Ejemplo de uso

A continuación se muestra un ejemplo de código que llama a la función anterior y genera un número de serie. Tenga en cuenta el primer bloque de código. Este ejemplo no funcionará hasta que lo reemplace con el ejemplo exportado de VMProtect para su producto:

// 
// !!! este bloque debe ser generado por VMProtect !!! /// 
// 
VMProtectAlgorithms g_Algorithm = ALGORITHM_RSA; 
tamaño_t g_nBits = 0; 
byte g_vModulus[1]; 
byte g_vPrivado[1]; 
byte g_vProductCode[1]; 
// 
// 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
VMProtectProductInfo pi; 
pi.algoritmo = g_Algoritmo; 
pi.nBits = g_nBits; 
pi.nModulusSize = sizeof(g_vModulus); 
pi.pModulus = g_vModulus; 
pi.nTamañoPrivado = tamañode(g_vPrivado); 
pi.pPrivado = g_vPrivado; 
pi.nProductCodeSize = sizeof(g_vProductCode); 
pi.pProductCode = g_vProductCode; 

VMProtectSerialNumberInfo si = {0};
si.flags = TIENE_NOMBRE_USUARIO | TIENE_CORREO ELECTRÓNICO;
si.pUserName = L"Juan Pérez"; 
si.pEMail = L"[email protected]"; 
char * pBuf = NULL; 
VMProtectErrors res = VMProtectGenerateSerialNumber(&pi, &si, &pBuf); 
if (res == ALL_RIGHT) 
{ 
printf("Número de serie:\n%s\n", pBuf); 
VMProtectFreeSerialNumberMemory(pBuf); 
} 
else 
{ 
printf("Error: %d\n", res); 
} 
devuelve 0;

Este es un proyecto de ejemplo de Microsoft Visual Studio de Keygen\DLL\Example. A continuación se muestran las partes más interesantes del código junto con nuestros comentarios.

La primera línea de la función principal llena la estructura VMProtectProductInfo con datos exportados desde VMProtect. Este código es típico y no debe cambiarse para evitar errores. Luego creamos la estructura VMProtectSerialNumberInfo e insertamos la combinación de bits de nombre de usuario y correo electrónico en el campo de indicadores. En la siguiente línea, colocamos el nombre de usuario y la contraseña en los campos correspondientes de la estructura. Tenga en cuenta que los valores se aceptan en codificación UNICODE. El generador de claves los convertirá a UTF-8.

Luego inicializamos una variable de puntero para almacenar la dirección de la clave generada y llamamos a VMProtectGenerateSerialNumber y analizamos el código de retorno. Si no hay errores, la clave generada se enviará a la consola y se llamará a la función de memoria de número de serie libre.

Los campos restantes de la estructura VMprotectSerialNumberInfo

Ciertos campos de la estructura pueden requerir alguna explicación adicional. Por ejemplo, los campos dwExpDate y dwMaxBuildDate contienen fechas en un formato específico: 0xYYYYMMDD, es decir, el año se almacena en la palabra alta y el mes y el día se almacenan en los bytes alto y bajo de la palabra baja, respectivamente. Para generar dichos números, se utiliza la siguiente macro: MAKEDATE(y, m, d). Puedes llamarlo así: MAKEDATE(2010, 05, 12).

El campo pHardwareID debe contener un puntero a la cadena devuelta por el método VMProtectGetCurrentHWID del SDK de licencias.

Generador de claves .Net

.Net Key Generator es una compilación que incluye todo lo que necesita para generar un número de serie. El código fuente está en Keygen\Net como dos proyectos: KeyGen (el generador de claves en sí) y Usage (un ejemplo de uso del generador de claves).

El generador de claves se proporciona en el código fuente para compilaciones rápidas en una versión determinada de .Net Framework, sin embargo, recomendamos encarecidamente no aplicar ningún cambio en el código. En una versión futura de VMProtect, es posible que se agreguen algunas posibilidades nuevas al generador, lo que puede dar lugar a modificaciones repetidas del código. Además, esto puede dar lugar a errores muy difíciles de localizar. Si encuentra un error en el código original del generador o desea sugerir una mejora, comuníquese con el equipo de soporte.

Use el generador
basado en el código del proyecto Usage, luego agregue un enlace a la compilación VMProtect.KeyGen.dll a su proyecto. Después de eso, podrá generar el número de serie en su aplicación. Para funcionar correctamente, el generador debe "saber" para qué producto está generando el número de serie. Para ello, abra el cuadro de diálogo "Proyecto | Exportar par de claves" en VMProtect y seleccione la opción "Parámetros para KeyGen.Net". El área de texto a continuación contendrá la información de texto, que debe copiar y pegar en su aplicación como una constante de cadena.

Aquí hay un código de muestra para llamar al generador:

intente 
{ 
datos de cadena = @""; // poner los datos exportados aquí 
Generador g = new Generador(datos); 
g.UserName = "Juan Pérez"; 
g.Correo electrónico = "[email protected]"; 
g.ExpirationDate = DateTime.Now.AddMonths(1); 
g.MaxBuildDate = DateTime.Now.AddYears(1); 
g.RunningTimeLimit = 15; 
g.HardwareID = "AQIDBAgHBgU="; 
g.UserData = nuevo byte[] { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; 
serie de cadena = g.Generate(); 
Console.WriteLine("Número de serie:\n{0}\n", serie); 
} 
catch (Excepción ex) 
{ 
Console.WriteLine("Error: {0}", ex); 
}

La cadena que copió de VMProtect debe colocarse en la variable de datos pasada como parámetro al constructor de clase de número de serie. Si hay algún problema al analizar los datos del producto, el constructor lanzará una excepción con una descripción del problema. Si el constructor completa con éxito su trabajo, el generador está listo para generar números de serie.

Los números de serie pueden contener información diversa especificada mediante las propiedades del generador. El ejemplo anterior muestra cómo completar todos los campos de un número de serie. Ciertos campos tienen restricciones. Por ejemplo, el nombre de usuario y el correo electrónico no pueden aceptar cadenas codificadas en UTF-8 de más de 255 caracteres. Si los datos proporcionados son incorrectos, la propiedad genera una excepción que contiene una descripción del problema.

Después de configurar el generador, se llama al método Generate(). Este método genera un número de serie. En este paso, se combinan todos los datos del número de serie, se calcula una suma de verificación y se cifran los datos. Si la cantidad de datos excede la longitud permitida, el método generará una excepción.

Si necesita generar varios números de serie, puede usar la clase de generador varias veces seguidas sin crearla desde cero. Para borrar cualquier propiedad dada de un generador, simplemente asígnele un valor vacío

Generador de claves UNIX

La versión UNIX del generador de claves es un archivo PHP que contiene toda la información necesaria para generar un número de serie. Este archivo se encuentra en Keygen\PHP. A continuación, describimos la esencia del uso de dicho generador.

generador de configuración

Al comienzo del archivo PHP, el código de instalación se encuentra en:

// 
// Las siguientes líneas deben ser generadas por VMProtect License Manager 
$exported_algorithm = "RSA"; 
$bits_exportados = 2048; 
$exportado_privado = "PJvj4kEpoQMIpYK+9wEt......xKeiSZgzdiln8Q=="; 
$módulo_exportado = "rOlny/3QgZb/VmGr3CmY......I6ESAUmtQ+RBqQ=="; 
$código_producto_exportado = "oLQdGUn8kVk="; 
//

VMProtect genera automáticamente este código (consulte Exportación de parámetros de productos) y es único para cada producto específico. Es fundamental replicarlo exactamente, de lo contrario, el generador no funcionará correctamente.

contenido clave

El generador especifica el contenido de un número de serie. Estos se especifican en una matriz con todos los parámetros posibles para la clave que se enumeran a continuación. Sin embargo, en aplicaciones prácticas, algunos de ellos pueden omitirse:

$params = array( 
user_name => "John Doe", // UTF-8! 
email => "[email protected]", 
hwid => "vHGMdMRvGCPjWcCQ", // Exactamente como lo devuelve VMProtectGetCurrentHWID 
expire_date => array(year => 2009, mes => 10, día => 1), 
maxbuild_date => matriz(año => 2009, mes => 10, día => 1), 
time_limit => 10, 
user_data => base64_decode("CGCvRvMWcPHGdMjQ") , // cadena de bytes 
);

Función de controlador de generación de claves exitosa

A continuación, puede ver la función más simple que se llama cuando el número de serie se genera correctamente. El único parámetro que se le envía es la cadena del número de serie. La función debe pasar el número de serie a la persona que llama (agente de comercio electrónico), normalmente mediante el comando echo. Por comodidad, la cadena se divide inicialmente en subcadenas de 75 símbolos cada una. Además, esta función puede enviar por correo electrónico el número de serie generado al desarrollador o agregarlo a la base de datos.

function OnSerialGenerated($serial) 
{ 
$serial = wordwrap($serial, 75, "\n", true); 
echo $serie; 
}

Función de manejo de errores del generador de claves

La última parte del código que requiere nuestra atención es la función que se llama cuando algo sale mal. Esta función recibe una cadena con un mensaje de error y llama a la función die() cuando termina. La función del controlador debe hacer dos cosas: en lugar de la clave, devolver un mensaje al corredor de comercio electrónico de que la clave se enviará manualmente. Y envíe información exhaustiva sobre el error al desarrollador para solucionarlo y generar la clave manualmente.

function OnSerialGenerationFailed($detalles) 
{ 
echo "Recibirá el número de serie en las próximas 24 horas"; // mensaje al cliente 
// mail("[email protected]", "Houston, tenemos un problema", $detalles); // mensaje al vendedor 
}

Hay varias razones posibles para el error: parámetros de algoritmo incorrectos, parámetros clave incorrectos, nombre de usuario o correo electrónico demasiado largo, o un número de serie demasiado largo para caber en la cantidad de dígitos especificados en el algoritmo. Es por eso que la función OnSerialGenerationFailed debe informar a el desarrollador Envía detalles sobre el problema para que pueda generar un número de serie y enviárselo al cliente.

otras cosas a considerar

Los ejemplos contienen una versión simplificada del generador de claves. No tiene en cuenta la propuesta de desarrollar un generador de red. No verifica la dirección IP de la persona que llama, ni analiza los parámetros de entrada. Tenga esto en cuenta cuando desarrolle sus propios generadores.

El nombre de usuario y el correo electrónico deben pasarse como cadenas UTF-8. Asegúrese de que su proxy de comercio electrónico envíe estos datos en codificación UTF-8 y, de no ser así, transcodifique la información. La codificación incorrecta no generará un número de serie incorrecto, pero dicho número de serie podría mostrar un nombre registrado diferente al nombre de usuario real, por lo que podría sorprenderse cuando lo vea en la ventana "Acerca de". solicitud

El cifrado asimétrico es un proceso matemático complejo. Si se implementa en PHP puro sin ninguna biblioteca de terceros, puede llevar decenas de segundos generar el número de serie. El generador usa las funciones gmp_powm, bi_powmod, bcpowod cuando están disponibles. Si la generación del número de serie tarda demasiado en su alojamiento, le recomendamos que le pida a su proveedor de alojamiento que habilite estas funciones. Por ejemplo, la función gmp_powm se ejecuta diez veces más rápido que bcpowmod.

Lo anterior es el intercambio de varios generadores de claves. Si tiene alguna pregunta, no dude en chatear conmigo ~

Supongo que te gusta

Origin blog.csdn.net/m0_67129275/article/details/131188232
Recomendado
Clasificación