Solo para los grandes Crack de Mql

Foro dedicado a todo lo relacionado con la versión 4 de la plataforma de Metaquotes.
Responder
cardan783
Mensajes: 22
Registrado: 25 Abr 2020 17:22

Solo para los grandes Crack de Mql

Mensaje por cardan783 »

Hola a todos, me gustaria saber si existe alguna función en mql4 donde yo pueda leer el numero MAC de una computadora, me urge saberlo. De antemano muchas gracias.

Avatar de Usuario
X-Trader
Administrador
Mensajes: 11190
Registrado: 06 Sep 2004 10:18
Contactar:

Re: Solo para los grandes Crack de Mql

Mensaje por X-Trader »

Hola cardan783, a ver qué te parece este código de muestra que he encontrado, no coge la MAC pero te permite crear un número de serie único igualmente:

Código: Seleccionar todo

//+------------------------------------------------------------------+
//| Function..: SystemDriveSerialNumber
//| Purpose...: Retrieve the serial number of a logical drive stored in the drive's boot sector.
//| Parameters: sDrive -  root directory of volume to retrieve Serial number.
//| Returns...: sNumber - drive serial number, or null string in the case of an error.
//| Example...: string sNumber=SystemDriveSerialNumber("C");
//| Thank You.: Big thank you to Stanislav Starikov of MetaQuotes www.metaquotes.net for correcting the 
    parameter type
//| Notes.....: Insert the following code at the top of your program in the EX4 imports section:

#import "Kernel32.dll"
  bool GetVolumeInformationA(string RootPathName,
       string VolumeNameBuffer, int VolumeNameSize,
       int& VolumeSerialNumber[], int MaximumComponentLength,
       int FileSystemFlags, string FileSystemNameBuffer,
       int FileSystemNameSize);

#import  
//+------------------------------------------------------------------+*/
string SystemDriveSerialNumber(string sDrive) {
  int    iVolumeSerialNumber[1]={0};
  string sVolumeSerialNumber="";
  if(GetVolumeInformationA(sDrive+":\\", "                ", 15, iVolumeSerialNumber, 0, 0, "                ", 15))
  {
    sVolumeSerialNumber=IntegerToHexString(iVolumeSerialNumber[0]);
    sVolumeSerialNumber=StringConcatenate(StringSubstr(sVolumeSerialNumber,0,4), "-", StringSubstr(sVolumeSerialNumber,4));
  }
  return(sVolumeSerialNumber);
}
Por otro lado, si tu objetivo es proteger tu EA, te recomiendo que eches un vistazo a este artículo:

https://www.mql5.com/en/articles/1572


Saludos,
X-Trader
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
cardan783
Mensajes: 22
Registrado: 25 Abr 2020 17:22

Re: Solo para los grandes Crack de Mql

Mensaje por cardan783 »

Gracias X-Trader, efectivamente es para proteger mi codigo cuando por ejemplo quiera enviarlo a un amigo para que lo pruebe y revise y pues solo pueda funcionar en el equipo especificado en la mac. De todas manera tambien habia encontrado una forma usando la funcion void OnTick(). Gracias voy a hecharle un vistazo al articulo que me enviaste.
Avatar de Usuario
Rafa7
Mensajes: 4875
Registrado: 17 Dic 2009 21:36
Contactar:

Re: Solo para los grandes Crack de Mql

Mensaje por Rafa7 »

cardan783 escribió: 01 Jun 2020 04:27 es para proteger mi codigo cuando por ejemplo quiera enviarlo a un amigo para que lo pruebe y revise
Hola, cardan783.



Si es para eso, puedes poner el código en un fichero de una carpeta compartida solo con él (de Google Drive o Dropbox, por ejemplo) y que el cuando se baje él código, elimine el fichero de la carpeta.

Otra cosa es que quieras expresamente que el código solo se pueda ejecutar en tu máquina y en la suya, para evitar que él la comparta con otros que podrían ejecutarlo. Si por ahí van los tiros, no sé que decirte, ya que no conozco el Mql.



Saludos.
¡Jesús es el Rey de Reyes y el Señor de Señores!
https://loquepermanece.blogspot.com
cardan783
Mensajes: 22
Registrado: 25 Abr 2020 17:22

Re: Solo para los grandes Crack de Mql

Mensaje por cardan783 »

Rafa7 escribió: 01 Jun 2020 09:05
cardan783 escribió: 01 Jun 2020 04:27 es para proteger mi codigo cuando por ejemplo quiera enviarlo a un amigo para que lo pruebe y revise
Hola, cardan783.



Si es para eso, puedes poner el código en un fichero de una carpeta compartida solo con él (de Google Drive o Dropbox, por ejemplo) y que el cuando se baje él código, elimine el fichero de la carpeta.

Otra cosa es que quieras expresamente que el código solo se pueda ejecutar en tu máquina y en la suya, para evitar que él la comparta con otros que podrían ejecutarlo. Si por ahí van los tiros, no sé que decirte, ya que no conozco el Mql.



Saludos.
Gracias por responder Rafa7 pero efectivamente es para proteger mi codigo sobre eso mismo que tu acabas de decir que no se pueda compartir y solo se ejecute en el equipo de la persona a quien yo se lo doy, y pues ya logre implementar el codigo cosa que es relativamente facil claro en algunos casos de proteccion ya que existen diferentes metodos de proteccion y hasta el cifrado Base64 que es un poco mas complejo pero metiendose unos dias estudiando el cifrado ese pues puedes digo yo no se puedes aprender a implementarlo en tu codigo.
Avatar de Usuario
cdtrader
Mensajes: 289
Registrado: 28 Dic 2016 17:04

Re: Solo para los grandes Crack de Mql

Mensaje por cdtrader »

Yo muchas veces ponía por número de cuenta de MetaTrader o que la cuenta sea demo


Enviado desde mi iPad utilizando Tapatalk
BePo
Mensajes: 5
Registrado: 19 Jun 2020 16:13

Re: Solo para los grandes Crack de Mql

Mensaje por BePo »

cardan783 escribió: 02 Jun 2020 13:24
Rafa7 escribió: 01 Jun 2020 09:05
cardan783 escribió: 01 Jun 2020 04:27 es para proteger mi codigo cuando por ejemplo quiera enviarlo a un amigo para que lo pruebe y revise
Hola, cardan783.



Si es para eso, puedes poner el código en un fichero de una carpeta compartida solo con él (de Google Drive o Dropbox, por ejemplo) y que el cuando se baje él código, elimine el fichero de la carpeta.

Otra cosa es que quieras expresamente que el código solo se pueda ejecutar en tu máquina y en la suya, para evitar que él la comparta con otros que podrían ejecutarlo. Si por ahí van los tiros, no sé que decirte, ya que no conozco el Mql.



Saludos.
Gracias por responder Rafa7 pero efectivamente es para proteger mi codigo sobre eso mismo que tu acabas de decir que no se pueda compartir y solo se ejecute en el equipo de la persona a quien yo se lo doy, y pues ya logre implementar el codigo cosa que es relativamente facil claro en algunos casos de proteccion ya que existen diferentes metodos de proteccion y hasta el cifrado Base64 que es un poco mas complejo pero metiendose unos dias estudiando el cifrado ese pues puedes digo yo no se puedes aprender a implementarlo en tu codigo.
B64 es una codificación, se puede decodificar fácilmente. No está pensado para proteger nada sino para disponer de texto ASCII y evitar posibles problemas si se usan, por ejemplo, protocolos de texto.

Existen muchos sistemas de cifrado y es fácil encontrar su código fuente. Para tu caso, creo que te puede valer cualquiera (AES, IDEA, BlowFish...) pues es improbable que alguien se vaya a meter en la tarea de intentar romper tu cifrado. Aquí tienes un ejemplo: https://www.c-sharpcorner.com/article/a ... n-c-sharp/

Como clave puedes usar algo que solo tenga tu cliente. Su MAC, número de serie del disco duro, combinarlo con su usuario, etc.

Un esquema podría ser desarrollar una aplicación que genere un archivo cifrado con los datos que necesitas de tu cliente (MAC...). El cliente lo ejecuta en su equipo y te envía ese archivo sin saber qué es lo que usas de su equipo para proteger tu sistema, pues está cifrado.

Ese archivo lo descifras para obtener el MAC (o lo que decidas usar) y tu código lo proteges usando eso como clave de cifrado. El código de tu sistema usará esos datos para obtener la clave (en otro equipo será otra MAC y no sevirá) y descifrar lo que necesites proteger.

Lo mejor es encapsular todo el código de la protección en una DLL y usar esa librería tanto en tu sistema como en la aplicación que el cliente ejecuta para darte los datos que necesitas para generar la clave.

De todas formas, no tiene sentido emplear mucho esfuerzo en la protección si te va a costar más que lo que estás protegiendo. Ten en cuenta quienes son los receptores/interesados en tu sistema y si les compensa o son capaces de romper tu protección. Si con algo simple puedes "asegurarte" de tener tu sistema a salvo, hazlo así. Por mucho que lo compliques, si el código está en su equipo, es posible que rompan tu protección.

En este tipo de aplicaciones, en mi opinión, lo más eficaz es que haya diversos puntos de tu sistema protegidos de distinta forma. Si el atacante encuentra uno (por ejemplo, el que hace que no funcione nada y te lo indica con un mensaje, que es fácil de localizar) puede que tu sistema funcione pero también puede que no funcione correctamente porque el resto de puntos protegidos no están resueltos pero tampoco avisan (para dificultar su localización). El atacante en este caso tiene muy dificil saber con certeza si ha roto o no tu protección y arriesgarse a usar tu sistema incompleto, cuando estás manejando dinero, es mucho riesgo.
Nightmare
Mensajes: 410
Registrado: 23 May 2018 09:23

Re: Solo para los grandes Crack de Mql

Mensaje por Nightmare »

Una sencilla solucion ;)

int cuenta = AccountNumber();
int NroCuenta = 1234567890; // aca pones el nro de cta de a quien vas ha pasar tu EA

if( IsTesting() )
Print("************* Modo Testing ***********");
else if ( cuenta!= NroCuenta )
{
Comment("************** Nro de Cuenta no permitido ***********");
Print("**************** Nro de Cuenta no permitido ***********");
ExpertRemove();
}
else
PrintFormat(" * * * Inicializacion OK * * * ");

Ideal seria un algoritmo para encriptar y desencriptar el nro de cta.
Para romper la proteccion necesita desensamblar el codigo y cambiar la instruccion JMP de la condicion de comparacion, pero ¿valdria la pena todo ese trabajo?
BePo
Mensajes: 5
Registrado: 19 Jun 2020 16:13

Re: Solo para los grandes Crack de Mql

Mensaje por BePo »

Nightmare escribió: 20 Ago 2020 07:20 Una sencilla solucion ;)

int cuenta = AccountNumber();
int NroCuenta = 1234567890; // aca pones el nro de cta de a quien vas ha pasar tu EA

if( IsTesting() )
Print("************* Modo Testing ***********");
else if ( cuenta!= NroCuenta )
{
Comment("************** Nro de Cuenta no permitido ***********");
Print("**************** Nro de Cuenta no permitido ***********");
ExpertRemove();
}
else
PrintFormat(" * * * Inicializacion OK * * * ");

Ideal seria un algoritmo para encriptar y desencriptar el nro de cta.
Para romper la proteccion necesita desensamblar el codigo y cambiar la instruccion JMP de la condicion de comparacion, pero ¿valdria la pena todo ese trabajo?
Da igual si lo cifras o no. Si cambias "if ( cuenta!= NroCuenta )" por "if ( cuenta== NroCuenta )" y recompilas haces que funcione para todas las cuentas excepto para la que quieres que funcione.

Justo a esto me refería en mi mensaje anterior. Si se pone la protección en un único sitio y encima donde se muestra un mensaje al usuario, localizarlo es "sencillo" y es cambiar la condición para que te valga con cualquier clave aleatoria. Lo anterior es correcto como validación simple.

Si a eso añades, por ejemplo, en alguna otra parte del código algo como:

if (AccountNumber() - 1234567890 == 0)
{
// Hacer algún cálculo importante
}

Pues si lo ha pirateado, aparentemente todo funciona (no obtiene ningún mensaje de error) pero realmente no funciona. El código del if anterior no se va a ejecutar y parte de las operaciones no las va a ejecutar.

Añade en otro sitio algo como:

int avgValue = 200 + (AccountNumber() % 117) - 36;

Imagina que avgValue es un valor que usas para algún cálculo y quieres que sea 200. El resto de dividir 1234567890 entre 117 es 36 por lo que (AccountNumber() % 117) - 36 es cero si la cuenta es 1234567890. Si es otra cuenta, en lugar de 200 puede que se use 179, por ejemplo. Los resultados serán totalmente distintos.

Imagina que en lugar de avgVolume es el número de títulos a comprar/vender. El que te piratee puede que en lugar de 1, compre 50.

Crea una variable global en lugar de hacer llamadas a AccountNumber() para evitar que buscando esta función tenga acceso a todos los puntos a verificar.

Si quieres complicarlo un poco más, aparte del número de cuenta usa el número de serie de su disco duro o la MAC de su tarjeta de Red. Para esto último lo ideal es crear una aplicación que el usuario ejecuta en su ordenador y genera un archivo cifrado con estos valores. Él te envía dicho archivo y tu lo descifras para obtener estos valores que usas luego en tu código para protegerlo.

En el código, donde estén las trampas/protecciones, añade algún comentario tipo "// PROTECCIÓN PIRATEO" para saber los sitios que tienes que cambiar cuando se la pases a otro usuario.

Y ahora, cuando alguien vaya a piratear tu código... ¿Habrá encontrado todos los puntos donde pones trampas? Siempre le quedará la duda y parece muy arriesgado trabajar con un código que no sabes si está o no funcionando correctamente.
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “Metatrader 4”