first commit

Version 3.x.x
This commit is contained in:
VNGhostMans
2023-05-14 20:21:09 +07:00
parent a3037a8db3
commit 5ec92ee05e
1166 changed files with 1036539 additions and 0 deletions

234
help/ru/about_vmprotect.htm Normal file
View File

@@ -0,0 +1,234 @@
<!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>Программа VMProtect относится к новому поколению средств
защиты программного обеспечения. VMProtect поддерживает
компиляторы Delphi, Borland C Builder, Visual C/C++, Visual Basic
(native), Virtual Pascal, XCode, при этом VMProtect содержит встроенный
дизассемблер, позволяющий работать с исполняемыми файлами для операционных систем Windows и Mac OS X,
а также подключать MAP-файл, создаваемый компилятором,
для быстрого выбора участков кода, которые следует защитить. Для
автоматизации операций по защите приложения в VMProtect
реализован встроенный скриптовый язык. VMProtect обладает полной
поддержкой 32/64-разрядных операционных систем семейства Windows
(начиная с версии Win2k) и Mac OS X (начиная с версии 10.6),
при этом независимо от платформы VMProtect поддерживает весь спектр
исполняемых файлов (Windows версия может работать с файлами от Mac OS X и наоборот).</p>
<p>Базовым принципом, на основе которого построен VMProtect,
является обеспечение эффективной защиты кода приложения от
изучения, так как именно максимальное усложнение понимания логики
работы внутренних механизмов защиты приложения создает
максимальные трудности при взломе программы. Основными методами
защиты программного кода, применяемыми VMProtect, являются
виртуализация, мутация и смешанный метод защиты, сочетающий
мутацию кода приложения с его последующей виртуализацией.</p>
<p>Одним из достоинств реализации метода виртуализации в
программе VMProtect является то, что виртуальная машина, на
которой выполняются виртуализированные фрагменты кода,
встраивается в результирующий код защищаемого приложения.
Следовательно, для функционирования приложения, защищенного с
помощью VMProtect, нет необходимости использовать какие-либо
дополнительные библиотеки или модули. VMProtect позволяет
использовать несколько отличных друг от друга виртуальных машин
для защиты разных участков кода одного приложения, что еще больше
усложняет процесс взлома защиты, так как взломщику будет
необходимо анализировать архитектуру уже нескольких виртуальных
машин.</p>
<p>Метод мутации кода приложения, реализованный в VMProtect,
основан на обфускации, в процессе которой в код приложения
добавляются "мусорные" команды, "мертвый" код, случайные условные
переходы, выполняется мутация оригинальных команд, а также
переносится в стек выполнение ряда операций.</p>
<p>Ключевым отличием программы VMProtect от других протекторов
является то, что с ее помощью можно защитить различные участки
кода разными методами: часть кода виртуализировать, часть
обфусцировать, а для самых критичных участков применить смешанный
метод защиты.</p>
<p>Для предотвращения ложных срабатываний со стороны антивирусов зарегистрированная
версия VMProtect использует библиотеку <a href="http://standards.ieee.org/develop/indconn/icsg/taggant.pdf">Taggant</a>, которая подписывает
защищаемый файл сертификатом владельца лицензии.</p>
<p>Еще одной уникальной возможностью программы VMProtect является
включение в код приложения <a href=
"dictionary.htm#Watermarks">водяных знаков</a>, позволяющих
однозначно идентифицировать официального владельца взломанного
экземпляра программы, а следовательно, принять к нему
соответствующие меры.</p>
<p>Программа VMProtect доступна в 3-х версиях:</p>
<ul>
<li>Lite (облегченная версия);</li>
<li>Professional (базовая версия);</li>
<li>Ultimate (максимальная версия);</li>
</ul>
<p>Отличия функциональных возможностей разных версий VMProtect
приведены в таблице:</p>
<table border="1" cellspacing="0" cellpadding="2">
<tr align="center">
<td rowspan="2" align="center">
<strong>Возможности</strong></td>
<td colspan="3" align="center"><strong>Версия
VMProtect</strong></td>
</tr>
<tr align="center">
<td width="12%" align="center">Lite</td>
<td width="12%" align="center">Professional</td>
<td width="12%" align="center">Ultimate</td>
</tr>
<tr bgcolor="#E0E0E0">
<td align="left" colspan="4" class="c1"><strong>Методы
защиты</strong></td>
</tr>
<tr>
<td>Мутация</td>
<td align="center">+</td>
<td align="center">+</td>
<td align="center">+</td>
</tr>
<tr>
<td>Виртуализация</td>
<td align="center">+</td>
<td align="center">+</td>
<td align="center">+</td>
</tr>
<tr>
<td>Ультра (мутация+виртуализация)</td>
<td align="center">+</td>
<td align="center">+</td>
<td align="center">+</td>
</tr>
<tr>
<td>Консольная версия</td>
<td align="center">-</td>
<td align="center">+</td>
<td align="center">+</td>
</tr>
<tr bgcolor="#E0E0E0">
<td align="left" colspan="4"><strong>Опции
защиты</strong></td>
</tr>
<tr>
<td>Защита памяти</td>
<td align="center">+</td>
<td align="center">+</td>
<td align="center">+</td>
</tr>
<tr>
<td>Защита импорта</td>
<td align="center">+</td>
<td align="center">+</td>
<td align="center">+</td>
</tr>
<tr>
<td>Защита ресурсов</td>
<td align="center">+</td>
<td align="center">+</td>
<td align="center">+</td>
</tr>
<tr>
<td>Упаковка</td>
<td align="center">+</td>
<td align="center">+</td>
<td align="center">+</td>
</tr>
<tr>
<td>Определение отладчика</td>
<td align="center">+</td>
<td align="center">+</td>
<td align="center">+</td>
</tr>
<tr>
<td>Определение средств виртуализации</td>
<td align="center">+</td>
<td align="center">+</td>
<td align="center">+</td>
</tr>
<tr bgcolor="#E0E0E0">
<td align="left" colspan="4"><strong>Сервисные
функции</strong></td>
</tr>
<tr>
<td>Водяные знаки</td>
<td align="center">-</td>
<td align="center">+</td>
<td align="center">+</td>
</tr>
<tr>
<td>Скриптовый язык</td>
<td align="center">-</td>
<td align="center">+</td>
<td align="center">+</td>
</tr>
<tr>
<td>Система лицензирования</td>
<td align="center">-</td>
<td align="center">-</td>
<td align="center">+</td>
</tr>
<tr>
<td>Менеджер лицензий</td>
<td align="center">-</td>
<td align="center">-</td>
<td align="center">+</td>
</tr>
<tr>
<td>Защита файлов</td>
<td align="center">-</td>
<td align="center">-</td>
<td align="center">+</td>
</tr>
</table>
<br />
<br />
<br />
<br />
<hr noshade="noshade" size="1" />
<div align="center">
© 2006-2015 Copyright VMProtect Software
</div>
</body>
</html>

41
help/ru/contacts.htm Normal file
View File

@@ -0,0 +1,41 @@
<!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>По всем вопросам, связанным с работой программы или её
приобретением, обращайтесь к нам по адресу:<br />
www: <a href=
"http://www.vmpsoft.com">http://www.vmpsoft.com</a><br />
e-mail: <a href=
"mailto:info@vmpsoft.com">info@vmpsoft.com</a><br />
icq uin: <a href=
"http://wwp.icq.com/scripts/search.dll?to=65107137">65107137</a><br />
</p><a href="http://www.vmpsoft.com/news.php" target=
"_blank">Новости</a> | <a href="http://www.vmpsoft.com/buy.php"
target="_blank">Купить</a> | <a href=
"http://www.vmpsoft.com/forum/index.php" target=
"_blank">Форум</a><br />
<br />
<br />
<br />
<br />
<hr noshade="noshade" size="1" />
<div align="center">
© 2006-2015 Copyright VMProtect Software
</div>
</body>
</html>

137
help/ru/create_project.htm Normal file
View File

@@ -0,0 +1,137 @@
<!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>Для примера рассмотрим простейшее приложение, состоящее из
одной формы (Form1), элемента ввода текста (Edit1) и кнопки
(Button1). Работа приложения заключается в следующем: при нажатии
на кнопку Button1 проверяется корректность введенного пароля и
при этом выдается соответствующее сообщение.</p><br />
<img src="images/delphi_project.png" />
<p>Пароль проверяется по простейшему алгоритму: сначала он
преобразуется в число, после чего определяется остаток от деления
данного числа на 17. Пароль считается правильным, если остаток от
деления числового представления пароля на 17 равен 13. Процедура
проверки пароля на языке программирования Delphi реализуется
следующим образом:</p>
<pre class="code">function TForm1.CheckPassword: Boolean;
begin
Result:=(StrToIntDef(Edit1.Text, 0) mod 17=13);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if CheckPassword then
MessageDlg('Correct password', mtInformation, [mbOK], 0)
else
begin
MessageDlg('Incorrect password', mtError, [mbOK], 0);
Edit1.SetFocus;
end;
end;
</pre>
<p>Выбор защищаемых процедур и функций может осуществляться тремя
способами:</p>
<ul>
<li>С <a href="use_map_file.htm">использованием MAP-файла</a>,
который формируется компилятором при создании исполняемого
модуля программы. В MAP-файле содержится вся необходимая
информация об именах и адресах всех процедур и функций
приложения. В случае использования MAP-файла при работе с
VMProtect выбор защищаемых процедур и функций может
осуществляться по имени. Используя МАР-файл, после
перекомпиляции проекта VMProtect автоматически определит новые
адреса процедур и функций.</li>
<li>С <a href="use_markers.htm">использованием маркеров</a>,
которые вставляются в исходный код приложения. Маркеры
представляют собой специальные метки, по которым VMProtect
определяет границы защищаемого блока. Также VMProtect
поддерживает маркеры с предустановленным типом компиляции.
Использование маркеров целесообразно, если следует защитить
только часть процедуры или функции. При использовании маркеров
можно указать части кода, в которых в дальнейшем можно будет
защитить строковые константы.</li>
<li>По адресам защищаемых процедур в исполняемом файле. По
сравнению с предыдущими данный способ менее удобен в
использовании, так как при любой доработке программы и,
соответственно, ее перекомпиляции будет необходимо определять
все адреса повторно. Данный способ рекомендуется лишь для
защиты программных продуктов, для которых отсутствуют исходные
тексты.</li>
</ul>
<p>Использование MAP-файла для определения границ защищаемого
кода имеет еще один важный плюс, который требует отдельного
рассмотрения. Почти любая процедура или функция, обладающая
локальными переменными или использующая стек для хранения
регистров и/или промежуточных результатов вычислений, имеет так
называемые пролог и эпилог, находящиеся соответственно в начале и
в конце скомпилированной процедуры или функции:</p>
<pre class="code">push ebp \
mov ebp, esp \ пролог
push 00 /
push ebx /
...
pop ebx \
pop ecx \ эпилог
pop ebp /
ret /
</pre>
<p>Из-за особенностей реализации современных компиляторов маркеры
кода никогда не охватывают пролог и эпилог (даже если маркерами
будет охвачен весь текст функции CheckPassword, находящийся между
begin и end). Для взлома будет достаточно откорректировать пролог
функции таким образом, чтобы виртуалированный код не был
выполнен. Для функции CheckPassword это можно сделать следующим
образом:</p>
<pre class="code">mov eax, 1
ret
</pre>
<p><strong>Важно:</strong><br />
Если для выбора виртуализированных участков кода используется
MAP-файл, то пролог и эпилог будут тоже завиртуализированы, что
повысит защищенность программы. Более того, если одна
виртуализированная функция вызывается из другой
виртуализированной функции, то передача управления между ними
будет осуществлена без перехода на адрес вызываемой функции
(вызов будет представлять собой простой переход на другой адрес
байт-кода внутри исполнителя виртуальной машины), что также
повысит степень защищенности программы, так как внесенные
взломщиком в точку входа корректировки окажутся бесполезными. При
работе с виртуализированными функциями передача управления точке
входа в завиртуализированную функцию будет осуществлена лишь в
случае вызова защищенной функции из незащищенного или
промутированного участка кода.</p><br />
<br />
<br />
<br />
<br />
<hr noshade="noshade" size="1" />
<div align="center">
© 2006-2015 Copyright VMProtect Software
</div>
</body>
</html>

55
help/ru/default.css Normal file
View File

@@ -0,0 +1,55 @@
body,td,th
{
font-family: Tahoma, Arial, Helvetica, sans-serif;
font-size: 1em;
}
tt
{
font-family: "Courier new";
font-size: 1.1em;
}
tr
{
vertical-align: top;
}
pre
{
font-family: "Courier new", monospace;
font-size: 1.1em;
}
.indent
{
margin-left: 2em;
}
.code
{
font-family: "Courier new";
background: #f8f8f8;
color: black;
padding: 4px;
border-style: solid;
border-color: #e0e0e0;
overflow: auto;
border-width: 1px;
}
td, th
{
border-style: solid;
border-color: black;
}
table
{
border-collapse: collapse;
}
div.unhide_if_no_site
{
visibility: visible !important;
}

107
help/ru/dictionary.htm Normal file
View File

@@ -0,0 +1,107 @@
<!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>Эффективное использование любого инструмента невозможно без
понимания терминологии, специфичной для соответствующей
предметной области. В данном глоссарии дана расшифровка
терминологии, применяемой в разрезе использования программы
VMProtect. Глоссарий не претендует на универсальность и
всеохватность, предложенное в нем толкование терминов может
отличаться от классического.</p>
<p><a name="ByteCode" id="ByteCode"><strong>Байт-код</strong></a> - код, полученный после
преобразования машинных команд реального процессора в команды
виртуальной машины.</p>
<p><a name="Virtualization" id="Virtualization"><strong>Виртуализация</strong></a> - процесс преобразования части
исполняемого кода приложения в команды виртуальной машины,
обладающей неизвестной потенциальному взломщику системой команд,
архитектурой и логикой работы. Виртуализированные участки кода
выполняются интерпретатором (исполнителем виртуальной машины) без
предварительного преобразования в машинные коды процессора. В
общем случае задача реинжиниринга виртуализированных фрагментов
сводится к изучению архитектуры виртуальной машины, созданию
дизассемблера, соответствующего архитектуре имитируемого
виртуальной машиной процессора, и анализу дизассемблированного
кода.</p>
<p><a name="VirtualMachine" id="VirtualMachine"><strong>Виртуальная машина</strong></a> - программный код,
непосредственно выполняющий байт-код в защищенной программе.</p>
<p><a name="Watermarks" id="Watermarks"><strong>Водяные
знаки</strong></a> - уникальный для каждого пользователя массив
байт, позволяющий однозначно идентифицировать легального
владельца взломанной копии программы.</p>
<p><a name="Mutation" id="Mutation"><strong>Мутация</strong></a> - замена исходной команды аналогом
или определенной последовательностью команд, обеспечивающей тот
же результат, что и исходная команда.</p>
<p><a name="Obfuscation" id="Obfuscation"><strong>Обфускация</strong></a> - совокупность методик и средств,
направленных на затруднение анализа программного кода. В
зависимости от языка программирования, на котором написана
защищаемая программа, используются различные типы
программ-обфускаторов. При обфускации приложений, написанных на
интерпретируемых языках (Perl, PHP и др.), изменения вносятся в
исходные тексты: удаляются комментарии, переменным присваиваются
бессмысленные имена, выполняется шифрация строковых констант и
т.д. При обфускации программ, написанных на Java / .NET,
выполняют преобразования байт-кода, обрабатываемого виртуальной
машиной. При обфускации скомпилированных программ модифицируют
машинный код: в него вносятся "мусорные" команды, "мертвый код",
случайные переходы, выполняется мутация исходных команд, часть
операций переносится в стек, а также выполняются различные
структурные (реже математические) преобразования. При
реинжиниринге обфусцированых участков кода их пытаются привести в
исходный вид, что при определенном подходе к обфускации
становится очень трудоемкой задачей.</p>
<p><a name="Protector" id="Protector"><strong>Программа-протектор</strong></a> - программа,
предназначенная для защиты других программных продуктов от
взлома. Подавляющее большинство современных протекторов не
модифицируют исходный код приложения, а выполняют его
упаковку/шифрацию, при этом основной упор сделан на защиту
программы (процедуры) распаковки/расшифровки.</p>
<p><a name="EntryPoint" id="EntryPoint"><strong>Точка входа в
программу (EntryPoint)</strong></a> - представляет собой
начальный адрес, с которого начинается исполнение загруженной в память программы.</p>
<p><a name="Pack" id="Pack"><strong>Упаковка</strong></a> - метод
защиты кода приложения, при котором производится сжатие
исполняемого файла программы и/или используемых библиотек с
помощью нестандартных алгоритмов. При использовании упаковки
защищаемый программный код сжимается упаковщиком, а при запуске
приложения у конечного пользователя производится его полная или
частичная распаковка.</p>
<p><a name="Crypt" id="Crypt"><strong>Шифрация</strong></a> - защита части кода приложения с
помощью криптостойких алгоритмов. Программное обеспечение,
защищенное с помощью шифрации, требует от конечного пользователя
ввода кода активации, который снимает установленные разработчиком
ограничения незарегистрированной версии.</p><br />
<br />
<br />
<br />
<br />
<hr noshade="noshade" size="1" />
<div align="center">
© 2006-2015 Copyright VMProtect Software
</div>
</body>
</html>

139
help/ru/faq.htm Normal file
View File

@@ -0,0 +1,139 @@
<!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>Приобретение VMProtect</h3>
<p><strong>Приобретая VMProtect, смогу ли я использовать его на
разных компьютерах?</strong><br />
Вы можете установить и использовать VMProtect на любом количестве
компьютеров, которые необходимы вам для работы.</p>
<p><strong>В чем заключается разница между Personal и Company
лицензиями и какую лицензию мне нужно выбрать при
покупке?</strong><br />
Эти лицензии отличаются только типом владельца. Если Вы являетесь
частным разработчиком, то выберите Personal лицензию. Если Вы
являетесь руководителем организации или планируете использовать
продукт в своей организации, то выберите Company лицензию.</p>
<p><strong>Каким образом осуществляется доставка полной версии
VMProtect после покупки?</strong><br />
Доставка полной версии (и всех последующих обновлений VMProtect,
входящих в ежегодную подписку) осуществляется с помощью
электронной почты. В письме отправляется ссылка на архив, содержащий установочный файл с полной версией VMProtect.
Поэтому перед покупкой VMProtect рекомендуется отключить все спам фильтры в настройках своего почтового
ящика.</p>
<p><strong>После покупки VMProtect смогу ли я бесплатно получать
новые версии или нужно будет их оплачивать
дополнительно?</strong><br />
После покупки Вы будете бесплатно получать новые версии в течение
года. По истечении этого срока Вы можете <a href=
"http://www.vmpsoft.com/buy.php">продлить ежегодную подписку</a>
либо использовать текущую версию VMProtect без ограничений по
времени.</p>
<p><strong>Возможно ли приобрести VMProtect с помощью кредитной
карты или PayPal?</strong><br />
Вы можете приобрести VMProtect с помощью кредитной карты или
PayPal. Для этого необходимо на <a href=
"http://www.vmpsoft.com/buy.php">странице покупки</a> выбрать необходимую версию VMProtect
и на следующей странице в качестве метода оплаты выбрать кредитную карту или PayPal.</p>
<h3>Общие вопросы</h3>
<p><strong>Есть ли возможность автоматически зашифровать строки и
массивы данных?</strong><br />
В VMProtect существует возможность скрывать <a href=
"sdk_functions.htm#VMProtectDecryptStringA">ANSI константы</a> и
<a href="sdk_functions.htm#VMProtectDecryptStringW">Unicode
константы</a>. Все остальные данные, с которыми работает
обрабатываемый код, остаются в оригинальном виде. Рекомендуется
всю конфиденциальную информацию хранить в зашифрованном виде и
расшифровывать непосредственно перед использованием. Сам
расшифровщик можно <a href=
"project_functions.htm#CompilationTypes">завиртуализировать</a>.</p>
<p><strong>Есть ли возможность защищать процедуры, которые
вызываются из разных потоков моего приложения?</strong><br />
VMProtect полностью поддерживает многопоточные приложения и для
защиты этих процедур не существует никаких дополнительных
ограничений.</p>
<p><strong>Возможно ли совместное использование VMProtect с
другим протектором (упаковщиком)?</strong><br />
Использование каких-либо упаковщиков (протекторов) после защиты
файла с помощью VMProtect может привести к неработоспособности
защищенного приложения.</p>
<p><strong>Необходимо ли включать
VMProtectSDK32.dll/VMProtectSDK64.dll в дистрибутив
программы?</strong><br />
Данные библиотеки используются только на этапе отладки программы
(до её защиты). После защиты программы с помощью VMProtect вся
информация об использовании этих DLL полностью удаляется и
поэтому нет необходимости включать данные библиотеки в
дистрибутив программы.</p>
<h3>Сообщения компилятора</h3>
<p><strong>Что означает данная ошибка: VMProtectMarker
"ToolButton1Click.1".0044327D: Адрес используется процедурой
"TForm1.ToolButton1Click"?</strong><br />
Данная ошибка означает, что одна и таже команда с адресом
0044327D используется в двух процедурах, которые в данный момент
включены в список защищаемых объектов. Для решения этой проблемы
необходимо исключить одну из процедур (в данном случае это
VMProtectMarker "ToolButton1Click.1" и TForm1.ToolButton1Click)
из списка защищаемых объектов.</p>
<p><strong>Что означает данная ошибка: [Ошибка]
TForm1.Test.004433F4: Минимальный размер процедуры для компиляции
5 байт?</strong><br />
Данная ошибка означает, что процедура TForm1.Test слишком мала и
не может быть защищена. Для решения этой проблемы необходимо
исключить эту процедуру из списка защищаемых объектов.</p>
<p><strong>Что означает данное предупреждение:
TForm1.ToolButton1Click.00443368: Переход на внутренний адрес:
00443337?</strong><br />
Данное предупреждение означает, что возможен переход из
незащищенного кода внутрь защищенного (этот переход может
привести к неработоспособности защищенной программы). Для решения
этой проблемы необходимо пометить адрес 00443337 как <a href=
"project_functions.htm#ExtAddress">внешний</a>.</p>
<p><strong>Что означает данная ошибка: Секция ".text" находится в
области создания новой секции?</strong><br />
Данная ошибка обычно возникает при защите драйверов и означает,
что свободное место между первой секций файла и служебной
информацией, расположенной в заголовке файла, слишком мало для
создания новой секции. Для решения этой проблемы необходимо
увеличить величину выравнивания для секций в исходных текстах
драйвера и полностью его пересобрать (например: если драйвер
собирается с помощью WDK/DDK, то необходимо добавить строку
DRIVER_ALIGNMENT=0x200 в файл SOURCES).</p>
<br />
<br />
<br />
<br />
<hr noshade="noshade" size="1" />
<div align="center">
© 2006-2015 Copyright VMProtect Software
</div>
</body>
</html>

31
help/ru/functions.htm Normal file
View File

@@ -0,0 +1,31 @@
<!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>
<p><img src="images/functions.png" /></p>
<p>При выборе функции, ее свойства и опции защиты отображаются в основной панели. Для каждой функции можно выбрать <a href="project_functions.htm#CompilationTypes">тип компиляции</a> и установить <a href="manager/features.htm#lock">привязку к серийному номеру</a>.</p>
<br />
<br />
<br />
<br />
<hr noshade="noshade" size="1" />
<div align="center">
© 2006-2015 Copyright VMProtect Software
</div>
</body>
</html>

1021
help/ru/history.htm Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 362 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
help/ru/images/depends.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
help/ru/images/weblm_1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

BIN
help/ru/images/weblm_2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 KiB

38
help/ru/info.htm Normal file
View File

@@ -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>Раздел "Свойства"</title>
</head>
<body>
<h1>Раздел "Свойства"</h1>
<p>Раздел "Свойства" отображает различную информацию о защищаемом приложении, а также позволяет исключить из упаковки те или иные сегменты данных и ресурсов.
Изменения, произведенные в этой секции, сохраняются в файл проекта.</p>
<p><img src="images/properties_directory.png" /></p>
<p>Раздел "Свойства" содержит следующие секции:</p>
<ul>
<li><a href="info_directories.htm">Директории</a></li>
<li><a href="info_segments.htm">Сегменты</a></li>
<li><a href="info_imports.htm">Импорты</a></li>
<li><a href="info_exports.htm">Экспорты</a></li>
<li><a href="info_resources.htm">Ресурсы</a></li>
<li><a href="info_calc.htm">Калькулятор</a></li>
<li><a href="info_dump.htm">Дамп</a></li>
</ul>
<br />
<br />
<br />
<br />
<hr noshade="noshade" size="1" />
<div align="center">
© 2006-2015 Copyright VMProtect Software
</div>
</body>
</html>

31
help/ru/info_calc.htm Normal file
View File

@@ -0,0 +1,31 @@
<!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>
<p><img src="images/properties_calc.png" /></p>
<br />
<br />
<br />
<br />
<hr noshade="noshade" size="1" />
<div align="center">
© 2006-2015 Copyright VMProtect Software
</div>
</body>
</html>

View File

@@ -0,0 +1,30 @@
<!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>
<p><img src="images/properties_directory.png" /></p>
<br />
<br />
<br />
<br />
<hr noshade="noshade" size="1" />
<div align="center">
© 2006-2015 Copyright VMProtect Software
</div>
</body>
</html>

35
help/ru/info_dump.htm Normal file
View File

@@ -0,0 +1,35 @@
<!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>
<p><img src="images/properties_dump.png" /></p>
<p>Кнопка "Перейти на адрес" на панели инструментов позволяет перейти на заданный адрес защищаемого приложения:</p>
<p><img src="images/properties_dump_goto.png" /></p>
<p>Для быстрого перехода к нужной функции начните вводить ее имя в строке быстрого поиска. Также можно ввести точный адрес.</p>
<br />
<br />
<br />
<br />
<hr noshade="noshade" size="1" />
<div align="center">
© 2006-2015 Copyright VMProtect Software
</div>
</body>
</html>

28
help/ru/info_exports.htm Normal file
View File

@@ -0,0 +1,28 @@
<!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>Отображает информацию об экспортах файла:</p>
<p><img src="images/properties_export.png" /></p>
<br />
<br />
<br />
<br />
<hr noshade="noshade" size="1" />
<div align="center">
© 2006-2015 Copyright VMProtect Software
</div>
</body>
</html>

28
help/ru/info_imports.htm Normal file
View File

@@ -0,0 +1,28 @@
<!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>Отображает информацию об импортируемых функциях и библиотеках:</p>
<p><img src="images/properties_import.png" /></p>
<br />
<br />
<br />
<br />
<hr noshade="noshade" size="1" />
<div align="center">
© 2006-2015 Copyright VMProtect Software
</div>
</body>
</html>

View File

@@ -0,0 +1,31 @@
<!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>Отображает информацию о ресурсах:</p>
<p><img src="images/properties_resources.png" /></p>
<ul>
<li><strong> Исключить из упаковки</strong> - Ресурс можно исключить из <a href="project_options.htm#PackOutputFile">упаковки</a>.</li>
</ul>
<br />
<br />
<br />
<br />
<hr noshade="noshade" size="1" />
<div align="center">
© 2006-2015 Copyright VMProtect Software
</div>
</body>
</html>

32
help/ru/info_segments.htm Normal file
View File

@@ -0,0 +1,32 @@
<!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>Отображает информацию о сегментах:<p></p>
<p><img src="images/properties_segments.png" /></p>
<ul>
<li><strong>Исключить из защиты памяти</strong> - Сегмент можно исключить из <a href="project_options.htm#MemoryProtection">защиты памяти</a>.</li>
<li><strong> Исключить из упаковки</strong> - Сегмент можно исключить из <a href="project_options.htm#PackOutputFile">упаковки</a>.</li>
</ul>
<br />
<br />
<br />
<br />
<hr noshade="noshade" size="1" />
<div align="center">
© 2006-2015 Copyright VMProtect Software
</div>
</body>
</html>

41
help/ru/main_menu.htm Normal file
View File

@@ -0,0 +1,41 @@
<!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[*/
div.c2 {text-align: center}
/*]]>*/
</style>
</head>
<body>
<h1>Главное меню</h1>
<p>Главное меню состоит из следующих пунктов:</p>
<ul>
<li><a href="menu_file.htm">Файл</a></li>
<li><a href="menu_edit.htm">Правка</a></li>
<li><a href="menu_project.htm">Проект</a></li>
<li><a href="menu_tools.htm">Инструменты</a></li>
<li><a href="menu_help.htm">Справка</a></li>
</ul>
<br />
<br />
<br />
<br />
<hr noshade="noshade" size="1" />
<div align="center">
© 2006-2015 Copyright VMProtect Software
</div>
</body>
</html>

42
help/ru/main_window.htm Normal file
View File

@@ -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>Главное окно</title>
</head>
<body>
<h1>Главное окно</h1>
<p>Главное окно состоит из следующих элементов:</p>
<ul>
<li><a href="main_menu.htm">Главное меню</a></li>
<li><a href="toolbar.htm">Панель инструментов</a></li>
<li>Панель управления, состоящая из трех разделов:
<ul>
<li><a href="project.htm">Раздел "Проект"</a></li>
<li><a href="functions.htm">Раздел "Функции"</a></li>
<li><a href="info.htm">Раздел "Свойства"</a></li>
</ul>
</li>
<li>Лог компиляции</li>
</ul>
<p><img src="images/main_window.png" /></p>
<br />
<br />
<br />
<br />
<hr noshade="noshade" size="1" />
<div align="center">
© 2006-2015 Copyright VMProtect Software
</div>
</body>
</html>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

43
help/ru/manager/index.htm Normal file
View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>(&amp;pi, &amp;si, &amp;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>

View File

@@ -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>

View File

@@ -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 =&gt; "John Doe", // UTF-8!
email =&gt; "john@doe.com",
hwid =&gt; "vHGMdMRvGCPjWcCQ", // Exactly as returned by VMProtectGetCurrentHWID
expire_date =&gt; <strong>array</strong>(year =&gt; 2009, month =&gt; 10, day =&gt; 1),
maxbuild_date =&gt; <strong>array</strong>(year =&gt; 2009, month =&gt; 10, day =&gt; 1),
time_limit =&gt; 10,
user_data =&gt; <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>

View File

@@ -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 &lt;&lt; 16) | (10 &lt;&lt; 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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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 &lt;windows.h&gt;
#include &lt;stdio.h&gt;
bool is_registered(const char *serial)
{
return serial &amp;&amp; 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>

View File

@@ -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 &lt;windows.h&gt;
#include &lt;stdio.h&gt;
#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 &lt;windows.h&gt;
#include &lt;stdio.h&gt;
#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>

View File

@@ -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 &amp; 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>

View File

@@ -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(&amp;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>

View File

@@ -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(&amp;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>

View File

@@ -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(&amp;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>

View File

@@ -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(&amp;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>

View File

@@ -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>

Some files were not shown because too many files have changed in this diff Show More