- Регистрация
- 1 Мар 2015
- Сообщения
- 2,178
- Баллы
- 155
Речь пойдет о том, как устроена защита десктопных программ, а также о типичной системе лицензирования и активации ключей. Активация применяется практически в любом коммерческом ПО, и то, на каких принципах она строится, довольно интересно, поэтому я решил написать эту статью.
В статье читайте:
Итак, приступим. на русском языке. Вкратце — принцип работы RSA основан на так называемой «проблеме факторизации» — сложности разложения больших чисел на множители. Действительно, имея два каких-нибудь 2000-значных простых числа X и Y, можно за микросекунду вычислить их 4000-значное произведение S = X * Y. Однако, имея это произведение S и не зная X или Y изначально, за время существования Вселенной невозможно восстановить исходные X и Y, из которых оно составлено. На качественном уровне можно считать, что для составления цифровой подписи DSA используются числа X и Y (закрытый ключ), а для проверки — общеизвестный S.
Вернемся снова к подписке
В самом начале мы говорили, что подписка — это просто более частое обращение к серверу лицензий, который возвращает все новые и новые коды активации, в то время как старые коды активации — устаревают. Для такого устаревания алгоритм создания кода активации должен быть более сложным: в коде как минимум «зашивают» даты начала и окончания срока его действия (начала — чтобы пользователь не переводил часы слишком уж назад).
Работа «подписочной» программы с сервером лицензий выглядит следующим образом:
Т.е. при работе по подписке код активации запрашивается регулярно, а в случае работы «традиционной» схемы с активацией ключа — единоразово. В этом заключается техническое различие. Конечно, сервер лицензий должен работать надежно и выдерживать высокие нагрузки, поэтому у нас их две штуки в балансировке, написаны они на Java Netty — фреймворке для создания асинхронных веб-серверов, том самом, на который недавно перевел свой поиск Twitter. Но это уже тема для отдельной статьи.
Пример создания подписочной версии вашей программы
Выше была теория о том, как может работать сервер лицензий, обслуживающий запросы на проверку статуса подписок. Теперь немного коснемся практики и посмотрим, как разработчики VMProtect Software реализовали эту теорию при создании подписочной версии протектора VMProtect для нашей .
Создание приложения HelloWorld и его MAP-файла
Для начала создадим программу типа «Hello, world!», которую и будем защищать VMProtect-ом. Будем использовать MS Visual Studio 2010: создадим в ней новый проект типа «Win32 Application» и назовем его HelloWorld. Главный файл будет выглядеть примерно вот так:
#include "stdafx.h"
…
ATOM MyRegisterClass(HINSTANCE hInstance)
{ ... }
…
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{ ... }
...Сразу переключим режим построения проекта на Release в Диспетчере конфигураций. После этого включим генерациюMAP-файла: он будет содержать адреса всех функций внутри EXE-файла, чтобы их смог потом найти VMProtect. Это делается в свойствах проекта, в русской версии путь такой: кликнуть правой кнопкой по имени проекта в Обозревателе решений, дальше выбрать Свойства конфигурации — Компоновщик — Отладка — Создавать файл сопоставления.
Теперь нажмем F5 и убедимся, что проект откомпилировался и запустился. Мы получили в директории Release 2 файла:HelloWorld.exe и HelloWorld.map, с которыми и будем работать.
Мастер регистрации продукта на сервере лицензий RentSoft
Подписочная версия программы работает в тесной связи с сервером лицензий, который, собственно, и занимается проверкой статуса ключа и определением, может программа работать или нет. Сервер лицензий должен иметь информацию о продукте: например, закрытый ключ RSA-шифрования и другие параметры лицензирования, так что продукт нужно на нем зарегистрировать.
Это довольно просто: по адресу выбираем вариант «VMProtect RentSoft Edition (бесплатно для клиентов RentSoft)», вводим свой e-mail (подтверждать его, кстати, не потребуется) и попадаем в Мастер регистрации продукта. В нем мы вводим следующие данные:
Файл лицензии необходим для привязки защищаемой программы к продукту, который мы только что зарегистрировали на сервере лицензий. Сохраните его в директорию с исходным кодом проекта — в нашем случае рядом с HelloWorld.cpp.
Запуск VMProtect для создания подписочной версии
Далее запустите VMProtect RentSoft Edition (ссылка на его скачивание его инсталлятора приведена на следующем шаге мастера). Это протектор EXE-файлов, созданный нашими партнерами — компанией VMProtect Software. Откройте через Файл — Открыть EXE-файл проекта Release/HelloWorld.exe и установите параметры, как на скриншоте (главное — укажите путь к файлу лицензии проекта):
Теперь перейдите на вкладку Процедуры для защиты и выберите на ней те процедуры и функции, которые хотите защитить VMProtect-ом (код этих процедур будет переведен в код виртуальной машины VMProtect и привязан к продукту, зарегистрированному ранее на сервере лицензий).
В нашем случае мы указали 2 функции: MyRegisterClass и WndProc — именно их теперь хакер не сможет «взломать». Обратите внимание: нужно выбрать Тип компиляции «Ультра» (самый надежный), а также поставить флажок «Привязать к серийному номеру» в «Да». Старайтесь защищать те функции программы, которые некритичны к производительности, потому что виртуальная машина работает, естественно, медленнее, чем «родной» процессор. (Не забудьте после всех манипуляций сохранить файл проекта VMProtect: в нем содержатся все опции, которые вы выбрали, чтобы при следующей защите не нужно было их выбирать заново: Файл — Сохранить проект как...)
Что будет, если злоумышленник все же сможет расшифровать код виртуальной машины VMProtect для какой-то защищенной программы (что крайне сложно само по себе — вспомните, сколько попыток было расшифровать, например, Skype, который тоже использует технологию виртуализации кода)? Это не даст ему доступа к другим программам: ведь для работы виртуальной машины требуется информация, содержащаяся в коде активации, а она для каждой программы — разная. Так что, не имея кода активации, выданного сервером лицензий, заставить программу работать физически невозможно. Подделать сервер лицензий тоже не получится — помните про технологию открытых/закрытых ключей?Наконец, выберем Проект — Компиляция и подождем несколько секунд. В результате рядом с HelloWorld.exe появится файл HelloWorld.vmp.exe — его защищенная версия. Именно этот файл и является «подписочной» версией вашего продукта.
Проверяем, что получилось
Если теперь запустить HelloWorld.vmp.exe, мы увидим вот что:
Т.е. программа при первом запуске просит пользователя ввести «код подписки», который он получил на одной из витрин RentSoft, когда подключил себе ваш продукт. Естественно, сервер лицензий RentSoft в курсе всех активных кодов подписки, что позволяет ему обрабатывать запросы от программы и проверять код, введенный пользователем.
Теперь нужно ввести код подписки. Где его взять для проверки? Мы могли бы здесь отправить читателя на витрину продукта и сказать «подпишитесь на продукт — получите код подписки», но можно поступить проще. Мастер регистрации продукта RentSoft, в котором мы только что находились, позволяет создавать тестовые подписки на сервере лицензий. Т.е. все, что вам требуется, — это нажать кнопку Создать в форме:
В итоге вы получите тестовый код подписки, который останется ввести в окно активации программы:
После этого программа запустится и больше не будет ничего спрашивать у пользователя до тех пор, пока на его счете имеются деньги (т.е. пока подписка активна).
Предположим, денег на счете для продления нет...
Что произойдет, когда у пользователя кончатся деньги и подписка заблокируется? Не обязательно ждать месяц, чтобы это увидеть: можно воспользоваться все той же формой работы с тестовыми подписками, которая теперь примет вот такой вид:
Заблокируйте тестовую подписку, после чего перезапустите программу дважды: во второй раз она заблокируется с выводом сообщения о недостатке средств на счете. (Почему дважды? Считайте, вам дается последний шанс воспользоваться продуктом перед тем, как он заблокируется.)
Возможно, вы спросите, что будет, если подписку заблокировать, а интернет — отключить, и уже после этого запустить программу. Тогда программа, естественно, не узнает, что она не может функционировать, и будет работать… но только следующие 5 дней. Через 5 дней программа потребует обязательный доступ в интернет и откажется запускаться, если связи не будет: истечет так называемый «период толерантности». Так что пользователь все равно должен будет пополнить свой счет, рано или поздно.
Что касается автоматической разблокировки при поступлении средств на счет, то вы можете проверить, как это работает, нажав кнопку «Включить» и перезапустив программу. Если связь с интернетом имеется, программа немедленно продолжит работу.
В заключение — про наши каналы продаж
Хорошая защита без высоких продаж имеет, разве что, академический интерес. Мы в RentSoft это понимаем, поэтому предоставляем разработчикам десктопного софта не только механизм подписочного лицензирования, но также и каналы продаж — витрины полусотни крупных интернет-провайдеров с общей абонентской базой более 4 млн человек. К слову, когда мы опубликовали , их было на 2 меньше: за неделю добавился крупный московский провайдер и питерский (ссылки ведут на наши витрины у них). В среднем у нас еженедельно прибывают по 2-3 провайдера, которые подключаются к нам полностью самостоятельно — мы уже не успеваем их модерировать.
Главное преимущество продажи по схеме ежемесячной подписки через интернет-провайдеров в том, что абоненты и так уже ежемесячно приносят провайдеру 400-500 рублей оплаты за интернет. Мы умеем списывать оплату за ПО (которое в этом случае выглядит, как дополнительная услуга провайдера) прямо со счета абонента. Поэтому, когда пользователь подключает вашу программу на сайте провайдера или в его личном кабинете, он оплачивает ее в том же чеке, которым платит за интернет! Одним словом, это очень эффективный канал.
Так что, если вы разрабатываете десктопный софт, но продаете его в основном на Запад, мы бесплатно предоставляем вам инструменты, чтобы попробовать продавать в России по схеме ежемесячной подписки. Мы, как любая платежная система, работаем за комиссию с совершенных пользователями транзакций, но, т.к. вы сами определяете ежемесячную цену на свой продукт, это не должно являться проблемой.
В статье читайте:
- Про «лицензию», «активацию», «хэш-функции», «цифровую подпись», «асимметричную криптографию» и (вкратце) про RSA и DSA, без формул и математики.
- Чем механизм подписки (subscription) отличается от традиционного лицензирования.
- Применение описанных принципов на примере EXE-протектора VMProtect.
Итак, приступим. на русском языке. Вкратце — принцип работы RSA основан на так называемой «проблеме факторизации» — сложности разложения больших чисел на множители. Действительно, имея два каких-нибудь 2000-значных простых числа X и Y, можно за микросекунду вычислить их 4000-значное произведение S = X * Y. Однако, имея это произведение S и не зная X или Y изначально, за время существования Вселенной невозможно восстановить исходные X и Y, из которых оно составлено. На качественном уровне можно считать, что для составления цифровой подписи DSA используются числа X и Y (закрытый ключ), а для проверки — общеизвестный S.
Вернемся снова к подписке
В самом начале мы говорили, что подписка — это просто более частое обращение к серверу лицензий, который возвращает все новые и новые коды активации, в то время как старые коды активации — устаревают. Для такого устаревания алгоритм создания кода активации должен быть более сложным: в коде как минимум «зашивают» даты начала и окончания срока его действия (начала — чтобы пользователь не переводил часы слишком уж назад).
- Регулярно и в фоновом режиме программа делает попытку обращения к серверу лицензий, чтобы получить от него свежий код активации. На сервер передается ключ и идентификатор оборудования, упрощенно —
GET /license_server?key=abcdef&hwid=1234 - Если попытка была неудачной, то ничего не происходит — никаких сообщений не выдается.
- В случае же удачи свежий код активации, выданный сервером, записывается в какое-нибудь постоянное хранилище (например, в Реестр) — все равно он не представляет интереса для злоумышленника, т.к. он не сможет его использовать у себя (код активации зависит от идентификатора оборудования, который будет у злоумышленника другим).
- Независимо от этого программа берет текущий код активации из постоянного хранилища и проверяет его цифровую подпись, используя ключ, идентификатор оборудования и открытый параметр salt1. Если код активации верен, то программа продолжает работать (возможно, попутно извлекая из кода какие-то необходимые данные — например, параметры шифрования кода виртуальной машины, как это делается в VMProtect).
Т.е. при работе по подписке код активации запрашивается регулярно, а в случае работы «традиционной» схемы с активацией ключа — единоразово. В этом заключается техническое различие. Конечно, сервер лицензий должен работать надежно и выдерживать высокие нагрузки, поэтому у нас их две штуки в балансировке, написаны они на Java Netty — фреймворке для создания асинхронных веб-серверов, том самом, на который недавно перевел свой поиск Twitter. Но это уже тема для отдельной статьи.
Пример создания подписочной версии вашей программы
Выше была теория о том, как может работать сервер лицензий, обслуживающий запросы на проверку статуса подписок. Теперь немного коснемся практики и посмотрим, как разработчики VMProtect Software реализовали эту теорию при создании подписочной версии протектора VMProtect для нашей .
Создание приложения HelloWorld и его MAP-файла
Для начала создадим программу типа «Hello, world!», которую и будем защищать VMProtect-ом. Будем использовать MS Visual Studio 2010: создадим в ней новый проект типа «Win32 Application» и назовем его HelloWorld. Главный файл будет выглядеть примерно вот так:
#include "stdafx.h"
…
ATOM MyRegisterClass(HINSTANCE hInstance)
{ ... }
…
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{ ... }
...Сразу переключим режим построения проекта на Release в Диспетчере конфигураций. После этого включим генерациюMAP-файла: он будет содержать адреса всех функций внутри EXE-файла, чтобы их смог потом найти VMProtect. Это делается в свойствах проекта, в русской версии путь такой: кликнуть правой кнопкой по имени проекта в Обозревателе решений, дальше выбрать Свойства конфигурации — Компоновщик — Отладка — Создавать файл сопоставления.
Теперь нажмем F5 и убедимся, что проект откомпилировался и запустился. Мы получили в директории Release 2 файла:HelloWorld.exe и HelloWorld.map, с которыми и будем работать.
Мастер регистрации продукта на сервере лицензий RentSoft
Подписочная версия программы работает в тесной связи с сервером лицензий, который, собственно, и занимается проверкой статуса ключа и определением, может программа работать или нет. Сервер лицензий должен иметь информацию о продукте: например, закрытый ключ RSA-шифрования и другие параметры лицензирования, так что продукт нужно на нем зарегистрировать.
Это довольно просто: по адресу выбираем вариант «VMProtect RentSoft Edition (бесплатно для клиентов RentSoft)», вводим свой e-mail (подтверждать его, кстати, не потребуется) и попадаем в Мастер регистрации продукта. В нем мы вводим следующие данные:
- Название продукта, краткое и подробное описание (можно использовать HTML).
- Изображение коробки с продуктом (или его логотип).
- Выбираем желаемую стоимость подписки в месяц — например, 79 рублей.
Файл лицензии необходим для привязки защищаемой программы к продукту, который мы только что зарегистрировали на сервере лицензий. Сохраните его в директорию с исходным кодом проекта — в нашем случае рядом с HelloWorld.cpp.
Запуск VMProtect для создания подписочной версии
Далее запустите VMProtect RentSoft Edition (ссылка на его скачивание его инсталлятора приведена на следующем шаге мастера). Это протектор EXE-файлов, созданный нашими партнерами — компанией VMProtect Software. Откройте через Файл — Открыть EXE-файл проекта Release/HelloWorld.exe и установите параметры, как на скриншоте (главное — укажите путь к файлу лицензии проекта):
Теперь перейдите на вкладку Процедуры для защиты и выберите на ней те процедуры и функции, которые хотите защитить VMProtect-ом (код этих процедур будет переведен в код виртуальной машины VMProtect и привязан к продукту, зарегистрированному ранее на сервере лицензий).
В нашем случае мы указали 2 функции: MyRegisterClass и WndProc — именно их теперь хакер не сможет «взломать». Обратите внимание: нужно выбрать Тип компиляции «Ультра» (самый надежный), а также поставить флажок «Привязать к серийному номеру» в «Да». Старайтесь защищать те функции программы, которые некритичны к производительности, потому что виртуальная машина работает, естественно, медленнее, чем «родной» процессор. (Не забудьте после всех манипуляций сохранить файл проекта VMProtect: в нем содержатся все опции, которые вы выбрали, чтобы при следующей защите не нужно было их выбирать заново: Файл — Сохранить проект как...)
Что будет, если злоумышленник все же сможет расшифровать код виртуальной машины VMProtect для какой-то защищенной программы (что крайне сложно само по себе — вспомните, сколько попыток было расшифровать, например, Skype, который тоже использует технологию виртуализации кода)? Это не даст ему доступа к другим программам: ведь для работы виртуальной машины требуется информация, содержащаяся в коде активации, а она для каждой программы — разная. Так что, не имея кода активации, выданного сервером лицензий, заставить программу работать физически невозможно. Подделать сервер лицензий тоже не получится — помните про технологию открытых/закрытых ключей?Наконец, выберем Проект — Компиляция и подождем несколько секунд. В результате рядом с HelloWorld.exe появится файл HelloWorld.vmp.exe — его защищенная версия. Именно этот файл и является «подписочной» версией вашего продукта.
Проверяем, что получилось
Если теперь запустить HelloWorld.vmp.exe, мы увидим вот что:
Т.е. программа при первом запуске просит пользователя ввести «код подписки», который он получил на одной из витрин RentSoft, когда подключил себе ваш продукт. Естественно, сервер лицензий RentSoft в курсе всех активных кодов подписки, что позволяет ему обрабатывать запросы от программы и проверять код, введенный пользователем.
Теперь нужно ввести код подписки. Где его взять для проверки? Мы могли бы здесь отправить читателя на витрину продукта и сказать «подпишитесь на продукт — получите код подписки», но можно поступить проще. Мастер регистрации продукта RentSoft, в котором мы только что находились, позволяет создавать тестовые подписки на сервере лицензий. Т.е. все, что вам требуется, — это нажать кнопку Создать в форме:
В итоге вы получите тестовый код подписки, который останется ввести в окно активации программы:
После этого программа запустится и больше не будет ничего спрашивать у пользователя до тех пор, пока на его счете имеются деньги (т.е. пока подписка активна).
Предположим, денег на счете для продления нет...
Что произойдет, когда у пользователя кончатся деньги и подписка заблокируется? Не обязательно ждать месяц, чтобы это увидеть: можно воспользоваться все той же формой работы с тестовыми подписками, которая теперь примет вот такой вид:
Заблокируйте тестовую подписку, после чего перезапустите программу дважды: во второй раз она заблокируется с выводом сообщения о недостатке средств на счете. (Почему дважды? Считайте, вам дается последний шанс воспользоваться продуктом перед тем, как он заблокируется.)
Возможно, вы спросите, что будет, если подписку заблокировать, а интернет — отключить, и уже после этого запустить программу. Тогда программа, естественно, не узнает, что она не может функционировать, и будет работать… но только следующие 5 дней. Через 5 дней программа потребует обязательный доступ в интернет и откажется запускаться, если связи не будет: истечет так называемый «период толерантности». Так что пользователь все равно должен будет пополнить свой счет, рано или поздно.
Что касается автоматической разблокировки при поступлении средств на счет, то вы можете проверить, как это работает, нажав кнопку «Включить» и перезапустив программу. Если связь с интернетом имеется, программа немедленно продолжит работу.
В заключение — про наши каналы продаж
Хорошая защита без высоких продаж имеет, разве что, академический интерес. Мы в RentSoft это понимаем, поэтому предоставляем разработчикам десктопного софта не только механизм подписочного лицензирования, но также и каналы продаж — витрины полусотни крупных интернет-провайдеров с общей абонентской базой более 4 млн человек. К слову, когда мы опубликовали , их было на 2 меньше: за неделю добавился крупный московский провайдер и питерский (ссылки ведут на наши витрины у них). В среднем у нас еженедельно прибывают по 2-3 провайдера, которые подключаются к нам полностью самостоятельно — мы уже не успеваем их модерировать.
Главное преимущество продажи по схеме ежемесячной подписки через интернет-провайдеров в том, что абоненты и так уже ежемесячно приносят провайдеру 400-500 рублей оплаты за интернет. Мы умеем списывать оплату за ПО (которое в этом случае выглядит, как дополнительная услуга провайдера) прямо со счета абонента. Поэтому, когда пользователь подключает вашу программу на сайте провайдера или в его личном кабинете, он оплачивает ее в том же чеке, которым платит за интернет! Одним словом, это очень эффективный канал.
Так что, если вы разрабатываете десктопный софт, но продаете его в основном на Запад, мы бесплатно предоставляем вам инструменты, чтобы попробовать продавать в России по схеме ежемесячной подписки. Мы, как любая платежная система, работаем за комиссию с совершенных пользователями транзакций, но, т.к. вы сами определяете ежемесячную цену на свой продукт, это не должно являться проблемой.