Скажите пожалуйста как пищется код для защиты советника от перепродажи ? - страница 2

 
Sunnat Tilyakhodjaev:
Не могу напмсать сам кодировку 

Здесь будет старое решение, которое я использую для продажи продуктов.

Вы должны знать номер торгового счета покупателя (имя пользователя).

Затем, используя приведенный ниже код, вы сможете сгенерировать для него ключ, который активирует продукт.

//+------------------------------------------------------------------+
//|                                                   Sample key.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

// External variables
input string expertKey=""; // Expert authorization key:
//---
bool falseKey=false;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   string ExpKey[];
   ushort sep_=StringGetCharacter("-",0);
   StringSplit(expertKey,sep_,ExpKey);
   if(ArraySize(ExpKey)>0)
     {
      long accLogin=0;
      string buyerAccountLogin="0"; // чтобы сгенерировать ключ аутентификации, вместо нуля "0" введите номер счета покупателя.
      if(StringLen(buyerAccountLogin)<3)
         accLogin=AccountInfoInteger(ACCOUNT_LOGIN);
      else
         accLogin=StringToInteger(buyerAccountLogin);
      string accLoginSt=IntegerToString(accLogin);
      int accLoginStLen=StringLen(accLoginSt);
      accLogin=accLogin+accLogin/MathMax(1,accLoginStLen);
      /*                            // если хотите арендовать советник на месяц, удалите косойе черты и звездочки
         MqlDateTime date;
         TimeToStruct(iTime(Symbol(), PERIOD_CURRENT, 0), date);
         accLogin=accLogin+date.mon+date.year+accLogin/accLoginStLen;
      */
      string keyStSubSt=StringSubstr(accLoginSt,StringLen(accLoginSt)-4);
      long key1=(accLogin*StringToInteger(StringSubstr(accLoginSt,StringLen(accLoginSt)-2))/3)/MathMax(1,StringToInteger(keyStSubSt));
      keyStSubSt=StringSubstr(accLoginSt,StringLen(accLoginSt)-2);
      long key2=(long)(accLogin*StringToInteger(keyStSubSt))/MathMax(1,key1);
      keyStSubSt=StringSubstr(accLoginSt+IntegerToString(key2),StringLen(accLoginSt)-2);
      long key3=(long)(key1*accLogin*StringToInteger(keyStSubSt))/MathMax(1,key2);

      keyStSubSt=StringSubstr(accLoginSt,StringLen(accLoginSt)-2);
      while((key1+accLogin)%MathMax(1,StringToInteger(keyStSubSt))!=0.0)
         key1++;
      keyStSubSt=StringSubstr(accLoginSt,StringLen(accLoginSt)-4,2);
      while((key2+key1+accLogin)%MathMax(1,StringToInteger(keyStSubSt))!=0.0)
         key2++;
      keyStSubSt=StringSubstr(accLoginSt,StringLen(accLoginSt)-6,2);
      while((key3+key2+key1+accLogin)%MathMax(1,StringToInteger(keyStSubSt))!=0.0)
         key3++;
      if(key1==StringToInteger(ExpKey[0])&&key2==StringToInteger(ExpKey[1])&&key3==StringToInteger(ExpKey[2]))
         Print("Ключ действителен");
      else
        {
         falseKey=true;
         Print("Ключ не действителен");
         if(StringLen(buyerAccountLogin)>2&&accLogin!=AccountInfoInteger(ACCOUNT_LOGIN))
            Print("Ключ аутентификации для покупателя: "+IntegerToString(key1)+"-"+IntegerToString(key2)+"-"+IntegerToString(key3)); // Печать сгенерированного ключа аутентификации для покупателя
        }
     }
   else
     {
      falseKey=true;
      Print("Ключ аутентификации не введен.");
     }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(falseKey)
      return;
  }
//+------------------------------------------------------------------+
 
привязка эксперта конкретно к счету и ограниченый срок нарушает "пункты" 4.5 и 4.8 продажи в "маркете" !!!
 
если надо продавать через маркет, то ограничений не должно быть
 
Renat Akhtyamov #:
если надо продавать через маркет, то ограничений не должно быть

Большое спасибо вам !

 
В маркете уже реализована защита
 
Aliaksandr Hryshyn #:
В маркете уже реализована защита
Топикстартер же знакомым хочет дать, как через маркет то даст. 
 
Для знакомых я привязываю к счёту и к символу. Но это ФОРТС, тут символ живёт (активно) 3 месяца.
 

В пору покупки/продажи книг в электронном виде (лет 10 назад), я столкнулся с вот такой защитой. Я купил электронную книгу. Получил её в exe-формате. Запустил и увидел сообщение, что мол, у тебя сейчас вот такой код, вышли его продавцу, представься и получишь код-ответ. Введёшь его вот сюда и читай на здоровье.

Там же было примечание, что, мол, генерация исходного ключа делается на основе привязки к железу покупателя и его операционной системе. Не известно, что опрашивал полученный мной экзешник и как он генерировал исходный ключ, но всякий раз, как я переустанавливал винду, операцию "Отсыл ключа и получение нового ответного" приходилось делать по-новой. Попытка же перенести прогу с полученным ключом на другой комп, как и попытка после переустановки той же саой винды на том же компе воспользоваться уже полученным ключом, приводила к провалу.

Я так подозреваю, что генерация исходного ключа происходила на основе трёх данных: Версия биоса+Верися виндовса+Точное время установки виндовса (до секунд). Изменение хотя бы одного из этих параметров приведёт к несоответствию ключей.

Зачем я это рассказываю? Дело в том, что можно присоединить к советнику dll-ку, которая будет при старте советника проводить подобную проверку ключей. Ну и, разумеется, у Вас окажется в руках список допущенных к советнику лиц. Правда, тогда через маркет, наверно, не продашь. Что-то я затрудняюсь сунуть код, в маркет, чтоб не только исходник, но и отдельным файлом можно было dll-ку прицепить. Хотя, мож я что-то не знаю...

 
Неужели есть что скрывать?
 
Vasiliy Pushkaryov #:

Попросите номер торгового счета, на котором работает ваш друг или несколько номеров. Проверка также несложная, может выглядеть примерно так:


Если совсем параноить, можно добавить еще проверку названия сервера брокера.

Также можно ограничивать по работе, только на определенных символах.

Еще вариант, усложнить код, который дал Дмитрий, добавив привязку ко времени. Например, если серверное время принадлежит октябрю - декабрю 2022 - key должен быть 908320470, если январь - март 2023 - key должен быть 9083204756 и т.д. Распишите на 5-10 лет вперед и высылайте проверочный код друзьям только на определенный промежуток времени.

Спасибо !