1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link rel="Stylesheet" type="text/css" href=
"../../default.css" />
<meta http-equiv="Content-Type" content=
"text/html; charset=utf-8" />
<title>Генератор ключей: UNIX-версия</title>
</head>
<body>
<h1>Генераторы ключей: UNIX-версия</h1>
<h3>Описание</h3>
<p>UNIX-версия генератора ключей преставляет собой PHP-файл,
содержащий все необходимое для генерации серийных номеров. Файл
находится в каталоге <strong>Keygen\PHP</strong>, ниже
рассмотрены основные моменты его
использования.</p>
<h3>Настройка генератора</h3>
<p>В самом начале PHP-файла располагается код настройки
генератора:</p>
<pre class="code">//////////////////////////////////////////////////////////////////////////////////////////////
// The following lines should be generated by VMProtect License Manager
$exported_algorithm = "RSA";
$exported_bits = 2048;
$exported_private = "PJvj4kEpoQMIpYK+9wEt......xKeiSZgzdiln8Q==";
$exported_modulus = "rOlny/3QgZb/VmGr3CmY......I6ESAUmtQ+RBqQ==";
$exported_product_code = "oLQdGUn8kVk=";
//////////////////////////////////////////////////////////////////////////////////////////////
</pre>
<p>Этот код генерируется автоматически в VMProtect (см. <a href=
"../licenses.htm#export">Экспорт параметров продукта</a>) и
уникален для каждого конкретного продукта. Очень важно
скопировать его без ошибок, в противном случае генератор будет
работать некорректно.</p><strong>Содержимое ключа</strong>
<p>Далее в генераторе задается содержимое серийного номера.
Содержимое задается массивом, ниже задаются все возможные
параметры ключа, однако в реальных условиях часть из них может
отсутствовать:</p>
<pre class="code">$params = <strong>array</strong>(
user_name => "John Doe", // UTF-8!
email => "john@doe.com",
hwid => "vHGMdMRvGCPjWcCQ", // Exactly as returned by VMProtectGetCurrentHWID
expire_date => <strong>array</strong>(year => 2009, month => 10, day => 1),
maxbuild_date => <strong>array</strong>(year => 2009, month => 10, day => 1),
time_limit => 10,
user_data => <strong>base64_decode</strong>("CGCvRvMWcPHGdMjQ"), // string of bytes
);
</pre>
<h3>Функция обработки успешной генерации</h3>
<p>Ниже расположена простейшая реализация функции, которая
вызывается при успешной генерации серийного номера. Единственным
параметром она получает строку с номером. Функция должна передать
номер вызывающей стороне (регистратору), обычно это делается при
помощи команды <strong>echo</strong>. Предварительно строка
разбивается на подстроки длиной 75 символов для удобства. Также
эта функция может отправлять сгенерированный номер по почте
производителю программы или заносить его в базу данных.</p>
<pre class="code">function <strong>OnSerialGenerated</strong>($serial)
{
$serial = <strong>wordwrap</strong>($serial, 75, "\n", true);
<strong>echo</strong> $serial;
}
</pre>
<h3>Функция обработки ошибок генерации</h3>
<p>Последний участок кода, требующий внимания - это функция,
которая вызывается в случае возникновения проблем. Функция
получает в виде параметра строку с текстом ошибки, а после ее
завершения вызывается функция <strong>die()</strong>. Функция
должна сделать две вещи: вернуть регистратору вместо ключа текст
о том, что ключ будет выслан вручную, а также выслать
производителю программы всю необходимую информацию для устранения
ошибки и ручной генерации ключа.</p>
<pre class="code">function <strong>OnSerialGenerationFailed</strong>($details)
{
<strong>echo</strong> "You will receive serial number in the next 24 hours"; // message to the customer
// mail("support@vendor.com", "Houston, we have a problem", $details); // message to vendor
}
</pre>
<p>Причин возникновения ошибки может быть несколько: некорректные
параметры алгоритма, некорректные параметры ключа, слишком
длинное имя пользователя или e-mail. Слишком длинный серийный
номер, который не влезает в количество бит, указанное в
алгоритме. Поэтому функция
<strong>OnSerialGenerationFailed</strong> должна отправить
производителю максимально подробную информацию о случившемся,
дабы тот мог вручную сгенерировать серийный номер и отправить его
покупателю.</p>
<h3>На что еще следует обратить внимание</h3>
<p>Генератор ключей в примерах максимально упрощен. Он не
учитывает рекомендации по разработке веб-генераторов, данные
<a href="index.htm">здесь</a>. Он не проверяет IP-адрес
вызывающей стороны и не анализирует входные параметры. Имейте это
в виду, когда будете создавать свой собственный генератор на
основе этого.</p>
<p>Имя пользователя и e-mail должны быть переданы в кодировке
UTF-8. Уточните у вашего регистратора, в какой кодировке он
передает информацию о покупателе и, при необходимости, проведите
конвертацию. Неправильная кодировка не приведет к
неработоспособности серийного номера, однако номер будет
содержать совершенно другое имя пользователя и он может быть
удивлен, если вы показываете его, скажем, в окне "О
Программе".</p>
<p>Асимметричное шифрование - достаточно сложный в математическом
плане процесс. Если он реализован на чистом PHP, без применения
сторонних библиотек, то генерация серийного номера может занять
десятки секунд. Генератор использует функции
<strong>gmp_powm</strong>, <strong>bi_powmod</strong>,
<strong>bcpowod</strong> в случае их наличия. Все эти функции
имеют разную скорость. Если генерация ключей на вашем хостинге
занимает слишком большое время, рекомендуется пообщаться со
службой поддержки на предмет подключения описаных выше функций. К
примеру, функция <strong>gmp_powm</strong> работает в десятки раз быстрее
функции <strong>bcpowmod</strong>.</p><br />
<br />
<br />
<br />
<br />
<hr noshade="noshade" size="1" />
<div align="center">
© 2006-2015 Copyright VMProtect Software
</div>
</body>
</html>
|