Защита приложений с использованием ключей

Ключевая защита

 

Ключевая защита реализует защиту приложения от не лицензионного использования, и в частности от множественного использования с различными установками программы регистрационной ключевой информации, относящейся к одной лицензии. Суть механизма защиты сводится к следующему: при обфускации в приложение встраивается модуль проверки лицензии на право использования приложения и открытый RSA ключ разработчика. Лицензия представляет собой файл, содержащий подписанную закрытым RSA ключом разработчика информацию о данной лицензии, а именно:

  • номер лицензии;
  • имя пользователя и название компании;
  • дата выдачи;
  • тип привязки;
  • привязку.

 

Под привязкой понимается некоторая информация, позволяющая уникально идентифицировать пользовательское рабочее место. Inquartos Obfuscator поддерживает следующие типы привязок:

  • привязка к имени компьютера пользователя;
  • привязка к имени пользователя;
  • привязка к Windows ProductID;
  • привязка к аппаратному идентификатору ключа eTokenID;
  • привязка к аппаратному обеспечению;
  • привязка к идентификатору процессора;
  • привязка к идентификатору жесткого диска.

 

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

 

Настройка параметров ключевой защиты

 

Внешний вид вкладки Ключевая защита (с пометками)

 

Опции:

  • Разрешить ключевую защиту - Включение режима ключевой защиты при обфускации;
  • Сборка - защищаемый модуль;
  • Опции - выбор действия для сборки;
  • Опции\нет - указывает, что для данной сборки не требуется действий;
  • Опции\Вставить проверку лицензии пользователя - указывает, что в данную сборку при обфускации нужно встроить проверку лицензии (без запроса);
  • Опции\Вставить диалог запроса лицензии пользователя - указывает, что в данную сборку при обфускации нужно встроить проверку лицензии с запросом в случае ее отсутствия;
  • Длина RSA ключа - задает длину ключа (512,1024,2048 бит), используемую при генерации ключевой пары (RSA);
  • Директория лицензии - задает место на диске, где будет хранить лицензия (%APPDATA%\TestProject\License.lic,%ALLUSERSPROFILE%\Application Data\TestProject\ProjectLicense.lic,%TEMP%\TestProjectLicense.lic);
  • Почта для запроса лицензии - почтовый адрес по которому пользователь будет отправлять запрос на лицензию;
  • Действие при отсутствии лицензии - возможны следующие действия:
    • close - закрыть
    • time:dd - завершить программу по истечении времени, где dd - время в минутах до автоматического завершения программы
    • continue - ничего не делать
  • Перегенерировать ключи - Перегенерирует RSA ключи и сохраняет их в проекте;
  • Создать лицензию для пользователя - Генерация пользовательской лицензии;
     

    Тип привязки:

    Пример лицензии:

       
    ------- LICENSE DESCRIPTION -------
    Project=TestProject
    Company=Inquartos
    User=user
    Mail=support@inquartos.ru
    BindingType=HardwareId
    BindingID=9DC4-2C35-5BED-A294-7309-059A-A0B4-A8E5
    
    ------------- LICENSE -------------
    fnOcR30euw9THcvfIiM14w9240h0zIQw6UR
    bINvDIcWb1WHw83qaJJ7HIn6uHz9B12hgyE
    e4BGL8S9CCNIXxRPoku18kLIroWkj7gYAU1
    ozgWYRxzbuvWwSbRvtQ2o8nT2zy9akKjUX/
    bll95F0F3K3wGlRF7MWVOa2EhBWr3zk=
    -----------------------------------
    
  • Проверить лицензию - проверяет корректность лицензии;


Пример результата обфускации с опцией Ключевая защита: при запуске приложения с отсутствующей лицензией появляется окно запроса.

Исходный код: TestProject-key_protection.zip

 

 

Собственная проверка лицензии

 

Для реализации собственной проверки лицензий нужно в коде объявить две статические функции (заглушки: Inquartos_VerifyLicense_IsLicenseCorrect, Inquartos_VerifyLicense_IsLicenseCorrectQueryDlg) и вызывать их для проверки, после обфускации вызовы этих функций будут заменены на реальные вызовы проверок.

 

Исходный код: CustomTestLicense.zip

 

   public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //
            // Проверить лицензию
            //
            if (Inquartos_VerifyLicense_IsLicenseCorrect())
                MessageBox.Show("ok");
            else
                MessageBox.Show("no license");

        }

        private void button2_Click(object sender, EventArgs e)
        {
            //
            // Проверить лицензию с запросом в случае ее отсутствия
            //
            if (Inquartos_VerifyLicense_IsLicenseCorrectQueryDlg())
                MessageBox.Show("ok");
            else
                MessageBox.Show("no license");
        }


        /// 
        /// Заглушка проверки лицензии
        /// 
        /// 
        internal static bool Inquartos_VerifyLicense_IsLicenseCorrect()
        {
            return true;
        }

        /// 
        /// Заглушка проверки лицензии с запросом диалока
        /// 
        /// 
        internal static bool Inquartos_VerifyLicense_IsLicenseCorrectQueryDlg()
        {
            return true;
        }
    }

Заглушки для VB.NET


Public Shared Function Inquartos_VerifyLicense_IsLicenseCorrect() As Boolean
        Return True
End Function

Public Shared Function Inquartos_VerifyLicense_IsLicenseCorrectQueryDlg() As Boolean
        Return True
End Function      
 


 

 

 

 
25.11.2008
 
 
 
 
10.12  .NET Reactor
15.11  n
15.11  C# ClickOnce
 
01.08  Task Context
01.08  XLSX в Mono