diff options
Diffstat (limited to 'help/ru/manager')
31 files changed, 3457 insertions, 0 deletions
diff --git a/help/ru/manager/activation.htm b/help/ru/manager/activation.htm new file mode 100644 index 0000000..302a559 --- /dev/null +++ b/help/ru/manager/activation.htm @@ -0,0 +1,89 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Система Активации</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Система Активации</h1> + + <h3>Что Это?</h3> + + <p>Активация - это двухэтапный процесс регистрации приложения. На + первом этапе (обычно после покупки) покупатель получает код + активации (выглядит как XXXX-YYYY-ZZZZ). На втором этапе + покупатель вводит этот код в приложение, приложение соединяется + через Интернет с сервером производителя ПО, сервер проверяет код + активации и выдает приложению серийный номер, связанный с этим + кодом активации и обычно привязанный к оборудованию + пользователя.</p> + + <p>Такой подход позволяет контролировать использование лицензий + покупателями, предотвращать утечки лицензий, а также многое + другое, например демо-лицензии или надежные триальные + периоды.</p> + + <h3>Зачем Она Мне Нужна?</h3> + + <p>Система активации дает производителю ПО достаточно широкие + возможности, например:</p> + + <ul> + <li><strong>Короткие серийные номера</strong> - длинные + серийные номера хороши всем, кроме длины. Пользователи могут + ошибиться при вводе, почтовые программы иногда портят некоторые + символы, однако только длинные серийные номера позволяют хранить + достаточный объем дополнительной информации. Коды активации + позволяют решить все проблемы длинных серийных номеров, не + влияя на их положительные стороны.</li> + + <li><strong>Контроль количества инсталляций</strong> - все + активации доступны производителю онлайн в реальном времени. Их + можно отслеживать, анализировать, блокировать, оказывать + поддержку пользователям и т.д.</li> + + <li><strong>Триалы</strong> - можно создавать серийные номера, + ограниченные по времени, используя "режимы" продуктов - + "modes".</li> + + <li><strong>Подписки</strong> - подписки похожи на триалы, + однако стоят денег. Вы можете продавать пользователю право + работать с программой в течение определенного времени, как это + делают производители антивирусов - просто продавайте коды + активации на очередной год обслуживания.</li> + </ul> + + <p>Более подробная информация о системе активации доступна в + соответствующем <a href= + "http://vmpsoft.com/products/web-license-manager/" target= + "_blank">разделе</a> нашего сайта.</p> + + <h3>Что Потребуется Сделать?</h3> + + <p>VMProtect Ultimate дополнен несколькими <a href= + "activation/api.htm">функциями</a>, которые позволяют + сравнительно легко реализовать как онлайн, так и оффлайн + активацию. Вам также потребуется установленный на сервере + <a href="activation/weblm.htm">Web License Manager</a>. Наконец, + потребуется <a href="activation/vmprotect.htm">настроить</a> + проект защиты в VMProtect, чтобы модуль активации знал адрес + сервера WebLM.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/activation/api.htm b/help/ru/manager/activation/api.htm new file mode 100644 index 0000000..8a22254 --- /dev/null +++ b/help/ru/manager/activation/api.htm @@ -0,0 +1,223 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>API Активации</title> + <style type="text/css"> +/*<![CDATA[*/ + th {text-align:left;} + table {border-collapse:collapse; margin-top: 4px;} + td,th {border: 1px solid #B0B0B0; padding-left:10;padding-right:10;} + /*]]>*/ + </style> +</head> + +<body> + <h1>API Активации</h1> + + <p>API Активации содержит всего 4 функции. Две предназначены для + онлайн-активации и две для оффлайн, когда на компьютере + отсутствует доступ в Интернет. API Активации предназначено для + взаимодействия с Web License Manager, так что разработчику все + равно необходимо вызывать API системы лицензирования, чтобы + использовать серийные номера, полученные от WebLM.</p><strong id= + "VMProtectActivateLicense">VMProtectActivateLicense</strong> + + <p>Функция передает код активации на сервер и возвращает серийный + номер, подходящий для этого конкретного компьютера. В противном + случае возвращается <a href="#codes">код ошибки</a>.</p> + <pre class="code">int VMProtectActivateLicense(const char *code, char *serial, int size); +</pre> + + <p>Параметр <strong>code</strong> содержит код активации, который + получен от Web License Manager в процессе покупки лицензии. + Параметр <strong>serial</strong> указывает на блок памяти размера + <strong>size</strong>, в который будет помещен сгенерированный + WebLM серийный номер.</p><strong id= + "VMProtectDeactivateLicense">VMProtectDeactivateLicense</strong> + + <p>Функция передает серийный номер на сервер для деактивации. + Возможные коды возврата перечислены <a href= + "#codes">ниже</a>.</p> + <pre class="code">int VMProtectDeactivateLicense(const char *serial); +</pre> + + <p>Параметр <strong>serial</strong> содержит серийный номер (не + код активации), полученный ранее от WebLM в процессе + активации.</p><strong id= + "VMProtectGetOfflineActivationString">VMProtectGetOfflineActivationString</strong><br /> + + <strong id= + "VMProtectGetOfflineDeactivationString">VMProtectGetOfflineDeactivationString</strong> + + <p>Эти две функции работают практически аналогично двум + предыдущим с той лишь разницей, что они не пытаются подключиться + к серверу WebLM. Вместо этого они возвращают блок текста, который + необходимо скопировать на компьютер где есть доступ в Интернет, + открыть там форму оффлайн-активации WebLM и вставить туда этот + текст.</p> + <pre class="code">int VMProtectGetOfflineActivationString(const char *code, char *buf, int size); +int VMProtectGetOfflineDeactivationString(const char *serial, char *buf, int size); +</pre> + + <p>Параметры <strong>code</strong> и <strong>serial</strong> + аналогичны параметрам онлайн-версий функций, параметр + <strong>buf</strong> должен указывать на буфер размером 1000 байт + или больше, туда будет скопирован текстовый блок для формы + оффлайн-активации. Возможные коды ошибок перечислены <a href= + "#codes">ниже</a>.</p> + + <h3 id="codes">Возможные Коды Ошибок</h3> + + <table border="1" cellspacing="0" cellpadding="2"> + <tr> + <th>Код</th> + + <th>Значение</th> + + <th>Описание</th> + </tr> + + <tr> + <td>ACTIVATION_OK</td> + + <td>0</td> + + <td>Активация прошла успешно, переменная + <strong>serial</strong> содержит серийный номер.</td> + </tr> + + <tr> + <td>ACTIVATION_SMALL_BUFFER</td> + + <td>1</td> + + <td>Буфер для серийного номера слишком маленький. Минимальный + размер буфера вычисляется по формуле: bits / 8 * 3 / 2 + N, + где bits - длина RSA ключа в битах, а N - "константа + безопасности" - дополнительное количество байт на случай + переносов строк и прочих спец-символов. Рекомендуется + использовать как минимум 10.</td> + </tr> + + <tr> + <td>ACTIVATION_NO_CONNECTION</td> + + <td>2</td> + + <td>Модуль активации не смог подключиться к Web License + Manager.</td> + </tr> + + <tr> + <td>ACTIVATION_BAD_REPLY</td> + + <td>3</td> + + <td>Сервер активации вернул неожиданный результат. Это + означает проблемы конфигурации сервера, неправильный url + сервера активации или попытку взлома.</td> + </tr> + + <tr> + <td>ACTIVATION_BANNED</td> + + <td>4</td> + + <td>Этот код активации заблокирован на сервере производителем + ПО через интерфейс WebLM (например, из-за + утечки кода активации с пиратской копией). Не путать с ACTIVATION_ALREADY_USED.</td> + </tr> + + <tr> + <td>ACTIVATION_CORRUPTED</td> + + <td>5</td> + + <td>Что-то пошло совсем не так. Ошибка выдается системой + самопроверки модуля активации и с высокой вероятностью + означает попытку взлома. В случае получения этой ошибки + дальнейшие операции с серийными номерами и активацией не + могут считаться безопасными.</td> + </tr> + + <tr> + <td>ACTIVATION_BAD_CODE</td> + + <td>6</td> + + <td>Данный код не найден в базе данных сервера активаций. + Возможно пользователь ошибся при вводе кода, так что можно + попросить его проверить правильность ввода данных.</td> + </tr> + + <tr> + <td>ACTIVATION_ALREADY_USED</td> + + <td>7</td> + + <td>Счетчик активаций этого кода дошел до нуля и дальнейшие + активации невозможны. Это не обозначает, что код плохой или + заблокирован - код хороший. Пользователю нужно связаться с + производителем ПО и докупить необходимое количество лицензий + или же деинсталлировать программу на других компьютерах, + чтобы увеличить значение счетчика в базе данных.</td> + </tr> + + <tr> + <td>ACTIVATION_SERIAL_UNKNOWN</td> + + <td>8</td> + + <td>Ошибка деактивации. Означает, что данный серийный + номер не найден в базе данных сервера. Соответственно, + деактивация не может быть проведена успешно.</td> + </tr> + + <tr> + <td>ACTIVATION_EXPIRED</td> + + <td>9</td> + + <td>Ошибка активации. Означает, что период действия кода активации истек.</td> + </tr> + + <tr> + <td>ACTIVATION_NOT_AVAILABLE</td> + + <td>10</td> + + <td>Ошибка означает, что активация/деактивация недоступна.</td> + </tr> + + </table> + + <h3>Маленькие хитрости</h3> + + <p>API Активации достаточно простое, так что с ним не должно + возникнуть сложностей. Не забудьте предоставить пользователям + интерфейс для оффлайн-активации, если онлайн-активация + завершилась неудачей из-за проблем с доступом в интернет. Также + не забывайте, что API Активации не сохраняет полученный серийный + номер и не передает его модулю лицензирования - это задача + разработчика. Нет необходимости вызывать API Активации при каждом + запуске приложения - достаточно вызвать его один раз, получить + серийный номер от WebLM, сохранить его в удобном месте и в + дальнейшем использовать только его.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/activation/vmprotect.htm b/help/ru/manager/activation/vmprotect.htm new file mode 100644 index 0000000..f0a3440 --- /dev/null +++ b/help/ru/manager/activation/vmprotect.htm @@ -0,0 +1,38 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Настройка Активации в VMProtect</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Настройка Активации в VMProtect</h1> + + <p>Для работы <a href="api.htm">API Активации</a> требуется адрес + сервера WebLM, так что необходимо задать его в настройках проекта + VMProtect. Чтобы сделать это, запустите VMProtect и перейдите в + раздел настроек:</p><br /><img src="../../images/activation_setup.png" alt="Настройка сервера активации" /> + + <p>Введите адрес в поле "Сервер активации". Адрес должен + выглядеть так: http://<em>yourserver</em>/<em>weblm + path</em>/activate.php. Это первое место, которое следует проверить, если в дальнейшем Вы столкнетесь + с ошибками в процессе онлайн-активации.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/activation/weblm.htm b/help/ru/manager/activation/weblm.htm new file mode 100644 index 0000000..35cf308 --- /dev/null +++ b/help/ru/manager/activation/weblm.htm @@ -0,0 +1,55 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Поддержка Активации в Web License Manager</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Поддержка Активации в Web License Manager</h1> + + <p>Подробно Web License Manager описан <a href= + "http://vmpsoft.com/products/web-license-manager/" target= + "_blank">на сайте</a>, здесь даны минимальные инструкции по + созданию кода активации для последующего использования с API + Активации.</p> + + <p>Для начала войдите в Web License Manager (можно использовать + демо-версию на нашем сайте) и создайте продукт. Затем + экспортируйте продукт как проект VMProtect, чтобы иметь + возможность использовать его для настроек лицензирования и + активации. После того как проект настроен, необходимые проверки + добавлены в код и исполняемый файл защищен, нажмите ссылку "Add + New Code" в левой панели WebLM:</p> + <p><img src="../../images/weblm_1.png" /></p> + + <p>Выберите нужный продукт в верхнем выпадающем списке и + заполните остальные поля формы данными, которые Вы хотите + поместить в серийный номер. Затем нажмите кнопку "Save". Вы + увидите код активации, который можно использовать для отладки API + Активации.</p> + <p><img src="../../images/weblm_2.png" /></p> + + <p>Множество других возможностей Web License Manager (таких, как интеграция с регистраторами или + автоматическая генерация кодов активации) можно подробно изучить в <a href= + "http://vmpsoft.com/products/web-license-manager/" target= + "_blank">онлайн-версии руководства пользователя</a>.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/features.htm b/help/ru/manager/features.htm new file mode 100644 index 0000000..c717767 --- /dev/null +++ b/help/ru/manager/features.htm @@ -0,0 +1,138 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Возможности системы лицензирования VMProtect</title> +</head> + +<body> + <h1>Возможности системы лицензирования VMProtect</h1> + + <h3>Надежные серийные номера</h3> + + <p>Система лицензирования использует асимметричные алгоритмы для + шифрования серийных номеров. Номер шифруется приватным ключом, + который хранится только у разработчика продукта. Защищаемый + продукт расшифровывает номер публичным ключом и проверяет его. В + силу длины используемых ключей (от 1024 бит для RSA) практически + невозможно подобрать закрытый ключ и создать генератор ключей для + продукта.</p> + + <h3 id="lock">Привязка кода к серийному номеру</h3> + + <p>VMProtect позволяет исполнять часть кода программы на + виртуальной машине. Набор команд виртуальной машины меняется при + каждой сборке защищаемой программы. Система лицензирования + позволяет зашифровать часть команд виртуальной машины ключом, + который хранится в серийном номере. Таким образом, даже если + хакер исправит условный переход в программе, код все равно не + будет работать без корректного серийного номера. А так как + расшифровка кода также происходит под управлением виртуальной + машины, то даже наличие серийного номера не дает возможности + легко проанализировать алгоритм + расшифровки.</p> + + <h3>Ограничение периода бесплатных обновлений</h3> + + <p>Система лицензирования позволяет записать в ключ такую дату, + что версии приложения, собранные после этой даты, не будут + работать с этим ключом. Это позволяет ограничивать период + бесплатных обновлений продукта. Например при продаже в ключ + записывается текущая дата плюс один год и пользователь может + скачивать с сайта новые версии в течение года. Ключ будет + работать в этих версиях. По истечение года у пользователя будет + выбор: пользоваться последней "рабочей" версией программы или + купить обновление еще на один год.</p> + + <h3>Срок годности ключа</h3> + + <p>Система лицензирования позволяет записать в ключ дату, после + которой ключ перестает работать. Это удобно для продажи + продуктов, требующих периодического обновления. Например при + продаже в серийный номер помещается текущая дата плюс год и + программа будет работать у пользователя в течение года. В отличие + от ограничения периода бесплатных обновлений, в этом случае у + пользователя нет выбора - ему придется купить новую лицензию, + если он хочет продолжать пользоваться + программой.</p> + + <h3>Ограничение времени работы программы</h3> + + <p>Система лицензирования позволяет ограничить время работы + экземпляра программы. Это бывает полезно для демонстрационных + задач. Например покупатель хочет получить для тестирования + полноценную копию программы. В этом случае можно передать ему + серийный номер, который ограничит время работы программы, скажем, + десятью минутами. По истечение этого времени программа прекратит + свою работу. Такая схема подходит для демонстрационных версий + различных серверных приложений, где простой перезапуск приложения + будет неудобен.</p> + + <h3>Привязка к оборудованию</h3> + + <p>Система лицензирования позволяет получить идентификатор + оборудования пользователя на основе процессора, сетевых плат и + информации операционной системы. Серийный номер может быть создан + так, что он будет работать только на оборудовании с этим + идентификатором. Это позволяет ограничить использование одной + лицензии на нескольких компьютерах.</p> + + <h3>Черный список</h3> + + <p>В случае дискредитации серийного номера, система + лицензирования позволяет занести такой номер в черный список, + после чего номер не будет работать в следующих версиях + приложения.</p> + + <h3>Хранение данных</h3> + + <p>Система лицензирования позволяет хранить в серийном номере и + выдавать защищаемой программе следующие данные: имя пользователя, + e-mail, а также до 255 байт произвольных данных (т.н. "данные + пользователя"). Это может быть использовано для показа в диалоге + "О Программе", для реализации дополнительных проверок серийного + номера, для хранения констант, доступных только в + зарегистрированной версии продукта и т.п.</p> + + <h3>Ограниченние работы демо-версии по времени</h3> + + <p>Используя систему <a href="activation.htm">активации</a> + производитель ПО может автоматически создавать ограниченные по времени и привязанные к оборудованию + пользователя серийные номера. Это позволяет организовать надежно защищенный + демо-период для приложения, так как VMProtect не прячет триальные + метки на компьютере пользователя, а вместо этого генерирует + полноценный, но ограниченный по времени серийный номер. Активация + обычно производится непосредственно через интернет, но в API активации предусмотрен + и оффлайновый режим.</p><br /> + <hr noshade="noshade" size="1" /> + + <h1>Чего система лицензирования не умеет и + почему?</h1> + + <h3>100%-но надежная привязка к оборудованию</h3> + + <p>Несмотря на то, что система лицензирования позволяет + привязаться к идентификатору оборудования, следует понимать, что + большинство данных об оборудовании получается средствами + операционной системы, которые могут быть перехвачены хакером с + целью изменения данных. Система лицензирования применяет ряд + схем, позволяющих минимизировать такие риски, однако если вам + требуется 100%-но надежная привязка к оборудованию, мы + рекомендуем воспользоваться решением на базе USB-ключей, с + которыми также может работать VMProtect.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/howitworks.htm b/help/ru/manager/howitworks.htm new file mode 100644 index 0000000..0ebb8c6 --- /dev/null +++ b/help/ru/manager/howitworks.htm @@ -0,0 +1,61 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Как работает система лицензирования?</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Как работает система лицензирования?</h1> + + <h3>Защита приложения</h3> + + <p>VMProtect в процессе защиты приложения интегрирует в него код + проверки серийных номеров. При этом используется информация, + указанная в секции "Лицензии" раздела "Проект". В приложение помещается + публичный ключ продукта, при помощи которого будет осуществляться + расшифровка серийных номеров. Также в приложение помещается дата + защиты и ряд дополнительных данных, необходимых для работы + системы лицензирования.</p> + + <h3>Создание серийных номеров</h3> + + <p>Серийные номера могут быть созданы в секции <a href= + "licenses.htm">"Лицензии"</a> раздела "Проект" или при помощи отдельных приложений + - <a href="keygen/index.htm">генераторов ключей</a>. Серийный + номер - это набор данных о покупателе, зашифрованный асимметричным + алгоритмом. Серийный номер передается покупателю, тот вводит его + в программу, после чего он проверяется модулем + лицензирования.</p> + + <h3>Проверка серийного номера в программе</h3> + + <p>Модуль лицензирования предоставляет защищаемой программе + <a href="usage/api.htm">несколько функций</a> для работы с + серийными номерами. Программа передает модулю лицензирования + серийный номер и запрашивает информацию о нем. Модуль + лицензирования выдает краткое состояние серийного номера + (рабочий/нерабочий и почему), а также может выдать подробную + информацию о серийном номере, такую как имя пользователя, e-mail, + срок действия номера и т.д. Защищаемая программа анализирует + информацию о серийном номере и принимает решение о продолжении + или завершении работы, а также об ограничениях + функционала.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/index.htm b/help/ru/manager/index.htm new file mode 100644 index 0000000..3cccf75 --- /dev/null +++ b/help/ru/manager/index.htm @@ -0,0 +1,43 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Система лицензирования</title> +</head> + +<body> + <h1>Система лицензирования</h1> + + <p>Система лицензирования решает задачи создания и проверки + серийных номеров. Поддерживаются ограничения работы защищаемого + ПО по дате и времени, привязка к оборудованию, шифрование кода + серийным номером, ограничение периода бесплатных обновлений и + многое другое. Система построена на асимметричных алгоритмах + шифрования, что минимизирует вероятность создания генераторов + серийных номеров. Для защиты системы лицензирования применяется + виртуализация VMProtect, что минимизирует вероятность взлома на + уровне кода и создания патчей.</p> + + <ul> + <li><a href="features.htm">Возможности системы лицензирования</a></li> + <li><a href="howitworks.htm">Схема работы системы лицензирования</a></li> + <li><a href="licenses.htm">Управление лицензиями: создание, изменение, блокировка и т.п.</a></li> + <li><a href="usage/index.htm">Пример интеграции в приложение</a></li> + <li><a href="keygen/index.htm">Автоматическое создание серийных номеров</a></li> + </ul> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/keygen/algorithms.htm b/help/ru/manager/keygen/algorithms.htm new file mode 100644 index 0000000..05b9bc3 --- /dev/null +++ b/help/ru/manager/keygen/algorithms.htm @@ -0,0 +1,79 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Алгоритмы шифрования серийных номеров</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Алгоритмы шифрования серийных номеров</h1> + + <p>Надежность ключей системы лицензирования основывается на + применении асимметричных алгоритмов шифрования. В текущей версии + реализован алгоритм RSA с длиной ключа от 1024 до 16384 бит. В + будущих версиях планируется добавление других алгоритмов, + основанных на ECC, а также схем, совмещающих симметричные и + асимметричные шифры.</p> + + <p>Используемый алгоритм уникален для каждого продукта. Ключи, + созданные с одним алгоритмом, не подойдут к другому, поэтому + смена алгоритмов после создания хоть одной лицензии не + допускается. Модуль защиты, располагающийся в защищаемой + программе, "знает" каким алгоритмом должен быть зашифрован + серийный номер и не примет ключ, созданный другим алгоритмом или + тем же алгоритмом, но с другими параметрами (скажем, с другой + длиной ключа).</p> + + <h3>Алгоритм RSA</h3> + + <p>Шифрование серийного номера алгоритмом RSA происходит по + следующей схеме:</p> + + <ul> + <li><strong>Добавление случайных данных в начало + номера</strong> - метод основывается на RFC2313, однако + реализация немного отличается от описаной там. В начало + серийного номера добавляютя байты: 00 02 NN...NN 00, где NN..NN + - от 8 до 16 случайных ненулевых байт. Количество байт + выбирается случайным, однако принимается во внимание длина + серийного номера и максимальная вместительность ключа.</li> + + <li><strong>Добавление случайных данных в конец номера</strong> + - окончательное количество байт в серийном номере должно + равняться количеству бит в ключах алгоритма, деленному на 8. + Серийный номер дополняется до этого числа байт случайными + данными. В результате получается следующий формат серийного + номера: 00 02 NN..NN 00 DD..DD MM..MM, где NN - набор случайных + ненулевых байтов, DD - исходный серийный номер, MM -набор + случайных байтов (в т.ч. и нулевых). Суммарная длина + последовательности должна равняться количеству бит, + применяемому в алгоритме, деленному на 8.</li> + + <li><strong>Шифрование</strong> - производится по стандатной + схеме, реализованной во многих библиотеках, работающих с + большими числами. Генератор на PHP содержит всю необходимую + информацию в открытом виде.</li> + + <li><strong>Упаковка</strong> - полученный после шифрования + набор байт кодируется в base-64 - это и есть серийный номер, + который отправляется покупателю.</li> + </ul><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/keygen/index.htm b/help/ru/manager/keygen/index.htm new file mode 100644 index 0000000..2650150 --- /dev/null +++ b/help/ru/manager/keygen/index.htm @@ -0,0 +1,121 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Генераторы ключей</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Генераторы ключей</h1><strong>Зачем они нужны?</strong> + + <p>Помимо VMProtect, серийные номера могут генерироваться другими + программами - генераторами. Это нужно для автоматизации выдачи + номеров без участия человека. Покупатель покупает продукт, + регистратор делает HTTP-запрос на сайт производителя, там + запускается программа-генератор и на основе данных о покупателе + формирует серийный номер. Номер отправляется покупателю и + производителю. Производитель вносит его в базу VMProtect вручную, + через окно импорта лицензий.</p><strong>Принцип работы</strong> + + <p>Система лицензирования VMProtect построена на асимметричных + алгоритмах, поэтому для генерации серийных номеров требуется + секретный ключ продукта. Этот ключ можно экспортировать в окне + свойств продукта и передать программе-генератору подходящим для + нее способом.</p> + + <p>Программа-генератор вызывается регистратором через + HTTP-запрос. Генератор на PHP может быть вызван напрямую, + генератор в виде DLL - косвенно, но алгоритм остается одним и тем + же:</p> + + <ul> + <li>Получить данные о пользователе от регистратора</li> + + <li>Добавить необходимую информацию, которую указал + производитель</li> + + <li>Сформировать серийный номер</li> + + <li>Зашифровать его одним из алгоритмов</li> + + <li>Передать результат регистратору</li> + </ul><strong>Существуют ли готовые генераторы?</strong> + + <p>С системой лицензирования поставляется три готовых генератора + серийных номеров <a href="keygen_dll.htm">в виде DLL</a>, + <a href="keygen_net.htm">для платформы .Net</a> и <a href= + "keygen_php.htm">реализованный на PHP</a>.</p><strong>Можно ли + сделать свой генератор?</strong> + + <p>Можно. Формат серийного номера находится <a href= + "serial_format.htm">здесь</a>, алгоритмы шифрования серийного + номера описаны <a href= + "algorithms.htm">здесь</a>.</p><strong>Насколько это + безопасно?</strong> + + <p>В общем случае - вполне безопасно. Однако есть несколько + рекомендаций, которым стоит следовать:</p> + + <ul> + <li><strong>Используйте протокол HTTPS</strong> - если ваш + регистратор умеет делать запрос по HTTPS, а ваш хостинг + позволяет отвечать на такие запросы, то этот вариант + предпочтительнее обычного HTTP, т.к. поток данных будет + зашифрован и сгенерированный серийный номер сможет получить + только регистратор.</li> + + <li><strong>"Спрячьте" генератор</strong> - убедитесь, что + генератор нельзя вызвать случайно. Адрес + www.site.com/keygen.php - плохая идея. А вот + www.site.com/abc123.php - уже лучше. Убедитесь, что на + генератор нет внешних ссылок, что он не показывается при + просмотре содержимого директории сайта и не помещайте его в + служебные файлы типа robots.txt. Чем меньше известно о + расположении генератора - тем лучше. Как вариант - можно + вынести генератор на другой сайт.</li> + + <li><strong>Убедитесь, что вас вызывает регистратор</strong> - + в программе, обрабатывающей запрос от регистратора, необходимо + проверить IP-адрес вызывающей стороны. Обычно регистраторы + публикуют список адресов, с которых они могут вызвать + генератор. Найдите такой у вашего регистратора и добавьте + проверку. В случае несовпадения адреса, лучше не выдавать + понятных ошибок. Не возвращайте ничего или верните ошибку 404. + Не давайте повода понять, почему вызов оказался неудачен.</li> + + <li><strong>Проверяйте входные параметры</strong> - в + настройках продукта у регистратора обычно дается возможность + указать строку запроса, который регистратор будет делать для + получения лицензии. Скажем, вы хотите получать имя + пользователя, адрес его электронной почты, дату продажи и номер + заказа. Убедитесь при получении запроса, что все параметры + переданы и что все они имеют корректный формат. Не отвечайте на + запросы с ошибками. О любых ошибках уведомляйте себя отправкой + e-mail со всеми параметрами, с которыми был вызван генератор. + Это поможет разобраться в причинах проблемы.</li> + + <li><strong>Добавьте "пароль"</strong> - укажите в запросе, + посылаемом регистратором, дополнительный параметр - пароль. С + неочевидным именем и значением. Проверяйте его на принимающей + стороне. В случае несовпадения или отсутствия - не генерируйте + номер.</li> + </ul><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/keygen/keygen_dll.htm b/help/ru/manager/keygen/keygen_dll.htm new file mode 100644 index 0000000..5e8134e --- /dev/null +++ b/help/ru/manager/keygen/keygen_dll.htm @@ -0,0 +1,284 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Генератор ключей: Windows-версия</title> +</head> + +<body> + <h1>Генераторы ключей: Windows-версия</h1> + + <h3>Описание</h3> + + <p>Генератор для Windows представляет собой DLL-файлы для + платформ x86 и x64, заголовочный файл языка C и lib-файл, + совместимый с MSVC. Таким образом, библиотека может быть как слинкована статически, так + и загружаться динамически.</p> + + <p>Все файлы генератора находятся в каталоге + <strong>Keygen\DLL</strong>, там же находится тестовое + приложение, которое генерирует серийные номера.</p> + + <h3>API генератора</h3> + + <p>Генератор экспортирует всего две функции: одна непосредственно + генерирует серийный номер, вторая - освобождает память, + выделенную первой. Начнем с первой и основной функции:</p> + <pre class="code"><strong>VMProtectErrors</strong> __stdcall <strong>VMProtectGenerateSerialNumber</strong>( + <strong>VMProtectProductInfo *</strong> pProductInfo, + <strong>VMProtectSerialNumberInfo *</strong> pSerialInfo, + <strong>char **</strong> pSerialNumber + ); +</pre> + + <p>Первый параметр - указатель на структуру + <strong>VMProtectProductInfo</strong>, содержимое которой + выгружается в VMProtect (см. <a href= + "../licenses.htm#export">Экспорт параметров продукта</a>). + Структура содержит приватный ключ продукта, используемый алгоритм + и количество бит, а также идентификатор продукта. Подробнее о + заполнении этой структуры написано ниже.</p> + + <p>Второй параметр - указатель на структуру + <strong>VMProtectSerialNumberInfo</strong>, содержимое которой + переносится в генерируемый серийный номер. Структура содержит все + поля серийного номера, а также битовую маску, определяющую какие + именно поля должны быть записаны в серийный номер.</p> + <pre class="code">struct <strong>VMProtectSerialNumberInfo</strong> +{ + <strong>INT</strong> flags; + <strong>wchar_t *</strong> pUserName; + <strong>wchar_t *</strong> pEMail; + <strong>DWORD</strong> dwExpDate; + <strong>DWORD</strong> dwMaxBuildDate; + <strong>BYTE</strong> nRunningTimeLimit; + <strong>char *</strong> pHardwareID; + <strong>size_t</strong> nUserDataLength; + <strong>BYTE *</strong> pUserData; +}; +</pre> + + <p>Поле <strong>flags</strong> содержит битовые флаги из набора + <strong>VMProtectSerialNumberFlags</strong>, описанного перед + структурой:</p> + + <ul> + <li><strong>HAS_USER_NAME</strong> - поместить в серийный номер + имя пользователя, находящееся в переменной + <strong>pUserName</strong>.</li> + + <li><strong>HAS_EMAIL</strong> - поместить в серийный номер + e-mail пользователя, находящийся в переменной + <strong>pEMail</strong>.</li> + + <li><strong>HAS_EXP_DATE</strong> - серийный номер перестанет + действовать поле окончания дня, указанного в переменной + <strong>dwExpDate</strong>.</li> + + <li><strong>HAS_MAX_BUILD_DATE</strong> - серийный номер будет + подходить только к версиям продукта, созданным до даты, + указанной в переменной <strong>dwMaxBuildDate</strong>.</li> + + <li><strong>HAS_TIME_LIMIT</strong> - программа перестанет + работать по истечении времени, указанного в переменной + <strong>nRunningTimeLimit</strong> (время указывается в минутах + и не может превышать 255).</li> + + <li><strong>HAS_HARDWARE_ID</strong> - программа будет работать + только на оборудовании с идентификатором, указанным в + переменной <strong>pHardwareID</strong>.</li> + + <li><strong>HAS_USER_DATA</strong> - поместить в серийный номер + пользовательские данные длинной + <strong>nUserDataLength</strong>, расположенные по адресу, + указанному в переменной <strong>pUserData</strong>.</li> + </ul> + + <p>Третий параметр - указатель на указатель. Туда будет записан + адрес сгенерированного серийного номера. После генерации номер + необходимо скопировать, а адрес передать во вторую функцию API + генератора, которая освободит занимаемую серийным номером + память.</p> + <pre class="code"><strong>void</strong> __stdcall <strong>VMProtectFreeSerialNumberMemory</strong>(<strong>char *</strong> pSerialNumber); +</pre> + + <p>Функция <strong>VMProtectGenerateSerialNumber</strong> + возвращает значение типа <strong>VMProtectErrors</strong>, + содержащее 0 в случае успешной генерации номера или код ошибки в + противном случае. Возможны следующие коды ошибок:</p> + + <ul> + <li><strong>ALL_RIGHT</strong> - ошибок нет, номер сгенерирован + успешно.</li> + + <li><strong>UNSUPPORTED_ALGORITHM</strong> - в первом параметре + функции передан некорректный алгоритм шифрования ключа.</li> + + <li><strong>UNSUPPORTED_NUMBER_OF_BITS</strong> - в первом + параметре функции передано некорректное количество бит в + ключе.</li> + + <li><strong>USER_NAME_IS_TOO_LONG</strong> - длина имени + пользователя в кодировке UTF-8 превысила 255 байт.</li> + + <li><strong>EMAIL_IS_TOO_LONG</strong> - длина e-mail + пользователя в кодировке UTF-8 превысила 255 байт.</li> + + <li><strong>USER_DATA_IS_TOO_LONG</strong> - длина + пользовательских данных превышает 255 байт.</li> + + <li><strong>HWID_HAS_BAD_SIZE</strong> - идентификатор + оборудования имеет некорректный размер.</li> + + <li><strong>PRODUCT_CODE_HAS_BAD_SIZE</strong> - идентификатор + продукта, переданный в первом параметре функции, имеет неверный + размер.</li> + + <li><strong>SERIAL_NUMBER_TOO_LONG</strong> - серийный номер + слишком длинный и не помещается в указанное в алгоритме количество + бит.</li> + + <li><strong>BAD_PRODUCT_INFO</strong> - первый параметр функции + некорректен или NULL.</li> + + <li><strong>BAD_SERIAL_NUMBER_INFO</strong> - второй параметр + функции некорректен или NULL.</li> + + <li><strong>BAD_SERIAL_NUMBER_CONTAINER</strong> - третий + параметр функции не указывает на ячейку памяти для записи + адреса серийного номера.</li> + + <li><strong>NOT_EMPTY_SERIAL_NUMBER_CONTAINER</strong> - третий + параметр функции не указывает на пустую ячейку, в ячейке должно + быть значение NULL.</li> + + <li><strong>BAD_PRIVATE_EXPONENT</strong> - значение приватной + экспоненты в первом параметре функции некорректно.</li> + + <li><strong>BAD_MODULUS</strong> - значение модуля в первом + параметре функции некорректно.</li> + </ul> + + <p>Ошибки делятся на две категории: те, что связаны с + некорректными параметрами или с содержимым первого параметра + функции, и все остальные. Ошибки первой категории редки и + являются признаком некорректной настройки структуры. Имеет смысл + выгрузить информацию о продукте повторно и убедиться, что + структура заполняется правильно. Пример правильного заполнения + приведен ниже.</p> + + <p>Ошибки второй категории связаны с попыткой вместить в ключ + больше данных, чем это возможно ввиду его размера. В таком случае + разумно будет отправить регистратору вместо ключа текст "Ключ + будет выслан в течение суток", а всю необходимую информацию + отправить себе по почте. Ключ в таком случае генерируется в + VMProtect в ручном режиме, какие-то данные обрезаются, чтобы + уместить все необходимое в максимальный размер + ключа.</p> + + <h3>Пример использования</h3> + + <p>Ниже приведен пример кода, который вызывает две вышеописанные + функции и генерирует серийный номер. Обратите внимание на блок + кода, расположенный в самом начале. Пример не будет работать пока + вы не замените его на блок, выгруженный для продукта из + VMProtect:</p> + <pre class="code">////////////////////////////////////////////////////////////////////////// +// !!! this block should be generated by VMProtect !!! /// +////////////////////////////////////////////////////////////////////////// + +<strong>VMProtectAlgorithms</strong> g_Algorithm = ALGORITHM_RSA; +<strong>size_t</strong> g_nBits = 0; +<strong>byte</strong> g_vModulus[1]; +<strong>byte</strong> g_vPrivate[1]; +<strong>byte</strong> g_vProductCode[1]; + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +<strong>int</strong> _tmain(<strong>int</strong> argc, <strong>_TCHAR*</strong> argv[]) +{ + <strong>VMProtectProductInfo</strong> pi; + pi.algorithm = g_Algorithm; + pi.nBits = g_nBits; + pi.nModulusSize = sizeof(g_vModulus); + pi.pModulus = g_vModulus; + pi.nPrivateSize = sizeof(g_vPrivate); + pi.pPrivate = g_vPrivate; + pi.nProductCodeSize = sizeof(g_vProductCode); + pi.pProductCode = g_vProductCode; + + <strong>VMProtectSerialNumberInfo</strong> si = {0}; + si.flags = HAS_USER_NAME | HAS_EMAIL; + si.pUserName = L"John Doe"; + si.pEMail = L"john@doe.com"; + <strong>char *</strong> pBuf = NULL; + <strong>VMProtectErrors</strong> res = <strong>VMProtectGenerateSerialNumber</strong>(&pi, &si, &pBuf); + <strong>if</strong> (res == ALL_RIGHT) + { + <strong>printf</strong>("Serial number:\n%s\n", pBuf); + <strong>VMProtectFreeSerialNumberMemory</strong>(pBuf); + } + else + { + <strong>printf</strong>("Error: %d\n", res); + } + + <strong>return</strong> 0; +} +</pre> + + <p>Этот пример с проектом для Microsoft Visual Studio находится в + каталоге <strong>Keygen\DLL\Example</strong>, ниже будут описаны + наиболее интересные места кода.</p> + + <p>Первые строчки функции <strong>main</strong> заполняют + структуру <strong>VMProtectProductInfo</strong> данными, + выгруженными из VMProtect. Этот код стандартен, его не следует + менять во избежание появления ошибок. Далее создается структура + <strong>VMProtectSerialNumberInfo</strong>, в поле флагов + выставляется комбинация из битов имени пользователя и e-mail. + Строчкой ниже в соответствующие поля структуры заносятся значения + имени пользователя и пароля. Обратите внимание, что значения + принимаются в кодировке UNICODE. Генератор ключей внутри + преобразует их в кодировку UTF-8.</p> + + <p>Далее описывается переменная-указатель, куда будет записан + адрес сгенерированного ключа, и вызывается функция + <strong>VMProtectGenerateSerialNumber</strong>, после чего + анализируется код возврата. Если ошибок нет, то сгенерированный + номер печатается на консоль и вызывается функция осовобождения + памяти.</p> + + <h3>Остальные поля структуры VMprotectSerialNumberInfo</h3> + + <p>Некоторые поля структуры требуют дополнительных поясненений. К + примеру, поля <strong>dwExpDate</strong> и + <strong>dwMaxBuildDate</strong> содержат даты в определенном + формате: <strong>0xYYYYMMDD</strong>, т.е. год хранится в старшем + слове, а месяц и день в старшем и младшем байтах младшего слова. + Для формирования такого числа описан макрос <strong>MAKEDATE(y, + m, d)</strong>, который можно вызвать так: <strong>MAKEDATE(2010, + 05, 12)</strong>.</p> + + <p>В поле <strong>pHardwareID</strong> должен быть записан + указатель на строку, которую вернул метод + <strong>VMProtectGetCurrentHWID</strong> из SDK + лицензирования.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/keygen/keygen_net.htm b/help/ru/manager/keygen/keygen_net.htm new file mode 100644 index 0000000..f2d8d36 --- /dev/null +++ b/help/ru/manager/keygen/keygen_net.htm @@ -0,0 +1,115 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Генератор ключей: .Net-версия</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + p.c1 {color:red;} + /*]]>*/ + </style> +</head> + +<body> + <h1>Генераторы ключей: .Net-версия</h1> + + <h3>Описание</h3> + + <p>.Net-версия генератора ключей преставляет собой сборку, + содержащую все необходимое для генерации серийных номеров. + Исходные коды находятся в каталоге <strong>Keygen\Net</strong> в + виде двух проектов: KeyGen (непосредственно генератор серийных + номеров) и Usage (пример использования генератора).</p> + + <p class="c1">Генератор поставляется в исходных кодах, чтобы + иметь возможность пересобрать его под нужную версию .Net + Framework, однако крайне не рекомендуется вносить изменения в его + код. В будущих версиях VMProtect возможно добавление новых + возможностей в генератор, что приведет к необходимости повторной + модификации кода. Также возможно появление трудноуловимых ошибок. + В случае нахождения ошибки в оригинальном коде генератора или + пожеланий по его улучшению - обращайтесь в службу + поддержки.</p> + + <h3>Использование генератора</h3> + + <p>Возьмите за основу код из проекта <strong>Usage</strong>, + добавьте в Ваш проект ссылку на сборку VMProtect.KeyGen.dll, + после чего Вы сможете генерировать серийные номера в вашем + приложении. Для нормальной работы генератор должен понимать, + к какому продукту Вы собираетесь генерировать серийные номера. + Для этого на закладке "Лицензии" VMProtect нажмите кнопку + «Экспорт» и в выпадающем списке выберите «Параметры для + KeyGen.Net». В текстовом поле ниже появятся несколько строк + текста, которые необходимо скопировать и перенести в Ваше + приложение в виде строковой константы.</p> + + <p>Пример вызова генератора представлен ниже:</p> + <pre> +try +{ + string data = @""; // put the exported data here + Generator g = new Generator(data); + g.UserName = "John Doe"; + g.EMail = "john@doe.com"; + g.ExpirationDate = DateTime.Now.AddMonths(1); + g.MaxBuildDate = DateTime.Now.AddYears(1); + g.RunningTimeLimit = 15; + g.HardwareID = "AQIDBAgHBgU="; + g.UserData = new byte[] { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; + string serial = g.Generate(); + Console.WriteLine("Serial number:\n{0}\n", serial); +} +catch (Exception ex) +{ + Console.WriteLine("Error: {0}", ex); +} + +</pre> + + <p>Строку, скопированную в окне экспорта VMProtect, необходимо + поместить в переменную <strong>data</strong>, которая будет + передана параметром в конструктор класса генератора серийных + номеров. В случае каких-либо проблем с разбором данных продукта, + конструктор выбросит исключение с описанием проблемы. Если + конструктор отработал успешно, то генератор готов к созданию + серийных номеров.</p> + + <p>Серийный номер может содержать различную информацию, которая + задается через свойства генератора. Пример выше показывает, как + заполнить абсолютно все поля серийного номера. Отдельные поля + имеют ограничения. Например, поля <strong>User Name</strong> и + <strong>E-Mail</strong> не могут принять строки, которые в + кодировке UTF-8 будут иметь длину, превышающую 255 символов. В + случае подачи некорректных данных, свойства выбрасывают исключения с + описанием проблемы.</p> + + <p>По окончании настройки генератора вызывается метод + <strong>Generate()</strong>, который и создает серийный номер. На + этом этапе происходит компоновка всех данных номера, подсчет + контрольных сумм и, непосредственно, шифрование. В случае, если + объем данных превышает максимально допустимую длину, метод выбросит + исключение.</p> + + <p>В случае, если необходимо сгенерировать несколько серийных + номеров, можно использовать класс генератора несколько раз, не + пересоздавая его. Чтобы "очистить" любое из свойств генератора, + ему нужно присвоить значение <strong>null</strong>.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/keygen/keygen_php.htm b/help/ru/manager/keygen/keygen_php.htm new file mode 100644 index 0000000..7df459a --- /dev/null +++ b/help/ru/manager/keygen/keygen_php.htm @@ -0,0 +1,143 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Генератор ключей: UNIX-версия</title> +</head> + +<body> + <h1>Генераторы ключей: UNIX-версия</h1> + + <h3>Описание</h3> + + <p>UNIX-версия генератора ключей преставляет собой PHP-файл, + содержащий все необходимое для генерации серийных номеров. Файл + находится в каталоге <strong>Keygen\PHP</strong>, ниже + рассмотрены основные моменты его + использования.</p> + + <h3>Настройка генератора</h3> + + <p>В самом начале PHP-файла располагается код настройки + генератора:</p> + <pre class="code">////////////////////////////////////////////////////////////////////////////////////////////// +// The following lines should be generated by VMProtect License Manager +$exported_algorithm = "RSA"; +$exported_bits = 2048; +$exported_private = "PJvj4kEpoQMIpYK+9wEt......xKeiSZgzdiln8Q=="; +$exported_modulus = "rOlny/3QgZb/VmGr3CmY......I6ESAUmtQ+RBqQ=="; +$exported_product_code = "oLQdGUn8kVk="; +////////////////////////////////////////////////////////////////////////////////////////////// +</pre> + + <p>Этот код генерируется автоматически в VMProtect (см. <a href= + "../licenses.htm#export">Экспорт параметров продукта</a>) и + уникален для каждого конкретного продукта. Очень важно + скопировать его без ошибок, в противном случае генератор будет + работать некорректно.</p><strong>Содержимое ключа</strong> + + <p>Далее в генераторе задается содержимое серийного номера. + Содержимое задается массивом, ниже задаются все возможные + параметры ключа, однако в реальных условиях часть из них может + отсутствовать:</p> + <pre class="code">$params = <strong>array</strong>( + user_name => "John Doe", // UTF-8! + email => "john@doe.com", + hwid => "vHGMdMRvGCPjWcCQ", // Exactly as returned by VMProtectGetCurrentHWID + expire_date => <strong>array</strong>(year => 2009, month => 10, day => 1), + maxbuild_date => <strong>array</strong>(year => 2009, month => 10, day => 1), + time_limit => 10, + user_data => <strong>base64_decode</strong>("CGCvRvMWcPHGdMjQ"), // string of bytes + ); +</pre> + + <h3>Функция обработки успешной генерации</h3> + + <p>Ниже расположена простейшая реализация функции, которая + вызывается при успешной генерации серийного номера. Единственным + параметром она получает строку с номером. Функция должна передать + номер вызывающей стороне (регистратору), обычно это делается при + помощи команды <strong>echo</strong>. Предварительно строка + разбивается на подстроки длиной 75 символов для удобства. Также + эта функция может отправлять сгенерированный номер по почте + производителю программы или заносить его в базу данных.</p> + <pre class="code">function <strong>OnSerialGenerated</strong>($serial) +{ + $serial = <strong>wordwrap</strong>($serial, 75, "\n", true); + <strong>echo</strong> $serial; +} +</pre> + + <h3>Функция обработки ошибок генерации</h3> + + <p>Последний участок кода, требующий внимания - это функция, + которая вызывается в случае возникновения проблем. Функция + получает в виде параметра строку с текстом ошибки, а после ее + завершения вызывается функция <strong>die()</strong>. Функция + должна сделать две вещи: вернуть регистратору вместо ключа текст + о том, что ключ будет выслан вручную, а также выслать + производителю программы всю необходимую информацию для устранения + ошибки и ручной генерации ключа.</p> + <pre class="code">function <strong>OnSerialGenerationFailed</strong>($details) +{ + <strong>echo</strong> "You will receive serial number in the next 24 hours"; // message to the customer +// mail("support@vendor.com", "Houston, we have a problem", $details); // message to vendor +} +</pre> + + <p>Причин возникновения ошибки может быть несколько: некорректные + параметры алгоритма, некорректные параметры ключа, слишком + длинное имя пользователя или e-mail. Слишком длинный серийный + номер, который не влезает в количество бит, указанное в + алгоритме. Поэтому функция + <strong>OnSerialGenerationFailed</strong> должна отправить + производителю максимально подробную информацию о случившемся, + дабы тот мог вручную сгенерировать серийный номер и отправить его + покупателю.</p> + + <h3>На что еще следует обратить внимание</h3> + + <p>Генератор ключей в примерах максимально упрощен. Он не + учитывает рекомендации по разработке веб-генераторов, данные + <a href="index.htm">здесь</a>. Он не проверяет IP-адрес + вызывающей стороны и не анализирует входные параметры. Имейте это + в виду, когда будете создавать свой собственный генератор на + основе этого.</p> + + <p>Имя пользователя и e-mail должны быть переданы в кодировке + UTF-8. Уточните у вашего регистратора, в какой кодировке он + передает информацию о покупателе и, при необходимости, проведите + конвертацию. Неправильная кодировка не приведет к + неработоспособности серийного номера, однако номер будет + содержать совершенно другое имя пользователя и он может быть + удивлен, если вы показываете его, скажем, в окне "О + Программе".</p> + + <p>Асимметричное шифрование - достаточно сложный в математическом + плане процесс. Если он реализован на чистом PHP, без применения + сторонних библиотек, то генерация серийного номера может занять + десятки секунд. Генератор использует функции + <strong>gmp_powm</strong>, <strong>bi_powmod</strong>, + <strong>bcpowod</strong> в случае их наличия. Все эти функции + имеют разную скорость. Если генерация ключей на вашем хостинге + занимает слишком большое время, рекомендуется пообщаться со + службой поддержки на предмет подключения описаных выше функций. К + примеру, функция <strong>gmp_powm</strong> работает в десятки раз быстрее + функции <strong>bcpowmod</strong>.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/keygen/serial_format.htm b/help/ru/manager/keygen/serial_format.htm new file mode 100644 index 0000000..d11d34f --- /dev/null +++ b/help/ru/manager/keygen/serial_format.htm @@ -0,0 +1,260 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Формат серийного номера</title> + <style type="text/css"> +/*<![CDATA[*/ + th {text-align:left;} + table {border-collapse:collapse; margin-top: 4px;} + td,th {border: 1px solid #B0B0B0; padding-left:10;padding-right:10;} + /*]]>*/ + </style> +</head> + +<body> + <h1>Формат серийного номера</h1> + + <h3>Структура серийного номера</h3> + + <p>Серийный номер состоит из блоков. Каждый блок + начинается с байта идентификатора, который определяет его + содержимое и, возможно, длину. Последним всегда идет блок с + идентификатором 255, содержащий контрольную сумму всего серийного + номера, за исключением последнего блока.</p> + + <p>В зависимости от типа блока, он может иметь фиксированную или + переменную длину. Во втором случае обычно длина идет в следующем + за идентификатором блока байте. Подробно формат каждого блока + описан ниже.</p> + + <h3>Формат блоков</h3> + + <table border="1" cellspacing="0" cellpadding="2"> + <tr> + <th>ID</th> + + <th>Название</th> + + <th>Размер (байт)</th> + + <th>Описание</th> + + <th>Пример</th> + </tr> + + <tr> + <td>0x01</td> + + <td>Версия</td> + + <td>1</td> + + <td>Блок содержит версию серийного номера размером в 1 байт. + Версия должна быть равна 1.</td> + + <td>01 01</td> + </tr> + + <tr> + <td>0x02</td> + + <td>Имя пользователя</td> + + <td>1 + N</td> + + <td>Блок содержит имя пользователя в кодировке UTF-8. Перед + именем пользователя располагается 1 байт длины имени. Таким + образом, длина имени пользователя не может превышать 255 + байт. Завершающий 0 не требуется.</td> + + <td>02 04 4A 5F 48 4E</td> + </tr> + + <tr> + <td>0x03</td> + + <td>E-Mail</td> + + <td>1 + N</td> + + <td>Блок содержит e-mail пользователя в кодировке UTF-8. + Перед e-mail'ом располагается 1 байт длины. Таким образом, + длина e-mail не может превышать 255 байт. Завершающий 0 не + требуется.</td> + + <td>03 07 61 40 62 2E 63 6F 6D</td> + </tr> + + <tr> + <td>0x04</td> + + <td>Идентификатор оборудования</td> + + <td>1 + N</td> + + <td>Блок содержит идентификатор оборудования, возвращенный + функцией <strong>VMProtectGetCurrentHWID()</strong>. Функция + возвращает строку в кодировке base-64, в серийный номер + помещается раскодированный вариант строки. Длина блока данных + должна быть кратна 4. Перед блоком данных располагается байт + длины. Максимальная длина блока - 32 байта.</td> + + <td>04 08 E1 E2 E3 E4 A1 A2 A3 A4</td> + </tr> + + <tr> + <td>0x05</td> + + <td>Дата окончания лицензии</td> + + <td>4</td> + + <td>Блок содержит дату окончания действия серийного номера. + Формат хранения даты описан ниже.</td> + + <td>05 01 0A 07 DA</td> + </tr> + + <tr> + <td>0x06</td> + + <td>Максимальное время работы</td> + + <td>1</td> + + <td>Блок содержит 1 байт с временем работы программы в + минутах. Максимальное время работы, таким образом, может + составлять 255 минут.</td> + + <td>06 05</td> + </tr> + + <tr> + <td>0x07</td> + + <td>Код продукта</td> + + <td>8</td> + + <td>Блок содержит код продукта - 8 байт, которые создаются + VMProtect и выгружаются при экспорте параметров продукта. + Выгружаются они в кодировке base-64, перед помещением в + серийный номер строку необходимо преобразовать в массив байт. + Размер массива должен быть строго равен 8 байтам. + <strong>Этот блок является обязательным, без него защищенная + программа будет работать некорректно!</strong></td> + + <td>07 01 02 03 04 05 06 07 08</td> + </tr> + + <tr> + <td>0x08</td> + + <td>Данные пользователя</td> + + <td>1 + N</td> + + <td>Блок содержит до 255 байт пользовательских данных. + Система лицензирования не анализирует эти данные и возвращает + их при вызове функции + <strong>VMProtectGetSerialNumberData()</strong>. Перед блоком + данных располагается байт, содержащий размер пользовательских + данных.</td> + + <td>08 05 01 02 03 04 05</td> + </tr> + + <tr> + <td>0x09</td> + + <td>Максимальная дата сборки</td> + + <td>4</td> + + <td>Блок содержит максимальную дату сборки приложения, с + которым будет работать этот серийный номер. Формат хранения + даты описан ниже.</td> + + <td>09 01 0A 07 DA</td> + </tr> + + <tr> + <td>0xFF</td> + + <td>Контрольная сумма</td> + + <td>4</td> + + <td>Блок содержит контрольную сумму серийного номера. Блок + располагается последним и контрольная сумма считается для + всех блоков, идущих перед этим. Подробнее о расчете + контрольной суммы написано ниже.</td> + + <td>FF 01 02 03 04</td> + </tr> + </table> + + <h3>Формат хранения даты</h3> + + <p>Даты в серийном номере хранятся в виде двойного слова - + 0xYYYYMMDD. Старшее слово содержит год, а младшее - день и месяц. + Байты расположены в порядке Little Endian - от младшего к + старшему. В случае, если имеется указатель на первый байт записи, + то дата может быть считана и записана следующим кодом:</p> + <pre class="code"><strong>byte *</strong>pDate = 0xNNNNNN; // адрес даты +<strong>*</strong>(<strong>DWORD *</strong>)pDate = (2010 << 16) | (10 << 8) | 1; // October 1, 2010 +<strong>DWORD</strong> dwExp = *(<strong>DWORD *</strong>)pDate; +</pre> + + <h3>Подсчет контрольной суммы</h3> + + <p>Контрольная сумма серийного номера вычисляется при помощи + алгоритма хеширования SHA-1. Результатом работы алгоритма + являются пять 32-битных слов. Первое слово используется в + качестве контрольной суммы серийного номера. <strong>Обратите + внимание:</strong> слово записывается в формате Little Endian (от + младшего байта к старшему). В строковом представлении хеша SHA-1 + используется формат Big Endian - числа записываются от старшего + байта к младшему, поэтому если SHA-1 генерируется функцией, + которая возвращает строку (как в PHP), то первые четыре байта + хеша необходимо предварительно + развернуть.</p> + + <h3>Дополнительная информация</h3> + + <p>Блоки с номерами, отличными от описанных выше, игнорируются + системой лицензирования. Возможно появление новых блоков в + будущих версиях. <strong>Не рекомендуется создавать свои блоки, + используя свободные идентификаторы!</strong> Во-первых, это может + привести к неработоспособности ключа с новыми версиями системы + лицензирования. А во-вторых, защищаемая программа все равно не + сможет прочитать значения этих блоков. Для хранения какой-либо + информации в ключе нужно использовать поле <strong>User + Data</strong>, которое предназначено именно для этого.</p> + + <p>Серийный номер не содержит "соли" (SALT) - случайной + информации, предназначенной для того, чтобы ключи для одних и тех + же данных получались разными. Эта задача возлагается на алгоритм + шифрования. Если необходимы отличия на уровне серийных номеров, + скажем для серии ключей, проданных в организацию, можно записать + номер ключа строкой в поле имени пользователя (ООО "Компания", + ключ 1 из 10) или занести эту информацию в поле <strong>User + Data</strong> в любом удобном для разработчика формате.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/licenses.htm b/help/ru/manager/licenses.htm new file mode 100644 index 0000000..88517d5 --- /dev/null +++ b/help/ru/manager/licenses.htm @@ -0,0 +1,112 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Управление лицензиями</title> +</head> + +<body> + <h1>Управление лицензиями</h1> + + <h3>Инициализация</h3> + + <p>По умолчанию функции лицензирования выключены. Чтобы включить + их, нужно перейти в секцию "Лицензии" раздела "Проект" и создать пару ключей. В + случае, если проект ссылается на базу данных менеджера лицензий + (в старых версиях VMProtect лицензии управлялись отдельной + программой), то будет предложено импортировать эти лицензии в + проект. По окончании инициализации будут доступны опции привязки + кода к серийному номеру, а также появится возможность создавать и + обрабатывать серийные номера.</p> + + <h3>Интерфейс</h3> + + <p>Секция "Лицензии" отображает полный список лицензий в левой панели и + параметры выбранного элемента справа в основной панели.</p> + + <p><img src="../images/licenses1.png" /></p> + + <p>Правая панель отображает подробную информацию о выбранной + лицензии. Также там можно заблокировать серийный номер, + скопировать его в буфер обмена, посмотреть подробную информацию + об идентификаторе оборудования (кликнув по нему).</p> + + <h3 id="AddLicense">Создание лицензии</h3> + + <p>Для того чтобы добавить новую лицензию, необходимо кликнуть + соответствующую кнопку на панели инструментов. + Появится окно создания лицензии:</p> + + <p><img src="../images/project_add_license.png" /></p> + + <p>В верхней части окна задаются основные параметры лицензии. В + нижней можно выбрать, какие из основных параметров попадут в + серийный номер, а также добавить дополнительные параметры: + например, идентификатор оборудования или пользовательские данные. + По окончании заполнения полей нажмите ОК и VMProtect создаст + новую лицензию.</p> + + <h3>Удаление и блокирование лицензий</h3> + + <p>Для удаления лицензии щелкните по ней в списке лицензий правой кнопкой мыши и выберите "Удалить" в контекстном меню. Либо просто выделите лицензию в списке и нажмите Del. Для того чтобы заблокировать лицензию, переключите параметр "Заблокирована" в основной панели справа в состояние "Да".</p><p>Между удалением лицензии и ее блокированием есть + разница. Удаленные серийные номера не блокируются модулем + лицензирования. Они просто перестают существовать в базе данных. + Если лицензия создана ошибочно и серийный номер никогда никому не + отправлялся, то ее можно удалить. Если же серийный номер + скомпрометирован, то лицензию удалять нельзя, ее необходимо + заблокировать. Тогда в модуль лицензирования будет передана + информация об этом номере и он не будет принимать его.</p> + + <h3>Импорт серийных номеров</h3> + + <p>Серийные номера могут быть созданы не только в VMProtect, но и + в сторонних программах - генераторах номеров. Обычно они + применяются для автоматизированной выдачи серийных номеров + регистраторам при продаже лицензий. Чтобы корректно занести такие + номера в базу данных, существует функция импорта серийных + номеров. Для ее активации необходимо нажать сочетание клавиш + Ctrl+I или выбрать пункт "Импортировать" в меню "Проект".</p> + + <p><img src="../images/menu_project_import.png" /></p> + + <p>Первым шагом при импорте серийного номера является окно ввода + номера:</p> + + <p><img src="../images/import_key.png" /></p> + + <p>В случае, если такая лицензия уже есть в базе данных, будет + открыто окно редактирования лицензии. Если лицензии в базе нет, + то будет открыто окно создания лицензии, где можно внести + необходимые правки, после чего, нажатием кнопки ОК, лицензия + заносится в базу данных.</p><a name="export" id="export"></a> + + <h3>Экспорт параметров лицензирования</h3> + + <p>Для корректной работы генераторов ключей, им необходима + информация о секретном ключе продукта. Эту информацию в наиболее + подходящей форме можно получить, нажав кнопку "Экспорт ключа" над + списком лицензий. При этом появится окно экспорта данных:</p> + + <p><img src="../images/export_keys.png" /></p> + + <p>Поле "Формат экспорта" позволяет выбрать один из + поддерживаемых форматов, а поле "Результат экспорта" содержит + данные в виде, наиболее удобном для соответствующего генератора + ключей. Кнопка "Копировать" позволяет скопировать содержимое поля + "Результат экспорта" в буфер обмена.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/api.htm b/help/ru/manager/usage/api.htm new file mode 100644 index 0000000..df533b4 --- /dev/null +++ b/help/ru/manager/usage/api.htm @@ -0,0 +1,312 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Описание функций API лицензирования</title> + <style type="text/css"> +/*<![CDATA[*/ + th {text-align:left;} + table {border-collapse:collapse; margin-top: 4px;} + td,th {border: 1px solid #B0B0B0; padding-left:10;padding-right:10;} + /*]]>*/ + </style> +</head> + +<body> + <h1>Описание функций API лицензирования</h1> + + <p>API системы лицензирования является продолжением API VMProtect + и входит в его SDK. API позволяет задать серийный номер и + получить информацию о нем: подходит он к программе или нет, истек + ли срок действия, на кого зарегистрирован продукт и т.п. Также API + позволяет получить идентификатор оборудования, на котором + выполняется программа.</p><strong id= + "VMProtectSetSerialNumber">VMProtectSetSerialNumber</strong> + + <p>Функция предназначена для загрузки серийного номера в систему + лицензирования. Полный формат вызова представлен ниже:</p> + <pre class="code">int VMProtectSetSerialNumber(const char *SerialNumber); +</pre> + + <p>Входной параметр <strong>SerialNumber</strong> должен + содержать указатель на текстовую строку с серийным номером в + кодировке base-64 и завершаемую нулем ('\0'). Функция возвращает + битовую маску флагов состояния серийного номера, аналогичную той, + что возвращает <strong>VMProtectGetSerialNumberState()</strong>, + подробнее о флагах будет написано ниже. Серийный номер считается + "хорошим", если функция вернула значение 0.</p><br /> + <strong id= + "VMProtectGetSerialNumberState">VMProtectGetSerialNumberState</strong> + + <p>Функция возвращает флаги состояния серийного номера, + предварительно установленного вызовом + <strong>VMProtectSetSerialNumber()</strong>.</p> + <pre class="code">int VMProtectGetSerialNumberState(); +</pre> + + <p>Наличие хотя бы одного установленного флага говорит о + проблемах с серийным номером: программа не должна работать, если + установлен хотя бы один бит. Подробные значениях флагов описаны в + таблице:</p> + + <table border="1" cellspacing="0" cellpadding="2"> + <tr> + <th>Флаг</th> + + <th>Значение</th> + + <th>Описание</th> + </tr> + + <tr> + <td>SERIAL_STATE_FLAG_CORRUPTED</td> + + <td>0x00000001</td> + + <td>Система лицензирования повреждена. Возможные причины: + некорректная настройка проекта защиты, попытка взлома + программы.</td> + </tr> + + <tr> + <td>SERIAL_STATE_FLAG_INVALID</td> + + <td>0x00000002</td> + + <td>Серийный номер некорректен. Флаг выставляется, если + система лицензирования не может расшифровать серийный + номер.</td> + </tr> + + <tr> + <td>SERIAL_STATE_FLAG_BLACKLISTED</td> + + <td>0x00000004</td> + + <td>Серийный номер подходит к продукту, однако занесен в + черный список в VMProtect.</td> + </tr> + + <tr> + <td>SERIAL_STATE_FLAG_DATE_EXPIRED</td> + + <td>0x00000008</td> + + <td>Срок действия серийного номера истек. Подробную + информацию о сроке действия можно получить вызовом + <strong>VMProtectGetSerialNumberData()</strong></td> + </tr> + + <tr> + <td>SERIAL_STATE_FLAG_RUNNING_TIME_OVER</td> + + <td>0x00000010</td> + + <td>Время работы программы истекло. Подробную информацию о + времени работы программы можно получить вызовом + <strong>VMProtectGetSerialNumberData()</strong></td> + </tr> + + <tr> + <td>SERIAL_STATE_FLAG_BAD_HWID</td> + + <td>0x00000020</td> + + <td>Идентификатор оборудования не совпадает с тем, что + записан в серийном номере.</td> + </tr> + + <tr> + <td>SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED</td> + + <td>0x00000040</td> + + <td>Серийный номер не предназначен для работы с этой версией + защищаемой программы. Максимальную дату сборки программы, к + которой подходит этот серийный номер, можно узнать вызовом + <strong>VMProtectGetSerialNumberData()</strong>.</td> + </tr> + </table><br /><br /> + <strong id= + "VMProtectGetSerialNumberData">VMProtectGetSerialNumberData</strong> + + <p>Функция предназначена для получения информации о содержимом + серийного номера, установленного вызовом + <strong>VMProtectSetSerialNumber()</strong>. Формат вызова + представлен ниже:</p> + <pre class="code">bool VMProtectGetSerialNumberData(VMProtectSerialNumberData *Data, int Size); +</pre> + + <p>Первый параметр - указатель на структуру + <strong>VMProtectSerialNumberData</strong>, в которую будет + записана вся необходимая информация. Второй параметр - размер + структуры, передаваемой в первом параметре - служит для контроля + формата структуры. Функция возвращает FALSE в случаях, если система + лицензирования повреждена (см. флаг состояния + SERIAL_STATE_FLAG_CORRUPTED), если на вход подан нулевой адрес + структуры или если переданный размер структуры некорректен. Во + всех остальных случаях функция возвращает TRUE и записывает всю + информацию о серийном номере по указанном адресу. Ниже + описываются все элементы структуры:</p> + + <table border="1" cellspacing="0" cellpadding="2"> + <tr> + <th>Элемент</th> + + <th>Тип</th> + + <th>Описание</th> + </tr> + + <tr> + <td>nState</td> + + <td>int</td> + + <td>Битовая маска флагов проверки ключа. Аналогична той, что + возвращает + <strong>VMProtectGetSerialNumberState()</strong>.</td> + </tr> + + <tr> + <td>wUserName</td> + + <td>wchar_t[256]</td> + + <td>Имя покупателя в кодировке UNICODE, завершаемое + нулем.</td> + </tr> + + <tr> + <td>wEMail</td> + + <td>wchar_t[256]</td> + + <td>E-Mail покупателя в кодировке UNICODE, завершаемый + нулем.</td> + </tr> + + <tr> + <td>dtExpire</td> + + <td>VMProtectDate</td> + + <td>Дата окончания срока действия ключа. Формат структуры + VMProtectDate описан ниже.</td> + </tr> + + <tr> + <td>dtMaxBuild</td> + + <td>VMProtectDate</td> + + <td>Максимальная дата сборки продукта, с которой будет + работать этот ключ. Формат структуры VMProtectDate описан + ниже.</td> + </tr> + + <tr> + <td>bRunningTime</td> + + <td>int</td> + + <td>Количество минут, которое программа будет работать + (максимальная длина сессии). Измеряется в минутах, + отсчитывается с момента запуска программы.</td> + </tr> + + <tr> + <td>nUserDataLength</td> + + <td>unsigned char</td> + + <td>Длина пользовательских данных, размещенных в поле + <strong>bUserData</strong>.</td> + </tr> + + <tr> + <td>bUserData</td> + + <td>unsigned char[255]</td> + + <td>Пользовательские данные, записанные в ключ. Количество + актуальных байт указано в поле + <strong>nUserDataLength</strong>.</td> + </tr> + </table><br /> + + <p>Структура <strong>VMProtectDate</strong> предназначена для + компактного хранения даты. Ее поля описаны в таблице:</p> + + <table border="1" cellspacing="0" cellpadding="2"> + <tr> + <th>Элемент</th> + + <th>Тип</th> + + <th>Описание</th> + </tr> + + <tr> + <td>wYear</td> + + <td>unsigned short</td> + + <td>Год.</td> + </tr> + + <tr> + <td>bMonth</td> + + <td>unsigned char</td> + + <td>Месяц, нумерация начинается с единицы.</td> + </tr> + + <tr> + <td>bDay</td> + + <td>unsigned char</td> + + <td>День, нумерация начинается с единицы.</td> + </tr> + </table><br /> + <br /> + <strong id= + "VMProtectGetCurrentHWID">VMProtectGetCurrentHWID</strong> + + <p>Функция предназначена для получения идентификатора + оборудования, на котором работает программа. Формат вызова + следующий:</p> + <pre class="code">int VMProtectGetCurrentHWID(char * HWID, int Size); +</pre> + + <p>Первый параметр - указатель на область памяти, куда будет + записан идентификатор. Второй параметр - размер области данных. + Функция возвращает количество записанных байт с учетом + завершающего нуля ('\0'). Если вместо первого параметра подать + NULL, то функция вернет необходимое количество байт для записи + номера. Наиболее правильный способ вызова функции следующий:</p> + <pre class="code"><strong>int</strong> nSize = <strong>VMProtectGetCurrentHWID</strong>(NULL, 0); // получим необходимый размер буфера +<strong>char *</strong>pBuf = <strong>new char</strong>[nSize]; // выделим буфер +<strong>VMProtectGetCurrentHWID</strong>(pBuf, nSize); // получим идентификатор +// используем его +<strong>delete</strong> [] pBuf; // освободим память +</pre><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/index.htm b/help/ru/manager/usage/index.htm new file mode 100644 index 0000000..99189c0 --- /dev/null +++ b/help/ru/manager/usage/index.htm @@ -0,0 +1,127 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Интеграция в приложение</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Интеграция в приложение</h1> + + <p>В нескольких шагах, описанных ниже, мы создадим тестовое + приложение, которое будет обращаться к системе лицензирования: + подавать ей серийные номера и получать статус номера и его + содержимое. На первом этапе система лицензирования будет + использоваться в тестовом режиме, а на втором этапе - в + реальном.</p><strong>Режимы работы системы + лицензирования</strong> + + <p>В создании защиты всегда есть два этапа: разработка и + использование. В случае с лицензированием, вы сначала создаете + приложение, потом интегрируете механизмы защиты, добавляете + проверки и блокируете функции. И только потом, после + всестороннего тестирования, продукт передается пользователям и + начинается второй этап. Тестирование защищаемого приложения - + процесс сложный, необходимо убедиться в работоспособности всех + проверок и условных переходов. Создание "настоящих" серийных + номеров на все случаи жизни на этапе тестирования может оказаться + неудобным, поэтому у системы лицензирования есть т.н. "режим + разработки" или "тестовый" режим, при котором никакой защиты не + осуществляется, а реакция системы на серийные номера описывается + в конфигурационном файле. Когда приложение отлажено и корректно + работает с системой лицензирования, VMProtect заменяет "тестовый" + модуль лицензирования на реальный, проверяющий реальные серийные + номера. Это происходит в момент защиты приложения, поэтому + пропустить этот этап по ошибке не получится.</p><strong id="TestMode">Этап 1: + Тестовый режим работы</strong> + + <p>В тестовом режиме реакция системы лицензирования на серийные + номера, все возвращаемые статусы и данные описываются в + конфигурационном файле. Файл называется VMPLicense.ini и должен + располагаться в рабочем каталоге приложения. В 10 шагах, + представленных ниже, мы пройдем от создания простейшего + приложения до полноценного использования системы лицензирования в + тестовом режиме с привязкой к оборудованию и ограничением срока + бесплатных обновлений.</p> + + <ul> + <li><a href="step11_app.htm">Шаг 1.1: Создаем защищаемое + приложение</a></li> + + <li><a href="step12_code.htm">Шаг 1.2: Добавляем код проверки + лицензии</a></li> + + <li><a href="step13_flags.htm">Шаг 1.3: Получаем флаги состояния + номера</a></li> + + <li><a href="step14_name.htm">Шаг 1.4: Получаем имя и e-mail + пользователя</a></li> + + <li><a href="step15_exp.htm">Шаг 1.5: Проверяем срок действия + номера</a></li> + + <li><a href="step16_time.htm">Шаг 1.6: Ограничиваем время работы + программы</a></li> + + <li><a href="step17_maxbuild.htm">Шаг 1.7: Ограничиваем + бесплатные обновления</a></li> + + <li><a href="step18_blacklist.htm">Шаг 1.8: Номера из "черного + списка"</a></li> + + <li><a href="step19_hwid.htm">Шаг 1.9: Привязка к + оборудованию</a></li> + + <li><a href="step1A_userdata.htm">Шаг 1.10: Пользовательские + данные</a></li> + </ul><strong id="RealMode">Этап 2: Реальный режим работы</strong> + + <p>В реальном режиме работы системы лицензирования VMProtect + помещает в защищаемое приложение специальный модуль + лицензирования. Модуль выполняет все те же функции, что и + тестовый код в SDK, но работает не с ini-файлом, а с содержимым + серийного номера. В следующих пяти шагах мы защитим простое + приложение полноценной защитой на основе VMProtect и системы + лицензирования.</p> + + <ul> + <li><a href="step21_src.htm">Шаг 2.1: Создаем новое защищаемое + приложение</a></li> + + <li><a href="step22_vmp.htm">Шаг 2.2: Создаем проект защиты в + VMProtect</a></li> + + <li><a href="step23_product.htm">Шаг 2.3: Первый запуск + защищенного продукта</a></li> + + <li><a href="step24_test.htm">Шаг 2.4: Тестируем + результат</a></li> + + <li><a href="step25_codelock.htm">Шаг 2.5: Привязываем код к + серийному номеру</a></li> + </ul><strong>Дополнительная информация</strong> + + <p>Значения всех битовых флагов, форматы структур и параметры + вызова функций можно посмотреть в разделе <a href="api.htm">API + системы лицензирования</a>. Этот раздел удобно использовать как + справочник, тогда как шаги, описанные выше, позволяют легко + реализовать готовые типовые схемы защиты.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step11_app.htm b/help/ru/manager/usage/step11_app.htm new file mode 100644 index 0000000..cb5afbd --- /dev/null +++ b/help/ru/manager/usage/step11_app.htm @@ -0,0 +1,62 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.1: Создаем защищаемое приложение</title> +</head> + +<body> + <h1>Шаг 1.1: Создаем защищаемое приложение</h1> + + <p>Первым шагом будет создание приложения. Это будет простое + приложение, без интерфейса пользователя и каких-либо серьезных + возможностей. Нашей задачей будет передать системе лицензирования + серийный номер и получить от нее ответ.</p> + <pre class="code">#include <windows.h> +#include <stdio.h> + +bool is_registered(const char *serial) +{ + return serial && serial[0] == 'X'; +} + +int main(int argc, char **argv) +{ + char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты + if (!is_registered(serial)) + { + printf("please register!\n"); + return 0; + } + printf("We are registered.\n"); + return 0; +} +</pre> + + <p>Программа реализует очень простую схему проверки серийного + номера. Функция <strong>is_registered()</strong> сравнивает + первую букву номера с 'Х' и считает номер корректным в случае + совпадения. Для некорректного номера выдается просьба о + регистрации, а в случае правильного номера выводится сообщение + "We are registered."</p> + + <p><a href="step12_code.htm">Следующим шагом</a> будет добавление + кода проверки серийного номера на основе системы лицензирования + VMProtect.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step12_code.htm b/help/ru/manager/usage/step12_code.htm new file mode 100644 index 0000000..75bad46 --- /dev/null +++ b/help/ru/manager/usage/step12_code.htm @@ -0,0 +1,105 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.2: Добавляем код проверки лицензии</title> +</head> + +<body> + <h1>Шаг 1.2: Добавляем код проверки лицензии</h1><strong>Подключаем + VMProtect SDK</strong> + + <p>Если вы этого еще не сделали, то сейчас самое время подключить + к проекту VMProtect SDK. SDK это три файла: заголовочный файл + (VMProtectSDK.h), файл библиотеки (VMProtectSDK32.lib) и dll-файл + с реализацией (VMProtectSDK32.dll). Для 64-битной платформы есть + отдельные реализации библиотеки и dll-файла.</p> + + <p>Помещаем dll-файл в рабочий каталог нашего приложения, + файл заголовков и библиотечный файл - рядом с исходниками, включаем + файл заголовков в основной файл:</p> + <pre class="code">#include <windows.h> +#include <stdio.h> +#include "VMProtectSDK.h" +</pre> + + <p>Собираем проект и убеждаемся, что он компилируется, запускается + и работает, как и раньше. Система лицензирования пока еще не + активна.</p><strong>Подаем серийный номер в систему + лицензирования</strong> + + <p>Теперь непосредственно после строки с серийным номером добавим + вызов функции SDK системы лицензирования:</p> + <pre class="code">char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты +int res = VMProtectSetSerialNumber(serial); +printf("res = 0x%08X\n", res); +</pre> + + <p>Если после этого программа будет завершаться с ошибкой об + отсутствии dll-файла, убедитесь, что вы положили соответствующий + DLL-файл в рабочий каталог нашего приложения. В случае успешного + запуска, вы должны увидеть сообщение:</p> + <pre class="code">res = 0x00000002 +</pre> + + <p>Число 2 соответствует флагу SERIAL_STATE_FLAG_INVALID, + <a href="api.htm">описанному в API</a>. Т.е. система + лицензирования посчитала наш ключ некорректным, что вполне + логично, т.к. мы до сих пор не "объяснили" системе лицензирования, + какие ключи считать правильными, а какие - нет.</p><strong>Задаем + "правильный" серийный номер</strong> + + <p>В тестовом режиме система лицензирования анализирует файл + VMProtectLicense.ini, и реагирует на вызовы функций согласно + указанным там настройкам. Подробно файл разбирается в следующих + шагах, а здесь мы просто создадим такой файл и поместим туда + следующий текст:</p> + <pre class="code">[TestLicense] +AcceptedSerialNumber=Xserialnumber +</pre> + + <p>Запустим нашу программу еще раз. Если вы снова получили код + ошибки "2", то убедитесь, что ini-файл находится в рабочем + каталоге приложения. В этот раз вы должны получить результат "0". + Признак того, что система лицензирования приняла и одобрила + серийный номер. Теперь мы можем убрать функцию + <strong>is_registered()</strong> - проверкой серийного номера + займется система лицензирования:</p> + <pre class="code">#include <windows.h> +#include <stdio.h> +#include "VMProtectSDK.h" + +int main(int argc, char **argv) +{ + char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты + + int res = VMProtectSetSerialNumber(serial); + printf("res = 0x%08X\n", res); + + if (res) + { + printf("please register!\n"); + return 0; + } + printf("We are registered.\n"); + return 0; +} +</pre><br /> + <a href="step13_flags.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step13_flags.htm b/help/ru/manager/usage/step13_flags.htm new file mode 100644 index 0000000..a392b38 --- /dev/null +++ b/help/ru/manager/usage/step13_flags.htm @@ -0,0 +1,96 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.3: Получаем флаги состояния серийного номера</title> +</head> + +<body> + <h1>Шаг 1.3: Получаем флаги состояния серийного + номера</h1><strong>Удобная функция для печати флагов</strong> + + <p>Первым делом добавим в наш файл одну удобную функцию, которая + будет печатать в человеческом виде значения флагов состояния + серийного номера. Код функции приведен ниже:</p> + <pre class="code">#define PRINT_HELPER(state, flag) if (state & flag) printf("%s ", #flag) +void print_state(INT state) +{ + if (state == 0) + { + printf("state = 0\n"); + return; + } + + printf("state = "); + PRINT_HELPER(state, SERIAL_STATE_FLAG_CORRUPTED); + PRINT_HELPER(state, SERIAL_STATE_FLAG_INVALID); + PRINT_HELPER(state, SERIAL_STATE_FLAG_BLACKLISTED); + PRINT_HELPER(state, SERIAL_STATE_FLAG_DATE_EXPIRED); + PRINT_HELPER(state, SERIAL_STATE_FLAG_RUNNING_TIME_OVER); + PRINT_HELPER(state, SERIAL_STATE_FLAG_BAD_HWID); + PRINT_HELPER(state, SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED); + printf("\n"); +} +</pre> + + <p>Несмотря на свой размер, функция очень простая - она + последовательно проверяет все битовые флаги и печатает те, что + присутствуют в переменной состояния. Заменим + <strong>printf</strong> после проверки номера на вызов + <strong>print_state</strong>, заодно временно поправим серийный + номер, который подается в систему лицензирования:</p> + <pre class="code">char *serial = "Xserialnumber1"; // зададим номер непосредственно в коде для простоты +int res = VMProtectSetSerialNumber(serial); +print_state(res); +</pre> + + <p>Если запустить эту программу, то на консоль выведется + следующее:</p> + <pre class="code">state = SERIAL_STATE_FLAG_INVALID +please register! +</pre> + + <p>Вернем теперь старый серийный номер, убрав "1", и запустим + программу еще раз:</p> + <pre class="code">state = 0 +We are registered. +</pre> + + <p>Теперь, когда мы можем видеть флаги состояние серийного + номера, перейдем к получению флагов и данных из серийного + номера.</p><strong>Получение состояния номера</strong> + + <p>Состояние номера можно получить тремя способами: вызвав + <strong>VMProtectSetSerialNumber()</strong>, вызвав + <strong>VMProtectGetSerialNumberState()</strong> и вызвав + <strong>VMProtectGetSerialNumberData()</strong> - флаги состояния + будут помещены в одно из полей структуры. Каждый из методов + предназначен для использования в разное время. Первая проверка + серийного номера происходит непосредственно при его установке. В + этот момент нужно отсекать некорректные номера, номера с истекшим + сроком действия, номера из черного списка и т.п. Некоторые + ограничения - скажем, максимальное время работы продукта или срок + действия номера, имеет смысл проверять и в процессе работы + программы. Тут оптимально воспользоваться простым и быстрым + методом <strong>VMProtectGetSerialNumberState()</strong>, а в + случае, если нужно получить подробную информацию о данных в + серийном номере, можно использовать более мощную функцию + <strong>VMProtectGetSerialNumberData()</strong>.</p><br /> + <a href="step14_name.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step14_name.htm b/help/ru/manager/usage/step14_name.htm new file mode 100644 index 0000000..c6b6759 --- /dev/null +++ b/help/ru/manager/usage/step14_name.htm @@ -0,0 +1,53 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.4: Получаем имя и e-mail пользователя</title> +</head> + +<body> + <h1>Шаг 1.4: Получаем имя и e-mail пользователя</h1> + + <p>Начнем с простого: получим из серийного номера имя и e-mail + пользователя (часто показываются в окне About). Для этого нам + придется прописать их в ini-файл. Добавим еще две строчки к нашим + двум:</p> + <pre class="code">[TestLicense] +AcceptedSerialNumber=Xserialnumber +UserName=John Doe +EMail=john@doe.com +</pre> + + <p>А в самой программе, в случае успешной регистрации, добавим + получение этих данных и вывод их на экран:</p> + <pre class="code">VMProtectSerialNumberData sd = {0}; +VMProtectGetSerialNumberData(&sd, sizeof(sd)); +printf("name = %ls,\ne-mail = %ls\n", sd.wUserName, sd.wEMail); +</pre> + + <p>Структура содержит данные в UNICODE, поэтому в + <strong>printf()</strong> использованы спецификаторы %ls вместо %s. + Программа должна вывести на экран текст:</p> + <pre class="code">state = 0 +We are registered. +name = John Doe, +e-mail = john@doe.com +</pre><br /> + <a href="step15_exp.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step15_exp.htm b/help/ru/manager/usage/step15_exp.htm new file mode 100644 index 0000000..19169c7 --- /dev/null +++ b/help/ru/manager/usage/step15_exp.htm @@ -0,0 +1,59 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.5: Проверяем срок действия серийного номера</title> +</head> + +<body> + <h1>Шаг 1.5: Проверяем срок действия серийного номера</h1> + + <p>Поместите в ini-файл строчку вида ExpDate=YYYYMMDD - например, + такую:</p> + <pre class="code">ExpDate=20000101 +</pre> + + <p>Важно, чтобы дата, указанная в строке, уже прошла. Т.е. + максимум - вчера. Запустив программу, вы увидите следующее:</p> + <pre class="code">state = SERIAL_STATE_FLAG_DATE_EXPIRED +please register! +</pre> + + <p>Добавим получение дополнительной информации перед выходом с + сообщением "please register":</p> + <pre class="code">if (res) +{ + VMProtectSerialNumberData sd = {0}; + VMProtectGetSerialNumberData(&sd, sizeof(sd)); + printf("exp. date: y = %d, m = %d, d = %d\n", sd.dtExpire.wYear, sd.dtExpire.bMonth, sd.dtExpire.bDay); + printf("please register!\n"); + return 0; +} +</pre> + + <p>Повторный запуск приложения даст нам больше подробностей:</p> + <pre class="code">state = SERIAL_STATE_FLAG_DATE_EXPIRED +exp. date: y = 2000, m = 1, d = 1 +please register! +</pre> + + <p>Удалите из ini-файла строку ExpDate=..., чтобы она не мешала + нам в дальнейшем.</p><br /> + <a href="step16_time.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step16_time.htm b/help/ru/manager/usage/step16_time.htm new file mode 100644 index 0000000..8ccd5d6 --- /dev/null +++ b/help/ru/manager/usage/step16_time.htm @@ -0,0 +1,79 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.6: Ограничиваем время работы программы</title> +</head> + +<body> + <h1>Шаг 1.6: Ограничиваем время работы программы</h1> + + <p>Вы можете ограничить время работы программы с момента запуска. + Это может быть полезно для демонстрационных целей: выдается + полноценный серийный номер, однако программа работает не более + пяти минут. Система лицензирования не закрывает такую программу + принудительно по истечении указанного времени, а лишь уведомляет + об окончании времени выставлением флага состояния. Зададим + ограничение времени работы в одну минуту, добавив в ini-файл + строчку:</p> + <pre class="code">TimeLimit=1 +</pre> + + <p>Модифицируем программу следующим образом:</p> + <pre class="code">int main(int argc, char **argv) +{ + char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты + + int res = VMProtectSetSerialNumber(serial); + print_state(res); + if (res) return 0; + + VMProtectSerialNumberData sd = {0}; + VMProtectGetSerialNumberData(&sd, sizeof(sd)); + printf("I will run for %d minute(s)\n", sd.bRunningTime); + print_state(VMProtectGetSerialNumberState()); + Sleep(60 * 1000 * sd.bRunningTime); + printf("After %d minute(s):\n", sd.bRunningTime); + print_state(VMProtectGetSerialNumberState()); + + return 0; +} +</pre> + + <p>Программа выводит состояние серийного номера в момент старта, + потом считывает максимальное время работы, ждет, пока оно пройдет + и выводит состояние номера еще раз. Для одной минуты мы получим + следующий результат:</p> + <pre class="code">state = 0 +I will run for 1 minute(s) +state = 0 +After 1 minute(s): +state = SERIAL_STATE_FLAG_RUNNING_TIME_OVER +</pre> + + <p>Защищаемая программа должна анализировать состояние серийного + номера с определенной периодичностью и завершить свою работу в + случае появления такого флага. Система лицензирования не делает + этого автоматически, т.к. программе может требоваться освободить + какие-то ресурсы, записать данные в файл и т.д. Также программа + может не завершаться по истечении данного времени, а переходить в + более ограниченный режим работы. Система лицензирования оставляет + эти вопросы на усмотрение разработчика.</p><br /> + <a href="step17_maxbuild.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step17_maxbuild.htm b/help/ru/manager/usage/step17_maxbuild.htm new file mode 100644 index 0000000..d76c271 --- /dev/null +++ b/help/ru/manager/usage/step17_maxbuild.htm @@ -0,0 +1,85 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.7: Ограничиваем бесплатные обновления</title> +</head> + +<body> + <h1>Шаг 1.7: Ограничиваем бесплатные обновления</h1><strong>Схема + работы</strong> + + <p>В момент защиты приложения VMProtect запоминает дату, когда это + происходило. Эта дата является для системы лицензирования датой + сборки приложения. В серийном номере можно прописать максимальную + дату сборки, для которой подойдет этот номер. Таким образом, если + при создании ключа Вы пропишете в него текущую дату + 1 год, то + ключ подойдет ко всем релизам Вашей программы, которые вы + выпустите в течение года. К релизу, выпущенному через год и 1 + день ключ уже не подойдет и у пользователя будет выбор: + пользоваться более старой версией или купить новый ключ, который + будет работать еще год.</p><strong>Пробуем на деле</strong> + + <p>Поместите в ini-файл строчку вида MaxBuildDate=YYYYMMDD - + например, такую:</p> + <pre class="code">MaxBuildDate=20000101 +</pre> + + <p>В тестовом режиме система лицензирования считает датой сборки + сегодняшнее число, поэтому важно, чтобы дата, указанная в строке, + уже прошла. Т.е. максимум - вчера. Модифицируйте исходный код + функции <strong>main()</strong>, чтобы он выглядел так:</p> + <pre class="code">int main(int argc, char **argv) +{ + char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты + + int res = VMProtectSetSerialNumber(serial); + print_state(res); + + if (res) + { + VMProtectSerialNumberData sd = {0}; + VMProtectGetSerialNumberData(&sd, sizeof(sd)); + printf("max. build date: y = %d, m = %d, d = %d\n", sd.dtMaxBuild.wYear, sd.dtMaxBuild.bMonth, sd.dtMaxBuild.bDay); + printf("please register!\n"); + return 0; + } + + printf("I'm registered\n"); + + return 0; +} +</pre> + + <p>Тогда при запуске программы вы увидите следующее:</p> + <pre class="code">state = SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED +max. build date: y = 2000, m = 1, d = 1 +please register! +</pre> + + <p>Заменив в ini-файле дату на сегодняшнюю или завтрашнюю, мы + получим "рабочую" программу:</p> + <pre class="code">state = 0 +I'm registered +</pre> + + <p>Удалите из ini-файла строку MaxBuildDate=..., чтобы она не + мешала нам в дальнейшем.</p><br /> + <a href="step18_blacklist.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step18_blacklist.htm b/help/ru/manager/usage/step18_blacklist.htm new file mode 100644 index 0000000..f0a1eab --- /dev/null +++ b/help/ru/manager/usage/step18_blacklist.htm @@ -0,0 +1,64 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.8: Номера из "черного списка"</title> +</head> + +<body> + <h1>Шаг 1.8: Номера из "черного списка"</h1> + + <p>Номер, помеченный в VMProtect как "заблокированный", больше не + должен приниматься системой лицензирования. При очередной защите + приложения VMProtect запишет в защищаемый файл хеш от номеров + черного списка, вследствие чего система лицензирования в этом приложении откажет при попытке + установить такой номер.</p> + + <p>Сократим до минимума код функции <strong>main()</strong>:</p> + <pre class="code">int main(int argc, char **argv) +{ + char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты + + int res = VMProtectSetSerialNumber(serial); + print_state(res); + + return 0; +} +</pre> + + <p>Запустим программу и убедимся, что система лицензирования + принимает наш серийный номер:</p> + <pre class="code">state = 0 +</pre> + + <p>Теперь занесем наш номер в черный список с точки зрения + системы лицензирования. Для этого в ini-файл добавим строку:</p> + <pre class="code">BlackListedSerialNumber=Xserialnumber +</pre> + + <p>И снова запускаем программу:</p> + <pre class="code">state = SERIAL_STATE_FLAG_BLACKLISTED +</pre> + + <p>Сообщать ли пользователю о занесении его номера в черный список, + или просто сообщить, что номер неверный - оставлено на усмотрение + разработчика. Система лицензирования лишь сообщает программе о + факте использования заблокированного номера.</p><br /> + <a href="step19_hwid.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step19_hwid.htm b/help/ru/manager/usage/step19_hwid.htm new file mode 100644 index 0000000..354206b --- /dev/null +++ b/help/ru/manager/usage/step19_hwid.htm @@ -0,0 +1,123 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.9: Привязка к оборудованию</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + p.c1 {color:red;} + /*]]>*/ + </style> +</head> + +<body> + <h1>Шаг 1.9: Привязка к оборудованию</h1><strong>Получение + идентификатора оборудования</strong> + + <p>Прежде чем привязываться к оборудованию, необходимо получить + идентификатор оборудования. Идентификатор помещается в серийный + номер и при передаче этого номера системе лицензирования + происходит проверка соответствия идентификаторов. Поэтому для + начала получим идентификатор нашего оборудования. Сократим + <strong>main()</strong> до самого короткого варианта:</p> + <pre class="code">int main(int argc, char **argv) +{ + int nSize = VMProtectGetCurrentHWID(NULL, 0); + char *buf = new char[nSize]; + VMProtectGetCurrentHWID(buf, nSize); + printf("HWID: %s\n", buf); + delete [] buf; + return 0; +} +</pre> + + <p>Запустив эту программу, мы получим тестовый идентификатор + оборудования, используемый по умолчанию:</p> + <pre class="code">HWID: myhwid +</pre> + + <p>Чтобы изменить идентификатор, используемый по умолчанию, + добавьте в ini-файл строку:</p> + <pre class="code">MyHWID=test +</pre> + + <p>Запустив программу после этого, мы увидим, что система + лицензирования теперь считает "test" идентификатором + оборудования:</p> + <pre class="code">HWID: test +</pre> + + <p class="c1"><strong>Внимание!</strong> реальный идентификатор + оборудования программа будет выдавать только после ее обработки в + VMProtect.</p><br /> + <strong>Серийный номер с привязкой к оборудованию</strong> + + <p>Чтобы наш тестовый серийный номер был привязан к оборудованию, + добавим в ini-файл еще одну строчку, на этот раз с + идентификатором, "записанным" в номер:</p> + <pre class="code">KeyHWID=test +</pre> + + <p>А функцию <strong>main()</strong> слегка усложним, она снова + будет подавать серийный номер и анализировать получаемый + результат:</p> + <pre> +int main(int argc, char **argv) +{ + int nSize = VMProtectGetCurrentHWID(NULL, 0); + char *buf = new char[nSize]; + VMProtectGetCurrentHWID(buf, nSize); + printf("HWID: %s\n", buf); + delete [] buf; + + char *serial = "Xserialnumber"; + int res = VMProtectSetSerialNumber(serial); + print_state(res); + return 0; +} +</pre> + + <p>Запустив код, получим следующий результат:</p> + <pre class="code">HWID: test +state = 0 +</pre> + + <p>Система лицензирования сравнила текущий идентификатор + оборудования и тот, который был запиан в серийном номере. + Идентификаторы совпали и функция + <strong>VMProtectSetSerialNumber()</strong> вернула 0 - серийный + номер подходит.</p> + + <p>Попробуем теперь "запустить" нашу программу на другом + оборудовании. Для этого поменяем значение "test" параметра MyHWID + в ini-файле на "new test". И снова запустим программу:</p> + <pre class="code">HWID: new test +state = SERIAL_STATE_FLAG_BAD_HWID +</pre> + + <p>На этот раз система лицензирования вернула флаг + SERIAL_STATE_FLAG_BAD_HWID, означающий несовпадение реально + идентификатора оборудования с тем, что хранится в серийном + номере. Текущий идентификатор оборудования, выведенный на экран - + "new test", а в серийном номере хранится "test". Поменяв в + ini-файле значение параметра KeyHWID на "new test" можно добиться + работы серийного номера и на этом "оборудовании".</p><br /> + <a href="step1A_userdata.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step1A_userdata.htm b/help/ru/manager/usage/step1A_userdata.htm new file mode 100644 index 0000000..15fc5de --- /dev/null +++ b/help/ru/manager/usage/step1A_userdata.htm @@ -0,0 +1,76 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.10: Пользовательские данные</title> +</head> + +<body> + <h1>Шаг 1.10: Пользовательские данные</h1> + + <p>Серийный номер может содержать до 255 байт произвольных + данных, которые система лицензирования без изменений передает + вызывающей программе. Это может быть какая-то дополнительная + информация о продаже, данные, без которых не будет работать + полная версия, или еще что-нибудь. Изменим функцию + <strong>main()</strong>, чтобы она считывала данные из серийного + номера и показывала их на экране:</p> + <pre class="code">int main(int argc, char **argv) +{ + char *serial = "Xserialnumber"; + int res = VMProtectSetSerialNumber(serial); + print_state(res); + if (res) return 0; + + VMProtectSerialNumberData sd = {0}; + VMProtectGetSerialNumberData(&sd, sizeof(sd)); + printf("Serial number has %d byte(s) of data\n", sd.nUserDataLength); + for (int i = 0; i < sd.nUserDataLength; i++) + printf("%02X ", sd.bUserData[i]); + printf("\n"); + return 0; +} +</pre> + + <p>Ini-файл при этом сократим до такого вида:</p> + <pre class="code">[TestLicense] +AcceptedSerialNumber=Xserialnumber +</pre> + + <p>Теперь запустим программу и убедимся, что наш серийный номер + подходит, но не содержит никаких данных:</p> + <pre class="code">state = 0 +Serial number has 0 byte(s) of data +</pre> + + <p>Чтобы добавить пользовательские данные в серийный номер, + необходимо создать в ini-файле переменную UserData и присвоить ей + строчку из HEX-символов. Символы должны идти парами, т.е. длина + строки должна быть кратна 2. Строка может быть, например, + такой:</p> + <pre class="code">UserData=010203A0B0C0D0E0 +</pre> + + <p>В этом случае при запуске программы мы получим следующий + результат:</p> + <pre class="code">state = 0 +Serial number has 8 byte(s) of data +01 02 03 A0 B0 C0 D0 E0 +</pre><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step21_src.htm b/help/ru/manager/usage/step21_src.htm new file mode 100644 index 0000000..65a2ec7 --- /dev/null +++ b/help/ru/manager/usage/step21_src.htm @@ -0,0 +1,109 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 2.1: Создаем новое защищенное приложение</title> +</head> + +<body> + <h1>Шаг 2.1: Создаем новое защищенное приложение</h1> + + <p>Если на первом этапе мы создавали несколько разных тестовых + приложений для изучения API системы лицензирования, то на втором этапе + приложение будет одно. Оно также будет консольным и в нем будет + функция <strong>foo()</strong>, которая может работать только в + зарегистрированной версии. Вот код нашего тестового + приложения:</p> + <pre class="code">#include <windows.h> +#include <stdio.h> +#include "VMProtectSDK.h" + +#define PRINT_HELPER(state, flag) if (state & flag) printf("%s ", #flag) +void print_state(INT state) +{ + if (state == 0) + { + printf("state = 0\n"); + return; + } + + printf("state = "); + PRINT_HELPER(state, SERIAL_STATE_FLAG_CORRUPTED); + PRINT_HELPER(state, SERIAL_STATE_FLAG_INVALID); + PRINT_HELPER(state, SERIAL_STATE_FLAG_BLACKLISTED); + PRINT_HELPER(state, SERIAL_STATE_FLAG_DATE_EXPIRED); + PRINT_HELPER(state, SERIAL_STATE_FLAG_RUNNING_TIME_OVER); + PRINT_HELPER(state, SERIAL_STATE_FLAG_BAD_HWID); + PRINT_HELPER(state, SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED); + printf("\n"); +} + +char *read_serial(const char *fname) +{ + FILE *f; + if (0 != fopen_s(&f, fname, "rb")) return NULL; + fseek(f, 0, SEEK_END); + int s = ftell(f); + fseek(f, 0, SEEK_SET); + char *buf = new char[s + 1]; + fread(buf, s, 1, f); + buf[s] = 0; + fclose(f); + return buf; +} + +// метод foo() очень короткий, но он нам нужен в виде отдельной функции +// поэтому мы попросим компилятор не делать его inline +__declspec(noinline) void foo() +{ + printf("I'm foo!\n"); +} + +int main(int argc, char **argv) +{ + char *serial = read_serial("serial.txt"); + int res = VMProtectSetSerialNumber(serial); + delete [] serial; + if (res) + { + printf("serial number is bad\n"); + print_state(res); + return 0; + } + printf("serial number is correct, calling foo()\n"); + foo(); + printf("done\n"); + return 0; +} +</pre> + + <p>Скомпилируем программу без отладочной информации, но в + настройках линкера попросим создать MAP-файл, который потребуется + для работы VMProtect. При запуске программы мы должны увидеть + следующий текст:</p> + <pre class="code">serial number is bad +state = SERIAL_STATE_FLAG_INVALID +</pre> + + <p>В настоящий момент система лицензирования все еще работает в + тестовом режиме, т.к. файл еще не был обработан VMProtect'ом и в + него не был внедрен модуль лицензирования. На <a href= + "step22_vmp.htm">следующем шаге</a> мы создадим проект VMProtect + и попробуем защитить нашу программу.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step22_vmp.htm b/help/ru/manager/usage/step22_vmp.htm new file mode 100644 index 0000000..bf0ac9b --- /dev/null +++ b/help/ru/manager/usage/step22_vmp.htm @@ -0,0 +1,42 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 2.2: Создаем проект защиты в VMProtect</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Шаг 2.2: Создаем проект защиты в VMProtect</h1> + + <p>Теперь, когда тестовая программа готова, скомпилирована и + рядом с ней находится ее MAP-файл, мы можем запустить VMProtect + Ultimate и открыть исполняемый файл. Нам нужно будет добавить в + проект две функции: _main (так Visual Studio переименовала нашу + функцию main()) и foo(). Обе функции видны в списке функций в + VMProtect в разделе "Функции".</p> + + <!-- <p class="c1"><br /><img src="../../images/real_project_functions.png" alt="Дерево проекта" /></p> --> + + <p>Далее необходимо инициализировать систему лицензирования. + Перейдите на вкладку "Лицензии" и создайте пару кючей длиной 2048 + бит.</p><br /> + <a href="step23_product.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step23_product.htm b/help/ru/manager/usage/step23_product.htm new file mode 100644 index 0000000..bf5784b --- /dev/null +++ b/help/ru/manager/usage/step23_product.htm @@ -0,0 +1,70 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 2.3: Первый запуск защищенного продукта</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Шаг 2.3: Первый запуск защищенного продукта</h1> + + <p>Система лицензирования инициализирована, так что мы можем + попробовать скомпилировать проект VMPrtoect и запустить + защищенный файл. Запустив его из командной строки мы получим + следующее сообщение:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is bad +state = SERIAL_STATE_FLAG_INVALID +</pre> + + <p>Запустив программу depends.exe, мы можем убедиться, что наш + защищенный файл более не связан с библиотекой VMProtectSDK.dll, а + значит модуль лицензирования встроен в приложение. Список + используемых DLL можно посмотреть и в VMProtect, открыв + защищенный файл и выбрав из раздела "Свойства" секцию "Импорты".</p> + + <p><img src="../../images/depends.png" /></p> + + <p>Наша защищаемая программа читает серийный номер из файла + serial.txt. Поскольку этого файла сейчас нет, то модулю лицензирования + подается пустой номер, который также не считается корректным. + Перейдем на закладку "лицензии" и сгенерируем серийный номер. + Подробно эта процедура описана <a href= + "../licenses.htm">здесь</a>, мы создадим самый простой серийный + номер без каких-либо ограничений.</p> + + <p><img src="../../images/project_add_license.png" /></p> + + <p>Затем скопируем серийный номер (в свойствах лицензии выделим поле + "Серийный номер" и нажмем Ctrl+C), создадим рядом с + защищенным приложением файл serial.txt и вставим туда серийный + номер. После запуска программы мы увидим следующее:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is correct, calling foo() +I'm foo +done +</pre> + + <p>Система лицензирования проверила серийный номер и посчитала + его корректным. На <a href="step24_test.htm">следующем шаге</a> мы + попробуем применить некоторые ограничения и посмотрим что из + этого выйдет.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step24_test.htm b/help/ru/manager/usage/step24_test.htm new file mode 100644 index 0000000..31f5ed8 --- /dev/null +++ b/help/ru/manager/usage/step24_test.htm @@ -0,0 +1,90 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 2.4: Тестируем результат</title> +</head> + +<body> + <h1>Шаг 2.4: Тестируем результат</h1><strong>Срок действия + серийного номера</strong> + + <p>Создадим еще один серийный номер с ограничением срока + действия - скажем, 2005-м годом. Эта дата уже прошла и наш номер + должен быть недействительным. Перейдите на закладку "Лицензии" и + нажмите кнопку "Добавить лицензию". В появившемся окне поставьте + галочку "Срок годности" и введите "30 сентября 2005 года". + Создайте номер, скопируйте его и поместите в файл seral.txt, + после чего запустите программу:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is bad +state = SERIAL_STATE_FLAG_DATE_EXPIRED +</pre> + + <p>Модуль лицензирования вернул флаг "срок действия номера + закончен". Вернем рабочий номер обратно в файл serial.txt и + убедимся, что его модуль лицензирования примет без проблем.</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is correct, calling foo() +I'm foo +done +</pre><strong>Занесение номера в черный список</strong> + + <p>Предположим, что наш "хороший" серийный номер выложен в + Интернет. Нам необходимо его заблокировать, чтобы в следующих + версиях программы он уже не работал. Для этого мы выбираем его в + списке номеров и нажимаем кнопку "Заблокировать". Сам факт + нажатия кнопки не блокирует серийный номер в защищенном + приложении, однако после повторной защиты файла, он откажется + принимать этот серийный номер. Проверим. Если сейчас запустить + нашу программу, то она примет заблокированный номер без проблем, + т.к. это старая версия программы и она еще не знает о + блокировке:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is correct, calling foo() +I'm foo +done +</pre> + + <p>Сделаем копию нашей программы и назовем ее + "dummy_app1.vmp.exe", а после этого перейдем в VMProtect и + повторно защитим наше приложение, после чего запустим новую + версию программы:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is bad +state = SERIAL_STATE_FLAG_BLACKLISTED +</pre> + + <p>Теперь для сравнения еще раз запустим старую версию + программы:</p> + <pre class="code">C:\test>dummy_app1.vmp.exe +serial number is correct, calling foo() +I'm foo +done +</pre> + + <p>Старая версия ничего не знает о блокировании номера и + продолжает работать как и раньше. </p><br /> + <br /><p>На <a href= + "step25_codelock.htm">последнем шаге</a> мы попробуем привязать + выполняемый код к серийному номеру. Перед этим разблокируйте + серийный номер и перезащитите приложение в VMProtect, чтобы оно + снова принимало наш серийный номер. Или создайте новую + лицензию.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step25_codelock.htm b/help/ru/manager/usage/step25_codelock.htm new file mode 100644 index 0000000..8cbe5c4 --- /dev/null +++ b/help/ru/manager/usage/step25_codelock.htm @@ -0,0 +1,144 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 2.5. Привязка кода к серийному номеру</title> + <style type="text/css"> +/*<![CDATA[*/ + p.c2 {color:red;} + span.c1 {background-color:yellow;} + /*]]>*/ + </style> +</head> + +<body> + <h1>Шаг 2.5. Привязка кода к серийному номеру</h1> + + <p>Одним из наиболее популярных способов взлома программ является + поиск проверки серийного номера и последующего условного + перехода. Если номер корректен, то ход выполнения программы идет + по одной ветке, если некорректен, то по другой. Хакер находит + этот переход и заменяет его на безусловный переход на + "правильную" ветку. Давайте "взломаем" таким образом нашу + тестовую программу. На уровне исходников, конечно же. "Отключим" + условный переход:</p> + <pre class="code">char *serial = read_serial("serial.txt"); +int res = VMProtectSetSerialNumber(serial); +delete [] serial; +if (<span class="c1">false &&</span> res) +{ +</pre> + + <p>Теперь наша программа примет любой серийный номер и будет + работать как ни в чем не бывало. Безусловно, если файл защищен + VMProtect, то даже опытному хакеру потребуется не один месяц, + чтобы найти и исправить этот переход так, как сделали это мы. А с + учетом того, что правильно защищенная программа проверяет + серийный номер не в одном месте и не всегда, то даже такая + простая проверка уже достаточно надежна. Однако мы пойдем + дальше.</p><strong>Привяжем код к серийному номеру</strong> + + <p class="c2"><strong>Внимание!</strong> демо-версия VMProtect + имеет ограничение на количество обрабатываемых функций: + обрабатывается только одна функция. Поэтому в случае + использования демо-версии, необходимо включать в проект только + функцию foo(), т.к. в противном случае демо-версия VMProtect + может выбрать для защиты функцию main() и привязка кода к + серийному номеру не сработает.</p> + + <p>Система лицензирования VMProtect позволяет привязать код одной + или нескольких функций к серийному номеру так, что они не будут + работать без корректного номера. Тело функции виртуализируется, + потом шифруется и может быть расшифровано только при наличии + корректного серийного номера. То есть даже если хакер найдет и + исправит условный переход в коде проверки номера, функции, + привязанные к номеру, все равно не будут работать. Давайте + попробуем. В VMProtect в разделе "Функции" выберем функцию <strong>foo()</strong> и в + правой панели изменим значение опции "Привязать к серийному номеру" на "Да".</p> + + <p><img src="../../images/lock_to_serial.png" /></p> + + <p>После этого защитим наше приложение. С учетом + того, что оно "взломано", поместим в файл serial.txt произвольный + текст и запустим приложение. В консоли появится текст:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is correct, calling foo() +</pre> + + <p>То есть хакер "исправил" нужный условный переход и программа + пошла по "правильной" ветке. Однако в момент вызова + <strong>foo()</strong> программа выводит сообщение:</p> + + <p><img src="../../images/codelock_error.png" /></p> + + <p>Так как мы привязали функцию <strong>foo()</strong> к + серийному номеру, а у хакера его нет, то при попытке расшифровать + код функции модуль лицензирования выдал сообщение о невозможности + продолжить выполнение программы. После нажатия кнопки "ОК" + программа завершится и в консоли мы не увидим строчки + "done".</p><strong>Что привязывать к серийному номеру?</strong> + + <p>Привязывать к серийному номеру имеет смысл те функции, которые + вызываются только в зарегистрированной версии программы. Так как + привязка возможна только при использовании виртуализации, то + необходимо принимать во внимание возможное падение + производительности. Скажем, если текстовый редактор не позволяет + сохранять результаты своей работы в демо-версии, то к серийному + номеру можно привязать функцию сохранения документа. Если эта + функция вызывает ряд других в процессе работы, то их привязывать + уже не обязательно, так как без основной функции от них будет + немного толку.</p> + + <p>Также необходимо помнить, что вызов привязанной функции без + серийного номера приведет к завершению работы программы без + возможности сохранения результатов работы, поэтому тщательно + тестируйте защищаемую программу, чтобы она не позволяла вызвать + такие функции в демо-режиме. В примере с текстовым редактором + убедитесь, что в демо-режиме пункт меню "Сохранить" всегда + неактивен, что комбинация Ctrl+S не срабатывает и что при + закрытии программы также не предлагается сохранить изменения. В + противном случае пользователь может составить негативное мнение о + вашей программе.</p><strong>Привязка к серийному номеру и + нерабочие номера</strong> + + <p>При вызове функции <strong>VMProtectSetSerialNumber()</strong> + модуль лицензирования проверяет переданный серийный номер и + зашифрованные участки кода будут выполняться только в том случае, + если на момент проверки серийный номер был полностью корректным - + не занесенным в черный список, с правильным идентификатором + оборудования, с неистекшим сроком годности и т.п. В этом случае все + зашифрованные процедуры будут выполняться до завершения работы + приложения или до нового вызова + <strong>VMProtectSetSerialNumber()</strong>.</p> + + <p>Некоторые ограничения могут "сработать" в процессе выполнения + программы: например, может истечь время работы программы или + окончится срок действия серийного номера. В этом случае модуль + лицензирования продолжит расшифровывать и выполнять функции, + привязанные к серийному номеру. Это делается потому, что + защищенному приложению будет сложно отследить момент срабатывания + ограничений и соответствующим образом изменить модель своего + поведения (заблокировать пункты меню и т.п). Если модуль + лицензирования неожиданно для приложения перестанет выполнять + привязанные к серийному номеру участки кода, это с большой + вероятностью приведет к неработоспособности приложения. Поэтому + все решается в момент установки серийного номера и именно в этот + момент определяется режим, в котором будет работать + приложение.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> |