Initial commit
207
help/en/about_vmprotect.htm
Normal file
@ -0,0 +1,207 @@
|
||||
<!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>What is VMProtect?</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>What is VMProtect?</h1>
|
||||
|
||||
<p>VMProtect is a new generation of software protection utilities. VMProtect supports
|
||||
Delphi, Borland C Builder, Visual C/C++, Visual Basic
|
||||
(native), Virtual Pascal and XCode compilers. At the same time VMProtect has a built-in
|
||||
disassembler that works with Windows and Mac OS X executables,
|
||||
and also can link a MAP-file created by the compiler to quickly select fragments of code for protection.
|
||||
For easy automation of application protection tasks, VMProtect implements a built-in script language.
|
||||
VMProtect fully supports 32/64-bit operating systems of the Windows family starting from Windows 2000, and Mac OS X starting from version 10.6.
|
||||
Importantly, regardless of the target platform, VMProtect supports all range of executables, that is, the Windows version can work with files from the Mac OS X version and vice versa.</p>
|
||||
|
||||
<p>The cornerstone principle of VMProtect is to provide efficient protection of the application code from
|
||||
examination by making the application code and logic very complex for further analysis and cracking.
|
||||
Main software code protection mechanisms VMProtect applies are: virtualization, mutation, and combined protection that
|
||||
involves mutation of the application code with subsequent virtualization.</p>
|
||||
|
||||
<p>The crucial advantage of the virtualization method used in VMProtect is
|
||||
the fact that the virtual machine executing virtualized fragments of code is embedded into the resulting code of the protected application.
|
||||
Therefore, the app protected with VMProtect needs no third-party libraries or modules to function.
|
||||
VMProtect allows using several different virtual machines to protect different fragments of code of the same application resulting in even more complicated
|
||||
cracking process, because a hacker now has to analyze architecture of multiple virtual machines.
|
||||
</p>
|
||||
|
||||
<p>The method of application code mutation applied in VMProtect is based on obfuscation — a process that adds to the application code
|
||||
various excessive, "garbage" commands, "dead" parts of the code, random conditional jumps.
|
||||
It also mutates original commands and transfers execution of certain operations to the stack.
|
||||
</p>
|
||||
|
||||
<p>The key difference of VMProtect from other software protectors is its ability to protect different parts of the code with different methods:
|
||||
part of the code can be virtualized, the other part is obfuscated and critical fragments are protected using the combined method.</p>
|
||||
|
||||
<p>To prevent false positives from antiviruses the registered version of VMProtect uses the
|
||||
<a href="http://standards.ieee.org/develop/indconn/icsg/taggant.pdf">Taggant</a> library that signs the protected file with a certificate of the license owner.</p>
|
||||
|
||||
<p>Another unique feature of VMProtect is embedding of <a href=
|
||||
"dictionary.htm#Watermarks">watermarks</a> to the code of the application. Watermarks allow to definitely identify the official
|
||||
owner of the hacked copy of the program, and therefore to take certain measures to him or her.</p>
|
||||
|
||||
<p>VMProtect is available in 3 editions:</p>
|
||||
|
||||
<ul>
|
||||
<li>Lite;</li>
|
||||
<li>Professional;</li>
|
||||
<li>Ultimate;</li>
|
||||
</ul>
|
||||
|
||||
<p>The below table lists differences in functionality of certain VMProtect editions:</p>
|
||||
|
||||
<table border="1" cellspacing="0" cellpadding="2">
|
||||
<tr align="center">
|
||||
<td rowspan="2" align="center">
|
||||
<strong>Capabilities</strong></td>
|
||||
|
||||
<td colspan="3" align="center"><strong>
|
||||
VMProtect edition</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>Protection methods</strong></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Mutation</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Virtualization</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Ultra (mutation+virtualization)</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Console version</td>
|
||||
<td align="center">-</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr bgcolor="#E0E0E0">
|
||||
<td align="left" colspan="4"><strong>Protection options</strong></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Memory protection</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Import protection</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Resource protection</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Packing</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Debuger detection</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Virtual box detection</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr bgcolor="#E0E0E0">
|
||||
<td align="left" colspan="4"><strong>Service functions</strong></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Watermarks</td>
|
||||
<td align="center">-</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Script language</td>
|
||||
<td align="center">-</td>
|
||||
<td align="center">+</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Licensing system</td>
|
||||
<td align="center">-</td>
|
||||
<td align="center">-</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>License manager</td>
|
||||
<td align="center">-</td>
|
||||
<td align="center">-</td>
|
||||
<td align="center">+</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>File protection</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>
|
40
help/en/contacts.htm
Normal file
@ -0,0 +1,40 @@
|
||||
<!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>Contacts</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Contacts</h1>
|
||||
|
||||
<p>Please direct all your inquiries regarding operation of the program and ordering it to:<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">News</a> | <a href="http://www.vmpsoft.com/buy.php"
|
||||
target="_blank">Order</a> | <a href=
|
||||
"http://www.vmpsoft.com/forum/index.php" target=
|
||||
"_blank">Forum</a><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
106
help/en/create_project.htm
Normal file
@ -0,0 +1,106 @@
|
||||
<!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>Preparing a project</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Preparing a project</h1>
|
||||
|
||||
<p>Let us take a look to a very simple application consisting of only one form (Form1),
|
||||
a text element (Edit1) and a button (Button1). The application works as follows: when the
|
||||
Button1 is clicked, the app checks if the password entered is correct and displays a corresponding message.</p><br />
|
||||
<img src="images/delphi_project.png" />
|
||||
|
||||
<p>A password is checked using a very simple algorithm: on the first step we transform it to a numeric form,
|
||||
then we calculate the remainder on dividing it by 17. The password is correct if the remainder on dividing the numeric representation of the entered password by 17 is equal to 13.
|
||||
The password check procedure implementation on Delphi looks as follows:</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>Selection of procedures and functions to protect can be done in three ways:</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="use_map_file.htm">Using a MAP-file</a>
|
||||
created by the compiler along with the executable of the program.
|
||||
The MAP-file contains all necessary information about names and addresses of all procedures and functions of the app.
|
||||
If the MAP-file is used, you can select procedures and functions to protect by their names.
|
||||
With the MAP-file, every time the project is recompiled, VMProtect automatically determines new addresses of procedures and functions.</li>
|
||||
|
||||
<li><a href="use_markers.htm">Using markers</a>
|
||||
inserted to the source code of the application. Markers are
|
||||
special marks VMProtect uses to determine the boundaries of the protected fragment.
|
||||
Also, VMProtect supports markers with a predefined compilation type.
|
||||
Using markers makes sense when you only want to protect a part of a function or procedure.
|
||||
Using markers allows you to specify parts of the code where string constants to protect will be further placed.</li>
|
||||
|
||||
<li>By address of protected procedures in the executable file. In comparison with the above two ways, this one is less convenient for use.
|
||||
Every time the application is modified and recompiled, you have to specify all addresses again. This type of protection is recommended for applications without the source code available.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Using a MAP-file to define boundaries of the protected code has one more significant advantage. It is worth reviewing it a bit more.
|
||||
Almost any procedure or function that has local variables or that uses the stack to save registers and/or intermediate calculation results
|
||||
has the so called prologue and epilogue located correspondingly in the beginning and in the end of the compiled procedure or function:</p>
|
||||
<pre class="code">push ebp \
|
||||
mov ebp, esp \ prologue
|
||||
push 00 /
|
||||
push ebx /
|
||||
|
||||
...
|
||||
|
||||
pop ebx \
|
||||
pop ecx \ epilogue
|
||||
pop ebp /
|
||||
ret /
|
||||
</pre>
|
||||
|
||||
<p>Due to the way modern compilers work, code markers never incorporate the prologue and the epilogue of a function.
|
||||
Even if the entire code of the CheckPassword function between begin and end is enclosed to markers.
|
||||
It would be enough for a hacker to modify the prologue of the function so that the virtualized code was never executed.
|
||||
For the CheckPassword function this can be done as follows:</p>
|
||||
<pre class="code">mov eax, 1
|
||||
ret
|
||||
</pre>
|
||||
|
||||
<p><strong>Important:</strong><br />
|
||||
If a MAP-file is used to choose code fragments for virtualization, the prologue and the epilogue are also virtualized
|
||||
significantly boosting hack-proof capability of the protected program. Moreover, is one
|
||||
virtualized function is called from another virtualized function, control transfers between them without actually jumping to the address of the called function
|
||||
(a call in this case is a simple jump to another address within the bytecode of the virtual machine interpreter).
|
||||
This also strengthens protection of the program as all modification of the entry point a hacker makes are rendered useless.
|
||||
When working with virtualized functions, transfer of control to the entry point of a virtualized function only happens when the protected function is called from
|
||||
an unprotected or mutated fragment of code.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
55
help/en/default.css
Normal 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;
|
||||
}
|
73
help/en/dictionary.htm
Normal file
@ -0,0 +1,73 @@
|
||||
<!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>Glossary</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Glossary</h1>
|
||||
|
||||
<p>You can't use a tool effectively if you don't know the terminology specific to the corresponding subject.
|
||||
The following glossary explains terminology used in VMProtect.
|
||||
The glossary is not intended to be exhaustive, so some terms may provide meanings that differ from classic ones.
|
||||
</p>
|
||||
|
||||
<p><a name="ByteCode" id="ByteCode"><strong>Bytecode</strong></a> - the code received after transcoding commands of the real processor to commands of the virtual machine.
|
||||
</p>
|
||||
|
||||
<p><a name="Virtualization" id="Virtualization"><strong>Virtualization</strong></a> - a process that transforms a part of the executable code of the application
|
||||
to commands of the virtual machine featuring command system, architecture and operational logic that are unknown to a potential hacker.
|
||||
Virtualized fragments of code are executed by the interpreter of the virtual machine without transforming them to machine language code of the physical processor.
|
||||
Generally, reverse engineering of virtualized fragments comes down to building a disassembler with the same architecture as the processor the virtual machine imitates and analyzing of the resulting disassembled code.
|
||||
</p>
|
||||
|
||||
<p><a name="VirtualMachine" id="VirtualMachine"><strong>Virtual machine</strong></a> - a program code directly executing bytecode in the protected application.</p>
|
||||
|
||||
<p><a name="Watermarks" id="Watermarks"><strong>Watermarks
|
||||
</strong></a> - a unique for each user array of bytes that allows to definitely identify a legal owner of the hacked copy of the program.</p>
|
||||
|
||||
<p><a name="Mutation" id="Mutation"><strong>Mutation</strong></a> - replacing an original command with an analogue or with a certain set of commands producing the same result
|
||||
</p>
|
||||
|
||||
<p><a name="Obfuscation" id="Obfuscation"><strong>Obfuscation</strong></a> - a group of methods and techniques
|
||||
intended to complicate analysis of a program code. Depending on the programming language a protected program is written on, different obfuscation types are used.
|
||||
Obfuscation of applications written on interpreting languages (Perl, PHP and others) is made through modifying the source code:
|
||||
comments are removed, variables are given senseless names, string constants are encrypted and so on.
|
||||
Obfuscation of Java / .NET applications is performed through transforming the bytecode processed by the virtual machine.
|
||||
Obfuscation of compiled programs relies on modifying machine language codes: the obfuscator adds various "garbage" commands, "dead code", random jumps.
|
||||
Also, original commands mutate, a part of operations is moved to the stack, and a number of structural (or less frequently mathematical) transformations is made.
|
||||
Reverse engineering of obfuscated fragments of code attempts to bring the fragments back to their original state, and that is a time-consuming task as long as obfuscation is done properly.
|
||||
</p>
|
||||
|
||||
<p><a name="Protector" id="Protector"><strong>Protector</strong></a> - software intended to protect other programs from being hacked.
|
||||
The majority of today's protectors do not modify the source code of an application, packing or encrypting the app instead. The main focus
|
||||
is put to protecting the unpacking/decrypting program or procedure.
|
||||
</p>
|
||||
|
||||
<p><a name="EntryPoint" id="EntryPoint"><strong>Entry point</strong></a> - the initial address execution of the application loaded into the memory starts from.</p>
|
||||
|
||||
<p><a name="Pack" id="Pack"><strong>Packing</strong></a> - a way to protect the program code by compressing the executable file of the program and/or libraries
|
||||
using non-typical algorithms. The protected fragments of code are compressed by the packer, and unpacked completely or partially at user's side when the application is executed.
|
||||
</p>
|
||||
|
||||
<p><a name="Crypt" id="Crypt"><strong>Encryption</strong></a> protects a part of the application's code with strong cryptographic algorithms.
|
||||
Software protected by encryption requires an end-user to enter the activation code to remove limitations set by the developer for the unregistered version of the program.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
14
help/en/en.qhcp
Normal file
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<QHelpCollectionProject version="1.0">
|
||||
<docFiles>
|
||||
<generate>
|
||||
<file>
|
||||
<input>en.qhp</input>
|
||||
<output>../../bin/en.qch</output>
|
||||
</file>
|
||||
</generate>
|
||||
<register>
|
||||
<file>../../bin/en.qch</file>
|
||||
</register>
|
||||
</docFiles>
|
||||
</QHelpCollectionProject>
|
260
help/en/en.qhp
Normal file
@ -0,0 +1,260 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<QtHelpProject version="1.0">
|
||||
<namespace>ru.com.vmpsoft.vmprotect.3.0</namespace>
|
||||
<virtualFolder>doc</virtualFolder>
|
||||
<customFilter name="VMProtect 3.0">
|
||||
<filterAttribute>vmpg</filterAttribute>
|
||||
<filterAttribute>3.0</filterAttribute>
|
||||
</customFilter>
|
||||
<filterSection>
|
||||
<filterAttribute>vmpg</filterAttribute>
|
||||
<filterAttribute>3.0</filterAttribute>
|
||||
<toc><section title="Introduction" ref="terms.htm">
|
||||
<section title="Glossary" ref="dictionary.htm" />
|
||||
<section title="Analysis, cracking and protection of software" ref="software_protection.htm" />
|
||||
<section title="What is VMProtect?" ref="about_vmprotect.htm" />
|
||||
<section title="Recommendations on protecting your application" ref="recommendations.htm" />
|
||||
<section title="History of changes" ref="history.htm" />
|
||||
</section>
|
||||
<section title="Working with VMProtect" ref="work.htm">
|
||||
<section title="Preparing a project" ref="create_project.htm">
|
||||
<section title="Using a MAP-file" ref="use_map_file.htm" />
|
||||
<section title="Using markers" ref="use_markers.htm" />
|
||||
<section title="SDK functions" ref="sdk_functions.htm" />
|
||||
</section>
|
||||
<section title="Main window" ref="main_window.htm">
|
||||
<section title="Main menu" ref="main_menu.htm">
|
||||
<section title=""File" menu" ref="menu_file.htm" />
|
||||
<section title=""Edit" menu" ref="menu_edit.htm" />
|
||||
<section title=""Project" menu" ref="menu_project.htm" />
|
||||
<section title=""Tools" menu" ref="menu_tools.htm" />
|
||||
<section title=""Help" menu" ref="menu_help.htm" />
|
||||
</section>
|
||||
<section title="Toolbar" ref="toolbar.htm" />
|
||||
<section title=""Project" section" ref="project.htm">
|
||||
<section title=""Functions for Protection" section" ref="project_functions.htm" />
|
||||
<section title=""Licenses" section" ref="manager/licenses.htm" />
|
||||
<section title=""Files" section" ref="project_files.htm" />
|
||||
<section title=""Script" section" ref="project_script.htm" />
|
||||
<section title=""Options" section" ref="project_options.htm" />
|
||||
</section>
|
||||
<section title=""Functions" section" ref="functions.htm" />
|
||||
<section title=""Details" section" ref="info.htm">
|
||||
<section title=""Directories" section" ref="info_directories.htm" />
|
||||
<section title=""Segments" section" ref="info_segments.htm" />
|
||||
<section title=""Imports" section" ref="info_imports.htm" />
|
||||
<section title=""Exports" section" ref="info_exports.htm" />
|
||||
<section title=""Resources" section" ref="info_resources.htm" />
|
||||
<section title=""Calculator" section" ref="info_calc.htm" />
|
||||
<section title=""Dump" section" ref="info_dump.htm" />
|
||||
</section>
|
||||
</section>
|
||||
<section title="Console version" ref="mode_console.htm" />
|
||||
</section>
|
||||
<section title="Licensing system" ref="manager/index.htm">
|
||||
<section title="Licensing system features" ref="manager/features.htm" />
|
||||
<section title="How the licensing system works?" ref="manager/howitworks.htm" />
|
||||
<section title="Example of usage" ref="manager/usage/index.htm">
|
||||
<section title="Stage 1: Test mode" ref="manager/usage/index.htm#TestMode">
|
||||
<section title="Step 1.1: Create test application" ref="manager/usage/step11_app.htm" />
|
||||
<section title="Step 1.2: Add license checking code" ref="manager/usage/step12_code.htm" />
|
||||
<section title="Step 1.3: Get state of serial number" ref="manager/usage/step13_flags.htm" />
|
||||
<section title="Step 1.4: Get user name and e-mail" ref="manager/usage/step14_name.htm" />
|
||||
<section title="Step 1.5: Check serial number expiration date" ref="manager/usage/step15_exp.htm" />
|
||||
<section title="Step 1.6: Limit application running time" ref="manager/usage/step16_time.htm" />
|
||||
<section title="Step 1.7: Limit period of free updates" ref="manager/usage/step17_maxbuild.htm" />
|
||||
<section title="Step 1.8: Put serial number to "black" list" ref="manager/usage/step18_blacklist.htm" />
|
||||
<section title="Step 1.9: Lock serial number to hardware" ref="manager/usage/step19_hwid.htm" />
|
||||
<section title="Step 1.10: Read user data from serial number" ref="manager/usage/step1A_userdata.htm" />
|
||||
</section>
|
||||
<section title="Stage 2: Real mode" ref="manager/usage/index.htm#RealMode">
|
||||
<section title="Step 2.1: Create new test application" ref="manager/usage/step21_src.htm" />
|
||||
<section title="Step 2.2: Create VMProtect project" ref="manager/usage/step22_vmp.htm" />
|
||||
<section title="Step 2.3: Create product in the License Manager" ref="manager/usage/step23_product.htm" />
|
||||
<section title="Step 2.4: Test results" ref="manager/usage/step24_test.htm" />
|
||||
<section title="Step 2.5: Lock code to serial number" ref="manager/usage/step25_codelock.htm" />
|
||||
</section>
|
||||
<section title="Licensing API functions" ref="manager/usage/api.htm" />
|
||||
</section>
|
||||
<section title="Serial number generators" ref="manager/keygen/index.htm">
|
||||
<section title="Windows-version" ref="manager/keygen/keygen_dll.htm" />
|
||||
<section title=".Net-version" ref="manager/keygen/keygen_net.htm" />
|
||||
<section title="UNIX-version" ref="manager/keygen/keygen_php.htm" />
|
||||
<section title="Serial number format" ref="manager/keygen/serial_format.htm" />
|
||||
<section title="Serial number encryption algorithms" ref="manager/keygen/algorithms.htm" />
|
||||
</section>
|
||||
<section title="Activation System" ref="manager/activation.htm">
|
||||
<section title="Configuring activation in VMProtect" ref="manager/activation/vmprotect.htm" />
|
||||
<section title="Activation in Web License Manager" ref="manager/activation/weblm.htm" />
|
||||
<section title="Activation API" ref="manager/activation/api.htm" />
|
||||
</section>
|
||||
</section>
|
||||
<section title="Using scripts" ref="script.htm">
|
||||
<section title="Classes" ref="script_classes.htm" />
|
||||
<section title="Built-in functions" ref="script_functions.htm" />
|
||||
<section title="Events" ref="script_events.htm" />
|
||||
</section>
|
||||
<section title="Watermarks" ref="watermarks.htm">
|
||||
<section title=""Setup" tab" ref="watermarks_setup.htm" />
|
||||
<section title=""Search" tab" ref="watermarks_search.htm" />
|
||||
</section>
|
||||
<section title="Frequently Asked Questions" ref="faq.htm" />
|
||||
<section title="Contact information" ref="contacts.htm" />
|
||||
</toc>
|
||||
<keywords>
|
||||
<keyword id="default" ref="terms.htm"/>
|
||||
<keyword id="project::functions" ref="project_functions.htm"/>
|
||||
<keyword id="project::options" ref="project_options.htm"/>
|
||||
<keyword id="project::script" ref="project_script.htm"/>
|
||||
<keyword id="project::files" ref="project_files.htm"/>
|
||||
<keyword id="project::licenses" ref="manager/licenses.htm"/>
|
||||
<keyword id="project::mapfunctions" ref="functions.htm"/>
|
||||
<keyword id="project::details" ref="info.htm"/>
|
||||
<keyword id="functions::setup" ref="project_functions.htm#AddProcedure"/>
|
||||
<keyword id="functions::search" ref="project_functions.htm#Search"/>
|
||||
<keyword id="watermarks::setup" ref="watermarks_setup.htm"/>
|
||||
<keyword id="watermarks::search" ref="watermarks_search.htm"/>
|
||||
<keyword id="settings" ref="menu_tools.htm#Settings"/>
|
||||
<keyword id="contacts" ref="contacts.htm"/>
|
||||
</keywords>
|
||||
<files>
|
||||
<file>default.css</file>
|
||||
<file>about_vmprotect.htm</file>
|
||||
<file>contacts.htm</file>
|
||||
<file>create_project.htm</file>
|
||||
<file>default.css</file>
|
||||
<file>dictionary.htm</file>
|
||||
<file>faq.htm</file>
|
||||
<file>functions.htm</file>
|
||||
<file>history.htm</file>
|
||||
<file>info.htm</file>
|
||||
<file>info_calc.htm</file>
|
||||
<file>info_directories.htm</file>
|
||||
<file>info_dump.htm</file>
|
||||
<file>info_exports.htm</file>
|
||||
<file>info_imports.htm</file>
|
||||
<file>info_resources.htm</file>
|
||||
<file>info_segments.htm</file>
|
||||
<file>info_calc.htm</file>
|
||||
<file>main_menu.htm</file>
|
||||
<file>menu_file.htm</file>
|
||||
<file>menu_edit.htm</file>
|
||||
<file>menu_project.htm</file>
|
||||
<file>menu_tools.htm</file>
|
||||
<file>menu_help.htm</file>
|
||||
<file>main_window.htm</file>
|
||||
<file>mode_console.htm</file>
|
||||
<file>project.htm</file>
|
||||
<file>project_files.htm</file>
|
||||
<file>project_functions.htm</file>
|
||||
<file>project_options.htm</file>
|
||||
<file>project_options_external_addresses.htm</file>
|
||||
<file>project_script.htm</file>
|
||||
<file>recommendations.htm</file>
|
||||
<file>script.htm</file>
|
||||
<file>script_classes.htm</file>
|
||||
<file>script_events.htm</file>
|
||||
<file>script_functions.htm</file>
|
||||
<file>sdk_functions.htm</file>
|
||||
<file>software_protection.htm</file>
|
||||
<file>terms.htm</file>
|
||||
<file>toolbar.htm</file>
|
||||
<file>use_map_file.htm</file>
|
||||
<file>use_markers.htm</file>
|
||||
<file>watermarks.htm</file>
|
||||
<file>watermarks_search.htm</file>
|
||||
<file>watermarks_setup.htm</file>
|
||||
<file>about_vmprotect.htm</file>
|
||||
<file>work.htm</file>
|
||||
<file>images/activation_setup.png</file>
|
||||
<file>images/button_compilation.png</file>
|
||||
<file>images/button_execute.png</file>
|
||||
<file>images/button_open.png</file>
|
||||
<file>images/button_project.png</file>
|
||||
<file>images/button_save.png</file>
|
||||
<file>images/button_action.png</file>
|
||||
<file>images/button_search.png</file>
|
||||
<file>images/delphi_project.png</file>
|
||||
<file>images/expert_find.png</file>
|
||||
<file>images/export_keys.png</file>
|
||||
<file>images/functions.png</file>
|
||||
<file>images/import_key.png</file>
|
||||
<file>images/licenses1.png</file>
|
||||
<file>images/lock_to_serial.png</file>
|
||||
<file>images/main_window.png</file>
|
||||
<file>images/menu_edit.png</file>
|
||||
<file>images/menu_file.png</file>
|
||||
<file>images/menu_help.png</file>
|
||||
<file>images/menu_project.png</file>
|
||||
<file>images/menu_project_import.png</file>
|
||||
<file>images/menu_tools.png</file>
|
||||
<file>images/preferences.png</file>
|
||||
<file>images/project_add_folder.png</file>
|
||||
<file>images/project_add_function.png</file>
|
||||
<file>images/project_add_license.png</file>
|
||||
<file>images/project_file_delete.png</file>
|
||||
<file>images/project_file_menu.png</file>
|
||||
<file>images/project_file_protection.png</file>
|
||||
<file>images/project_file_settings.png</file>
|
||||
<file>images/project_functions.png</file>
|
||||
<file>images/project_functions_content.png</file>
|
||||
<file>images/project_functions_content2.png</file>
|
||||
<file>images/project_functions_menu.png</file>
|
||||
<file>images/project_functions_menu2.png</file>
|
||||
<file>images/project_functions_menu3.png</file>
|
||||
<file>images/project_functions_search.png</file>
|
||||
<file>images/project_generate_keys.png</file>
|
||||
<file>images/project_options.png</file>
|
||||
<file>images/project_script.png</file>
|
||||
<file>images/properties_directory.png</file>
|
||||
<file>images/properties_dump.png</file>
|
||||
<file>images/properties_dump_goto.png</file>
|
||||
<file>images/properties_export.png</file>
|
||||
<file>images/properties_import.png</file>
|
||||
<file>images/properties_resources.png</file>
|
||||
<file>images/properties_segments.png</file>
|
||||
<file>images/properties_calc.png</file>
|
||||
<file>images/watermarks_add.png</file>
|
||||
<file>images/watermarks_menu.png</file>
|
||||
<file>images/watermarks_search.png</file>
|
||||
<file>images/watermarks_setup.png</file>
|
||||
<file>images/delphi_map.png</file>
|
||||
<file>images/visual_studio_map.png</file>
|
||||
<file>manager/activation/api.htm</file>
|
||||
<file>manager/activation/vmprotect.htm</file>
|
||||
<file>manager/activation/weblm.htm</file>
|
||||
<file>images/weblm_1.png</file>
|
||||
<file>images/weblm_2.png</file>
|
||||
<file>manager/keygen/algorithms.htm</file>
|
||||
<file>manager/keygen/index.htm</file>
|
||||
<file>manager/keygen/keygen_dll.htm</file>
|
||||
<file>manager/keygen/keygen_net.htm</file>
|
||||
<file>manager/keygen/keygen_php.htm</file>
|
||||
<file>manager/keygen/serial_format.htm</file>
|
||||
<file>manager/usage/api.htm</file>
|
||||
<file>images/codelock_error.png</file>
|
||||
<file>images/depends.png</file>
|
||||
<file>manager/usage/index.htm</file>
|
||||
<file>manager/usage/step11_app.htm</file>
|
||||
<file>manager/usage/step12_code.htm</file>
|
||||
<file>manager/usage/step13_flags.htm</file>
|
||||
<file>manager/usage/step14_name.htm</file>
|
||||
<file>manager/usage/step15_exp.htm</file>
|
||||
<file>manager/usage/step16_time.htm</file>
|
||||
<file>manager/usage/step17_maxbuild.htm</file>
|
||||
<file>manager/usage/step18_blacklist.htm</file>
|
||||
<file>manager/usage/step19_hwid.htm</file>
|
||||
<file>manager/usage/step1A_userdata.htm</file>
|
||||
<file>manager/usage/step21_src.htm</file>
|
||||
<file>manager/usage/step22_vmp.htm</file>
|
||||
<file>manager/usage/step23_product.htm</file>
|
||||
<file>manager/usage/step24_test.htm</file>
|
||||
<file>manager/usage/step25_codelock.htm</file>
|
||||
<file>manager/activation.htm</file>
|
||||
<file>manager/features.htm</file>
|
||||
<file>manager/howitworks.htm</file>
|
||||
<file>manager/index.htm</file>
|
||||
<file>manager/licenses.htm</file>
|
||||
</files>
|
||||
</filterSection>
|
||||
</QtHelpProject>
|
109
help/en/faq.htm
Normal file
@ -0,0 +1,109 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href="default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Frequently Asked Questions</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Frequently Asked Questions</h1>
|
||||
|
||||
<h3>Ordering VMProtect</h3>
|
||||
|
||||
<p><strong>If I order VMProtect, will I be able to use it on different computers?</strong><br />
|
||||
You can install and use VMProtect on any number of computers you want and need for your work.</p>
|
||||
|
||||
<p><strong>What is a difference between Personal and Company
|
||||
licenses, and which license should I prefer?</strong><br />
|
||||
The only difference between these license types is who owns them. If you are a private developer, choose the Personal license.
|
||||
If you represent a company or plan to use the product in your organization, select the Company license.</p>
|
||||
|
||||
<p><strong>How the full version of VMProtect is delivered upon purchase?</strong><br />
|
||||
The full version (and all further updates of VMProtect within the one-year subscription) are delivered to your e-mail address.
|
||||
A message contains a link to the archive containing installer of the full version of VMProtect.
|
||||
That is why we recommend turning off all spam filters in the settings of your mailbox before purchasing VMProtect.</p>
|
||||
|
||||
<p><strong>Will I receive new versions of VMProtect for free or they should be purchased individually?
|
||||
</strong><br />
|
||||
After purchase you are eligible for all new versions within one year after the date of purchase.
|
||||
When this period expiresm you can <a href=
|
||||
"http://www.vmpsoft.com/buy.php">renew your annual subscription</a>
|
||||
or continue using the version of VMProtect you have without any restrictions.</p>
|
||||
|
||||
<p><strong>Can I pay for VMProtect with my credit card or PayPal?</strong><br />
|
||||
You can purchase VMProtect with a credit card or
|
||||
PayPal. To do this, select the desired version of VMProtect at the <a href=
|
||||
"http://www.vmpsoft.com/buy.php">order page</a> and then choose a credit card or PayPal as your payment method.</p>
|
||||
|
||||
<h3>General questions</h3>
|
||||
|
||||
<p><strong>Is there a way to encrypt strings and data arrays automatically?</strong><br />
|
||||
In VMProtect you can hide <a href=
|
||||
"sdk_functions.htm#VMProtectDecryptStringA">ANSI constants</a> and
|
||||
<a href="sdk_functions.htm#VMProtectDecryptStringW">Unicode
|
||||
constants</a>. All other data the code operates with remain intact. We recommend storing all confidential information
|
||||
encrypted and decrypt it directly before use.
|
||||
The unpacker itself can be <a href=
|
||||
"project_functions.htm#CompilationTypes">virtualized</a>.</p>
|
||||
|
||||
<p><strong>Is there a way to protect procedures that I call from various threads in my application?</strong><br />
|
||||
VMProtect is 100% multi-thread compatible and there are no any specific limitations for this type of protection.</p>
|
||||
|
||||
<p><strong>Can I use VMProtect along with another protector (packer)?</strong><br />
|
||||
Using any other packers (protectors) after a file is processed by VMProtect can render the protected application non-functional.
|
||||
</p>
|
||||
|
||||
<p><strong>Should I include
|
||||
VMProtectSDK32.dll/VMProtectSDK64.dll into the setup package of the program?</strong><br />
|
||||
These libraries are only used at the debug stage of the program (before protecting it). After you protect the application with VMProtect
|
||||
all information about usage of these DLLs is removed completely, so you don't have to include them into the release package.</p>
|
||||
|
||||
<h3>Compiler messages</h3>
|
||||
|
||||
<p><strong>What does this error mean: VMProtectMarker
|
||||
"ToolButton1Click.1".0044327D: Address is used by procedure
|
||||
"TForm1.ToolButton1Click"?</strong><br />
|
||||
This error means the same command at the address
|
||||
0044327D is used in two procedures that are included into the list of protected objects.
|
||||
To solve this issue, you should exclude one of procedures (in this particular case these are
|
||||
VMProtectMarker "ToolButton1Click.1" and TForm1.ToolButton1Click)
|
||||
from the list of protected objects.</p>
|
||||
|
||||
<p><strong>What does this error mean: [Error]
|
||||
TForm1.Test.004433F4: Minimum procedure size for compilation is 5 bytes?</strong><br />
|
||||
This error means the procedure TForm1.Test is too small and cannot be protected. To solve this issue, exclude this procedure from the list of protected objects.</p>
|
||||
|
||||
<p><strong>What does this warning mean:
|
||||
TForm1.ToolButton1Click.00443368: Inner address jump:
|
||||
00443337?</strong><br />
|
||||
The following warning means a possible jump from the unprotected code fragment into the protected code fragment is detected.
|
||||
Such jump may cause malfunction of the protected program. To solve the issue, mark
|
||||
the 00443337 address as <a href=
|
||||
"project_functions.htm#ExtAddress">external</a>.</p>
|
||||
|
||||
<p><strong>What does this error mean: The ".text" section allocates space required for the new section?</strong><br />
|
||||
The following error usually take place when drivers are protected.
|
||||
It means that free space between the first section of the file and service information in the
|
||||
header of the file is too small to create a new section
|
||||
To solve this problem, increase the value of the section alignment parameter in driver's source codes and rebuild the driver completely.
|
||||
(For example: if you compile the driver using WDK/DDK, you should add
|
||||
DRIVER_ALIGNMENT=0x200 into SOURCES).</p>
|
||||
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
33
help/en/functions.htm
Normal file
@ -0,0 +1,33 @@
|
||||
<!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>"Functions" section</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>"Functions" section</h1>
|
||||
|
||||
<p>The "Functions" section lists all functions available for protection:</p>
|
||||
<p><img src="images/functions.png" /></p>
|
||||
<p>When a function is selected, you can see its properties and protection options on the main panel.
|
||||
For each function you can specify a <a href="project_functions.htm#CompilationTypes">compilation type</a> and enable
|
||||
<a href="manager/features.htm#lock">lock to a serial number</a>.</p>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
819
help/en/history.htm
Normal file
@ -0,0 +1,819 @@
|
||||
<!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>History of changes</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>History of changes</h1>
|
||||
|
||||
<h3>Version 3.5</h3>
|
||||
<p>[!] .NET: Many bugs are fixed<br />
|
||||
[!] ELF: Fixed a bug that occurred inside VMProtectGetCurrentHWID while getting HDD information<br />
|
||||
[+] .NET: Added support of .NET Core (3.0+) and .NET Standard (2.1+)<br />
|
||||
[+] .NET: Added import protection<br />
|
||||
[+] .NET: Added resources protection<br />
|
||||
[+] .NET: Added support of mixed assemblies<br />
|
||||
[*] Mach-O: Improved support of sections with types S_THREAD_LOCAL_VARIABLES and S_THREAD_LOCAL_REGULAR<br />
|
||||
[*] Mach-O: Improved support of Objective-C<br />
|
||||
[*] ELF: Improved support of relocations with type R_386_PC32<br />
|
||||
[*] PE: Improved antidebug<br />
|
||||
</p>
|
||||
|
||||
<h3>Version 3.4</h3>
|
||||
<p>[!] Fixed a bug that occurred during virtualization of BT [m16], POP [m64]<br />
|
||||
[+] Added support of .NET applications<br />
|
||||
[+] Added disassembling PMULLD<br />
|
||||
[+] PE: Added support of COFF symbols<br />
|
||||
[*] ELF: Improved disassembling of SWITCH<br />
|
||||
[*] ELF: Improved support of relocations with type R_386_PC32<br />
|
||||
[*] PE: Improved exception handling<br />
|
||||
[*] PE: Improved support of Windows Server 2016 Datacenter<br />
|
||||
</p>
|
||||
|
||||
<h3>Version 3.3</h3>
|
||||
<p>[+] PE: Added support of "Control Flow Guard"<br />
|
||||
[+] PE: Added support of PDB files for loading symbols<br />
|
||||
[+] Mach-O: Added support of OS X 10.13 and later<br />
|
||||
[+] ELF: Added support of statically linked libstdc++.so<br />
|
||||
[+] ELF: Added support of CentOS 5 and CentOS 6<br />
|
||||
[+] ELF: Added support of TLS segments<br />
|
||||
[+] ELF: Added support of HTTPS for VMProtectActivateLicense<br />
|
||||
[*] PE: Improved exception handling for x64 applications<br />
|
||||
[*] PE: Improved detection of virtualization tools under the Hyper-V role<br />
|
||||
[*] PE: Improved demagling of MSVC symbols<br />
|
||||
[*] Mach-O: Improved exception handling<br />
|
||||
[*] Mach-O: Improved support of Objective-C<br />
|
||||
[*] ELF: Fixed a bug that occurred when the "Pack the Output File" option was used<br />
|
||||
</p>
|
||||
|
||||
<h3>Version 3.2</h3>
|
||||
<p>[!] PE: Fixed an error that occurred in VMProtectIsValidImageCRC in protected driver<br />
|
||||
[!] Fixed an error that occurred during virtualization of XOR with relocations<br />
|
||||
[*] PE: Improved packing of sections with the TLS directory<br />
|
||||
[*] PE: Improved antidebug<br />
|
||||
[*] PE: The Taggant System has been removed<br />
|
||||
[*] Accelerated unpacking when the "<a href=
|
||||
"project_options.htm#PackOutputFile">Packing output file</a>" option was used<br />
|
||||
[+] Added support of ELF format<br />
|
||||
[+] Added disassembling of AVX commands<br />
|
||||
</p>
|
||||
|
||||
<h3>Version 3.1</h3>
|
||||
|
||||
<p>[!] Fixed an error that occurred during disassembling of MOVUPS with REX prefix 0x41<br />
|
||||
[!] Fixed an error that occurred during virtualization of XLAT, FSIN and POPAD<br />
|
||||
[*] Improved exceptions handling<br />
|
||||
[*] Improved VM architecture<br />
|
||||
[*] Improved checking the integrity of a file on disk when the "<a href=
|
||||
"project_options.htm#MemoryProtection">Memory protection</a>" option was used<br />
|
||||
[*] Improved virtualization of FSTENV, FSTCW, FSAVE and FSTSW<br />
|
||||
[*] PE: VMProtectActivateLicense now works via WinHTTP and uses IE proxy settings by default<br />
|
||||
[*] PE: VMProtectGetCurrentHWID has been improved for kernel drivers<br />
|
||||
[*] PE: Improved support of Delphi 6 when the "<a href=
|
||||
"project_options.htm#ImportProtection">Import protection</a>" option was used<br />
|
||||
[*] PE: Improved antidebug<br />
|
||||
[+] Added virtualization of ADD, AND, SUB, XOR, OR with LOCK prefix<br />
|
||||
[+] Added virtualization of CQO<br />
|
||||
[+] Added disassembling PINSRB, PINSRD, PINSRQ, PMINSD, PMINUW, PMINUD, PMAXSB, PMAXSD, PMAXUW and PMAXUD<br />
|
||||
[+] Mach-O: Added support of section "__unwind_info"<br />
|
||||
[+] Mach-O: Added support of LC_LOAD_WEAK_DYLIB<br />
|
||||
[+] Mach-O: Added support of Delphi Berlin<br />
|
||||
[+] PE: Added support of Windows 10 for kernel drivers<br />
|
||||
[+] PE: Now the "Rich Header" is deleted when the "<a href=
|
||||
"project_options.htm#Additional">Strip debug information</a>" option was used<br />
|
||||
[+] Ultimate: Functionality of "<a href="project_files.htm">Files</a>" has been enhanced. Now you can create folders and use symbols ".." for indication of the parent directory<br />
|
||||
[+] GUI: At displaying of protected ANSI strings the code page from Windows settings is used now<br />
|
||||
[+] LUA: Usage of functions from external DLLs has been added<br />
|
||||
</p>
|
||||
|
||||
<h3>Version 3.0</h3>
|
||||
|
||||
<p>[*] PE: Added support for exceptions in x64 code<br />
|
||||
[*] Mach-O: Added support for <a href="sdk_functions.htm">SDK functions</a><br />
|
||||
[*] Ultimate: Added support for <a href="manager/usage/api.htm">licensing functions</a> for drivers and applications written on VB6<br />
|
||||
[*] Ultimate: Functionality of <a href="project_files.htm">DLL Box</a> has been enhanced. Now the protected application can envelope any files
|
||||
including ActiveX servers with optional automatic registration in the virtual registry.<br />
|
||||
[*] Virtual Box detection has been improved<br />
|
||||
[*] Script engine changed to LUA<br />
|
||||
[*] New VM architecture<br />
|
||||
[+] A new function <a href="sdk_functions.htm#VMProtectIsProtected">VMProtectIsProtected</a> is added to the SDK<br />
|
||||
</p>
|
||||
|
||||
<h3>Version 2.13</h3>
|
||||
|
||||
<p>[!] PE: Added support for Delay Import<br />
|
||||
[!] PE: Improved compatibility with VS2012<br />
|
||||
[!] PE: Improved compatibility with Embarcadero RAD Studio XE3<br />
|
||||
[!] PE: Improved compatibility with MinGW<br />
|
||||
[!] Ultimate: Improved compatibility of DLL Box with Windows 8<br />
|
||||
[+] WebLM: Added support for mbstring.func_overload = 2<br />
|
||||
[+] WebLM: In the activation code a new field "Expiry date" has been added.
|
||||
(Now VMProtectActivateLicense can return ACTIVATION_EXPIRED if the current date exceeds the expiry date)<br />
|
||||
[+] WebLM: Fields "Expiry date" and "Maximum build date" now contain the "days since purchase" value<br /></p>
|
||||
|
||||
<h3>Version 2.12</h3>
|
||||
|
||||
<p>[!] PE: Fixed bugs in x64 applications<br />
|
||||
[!] PE: Fixed an error that occurred if an application had the IMAGE_DLLCHARACTERISTICS_NX_COMPAT flag<br />
|
||||
[+] PE: Added support for Windows 8<br />
|
||||
[+] WebLM: Added Russian and Chinese language<br /></p>
|
||||
|
||||
<h3>Version 2.11</h3>
|
||||
|
||||
<p>[!] Fixed a bug during <a href=
|
||||
"project_options.htm#PackOutputFile">packing</a> in х64
|
||||
applications<br />
|
||||
[!] PE: Fixed a bug that occurred when the
|
||||
"<a href="project_options.htm#ImportProtection">Import protection</a>" option was used<br />
|
||||
[!] PE: Fixed a bug emerging when a TLS section with relocation tables was processed<br />
|
||||
[+] Ultimate: Added <a href=
|
||||
"manager/activation.htm">activation/deactivation</a><br />
|
||||
[+] Mach-O: Added <a href=
|
||||
"project_options.htm#PackOutputFile">packing</a><br />
|
||||
[*] PE: Support for DriverVerifier<br />
|
||||
[*] PE: Improved support for SEH for MSVC<br />
|
||||
[*] Mach-O: Improved support for IndirectSymbols<br /></p>
|
||||
|
||||
<h3>Version 2.10</h3>
|
||||
|
||||
<p>[!] Fixed a bug that occurred when the
|
||||
"<a href="project_options.htm#ResourceProtection">Resource protection</a>" option was used<br />
|
||||
[!] Fixed a bug that occurred when the
|
||||
"<a href="project_options.htm#ImportProtection">Import protection</a>" option was used<br />
|
||||
[!] Fixed a bug that occurred when x64 drivers without relocation tables were protected<br />
|
||||
[+] Added support for Max OS X executables (Mach-O format)<br />
|
||||
[+] Added support for HLT command<br />
|
||||
[+] New API is added to SDK - <a href=
|
||||
"sdk_functions.htm#VMProtectFreeString">VMProtectFreeString</a><br />
|
||||
[*] Improved identification of markers and strings marked with <a href=
|
||||
"sdk_functions.htm#VMProtectDecryptStringA">VMProtectDecryptStringA</a>/<a href="sdk_functions.htm#VMProtectDecryptStringW">VMProtectDecryptStringW</a><br />
|
||||
[*] Now you can use relative paths in output file name and license parameters<br />
|
||||
[*] Improved support for SEH for Delphi<br />
|
||||
[*] SenseLock Edition: Added the "<a href=
|
||||
"project_options.htm#ResourceProtection">Resource protection</a>" option<br />
|
||||
[*] SenseLock Edition: A <a href=
|
||||
"manager/licenses.htm">license manager</a> is added to the GUI version<br />
|
||||
[*] SenseLock Edition: programming of keys is added to the GUI version<br />
|
||||
[*] Licenses in the license manager can now be copied and pasted to/from the clipboard<br /></p>
|
||||
|
||||
<h3>Version 2.09</h3>
|
||||
|
||||
<p>[!] Fixed a bug that occurred when <a href=
|
||||
"project_options.htm#DebuggerDetection">a debugger was detected</a>
|
||||
under Windows 2000<br />
|
||||
[!] Fixed a bug that occurred while disassembling PMULHUW and LDMXCSR commands<br />
|
||||
[!] Fixed a bug that occurred when <a href=
|
||||
"project_options.htm#MemoryProtection">memory protection</a> was used(file integrity wasn't checked)<br />
|
||||
[!] Ultimate: Fixed a bug that occurred when running protected files under Windows 2000 (this required
|
||||
EncodePointer/DecodePointer functions from kernel32.dll)<br />
|
||||
[*] Improved virtualization of exception handlers for Visual
|
||||
C<br />
|
||||
[*] <a href="project_options.htm#ResourceProtection">Resource protection</a> is now available in Lite and Professional versions<br />
|
||||
[*] Added support for EnumResourceTypes, EnumResourceNames and
|
||||
EnumResourceLanguages when using <a href=
|
||||
"project_options.htm#ResourceProtection">resource protection</a> (available only when called from the main module)<br />
|
||||
[+] Added support for exceptions for Borland C Builder<br />
|
||||
[+] Ultimate: Improved performance of <a href=
|
||||
"manager/usage/api.htm#VMProtectGetSerialNumberState">VMProtectGetSerialNumberState</a>
|
||||
and <a href=
|
||||
"manager/usage/api.htm#VMProtectGetSerialNumberData">VMProtectGetSerialNumberData</a> functions<br />
|
||||
|
||||
[+] The script for <a href=
|
||||
"script_classes.htm#TLicenseManager">TLicenseManager</a> now includes the
|
||||
<a href=
|
||||
"script_classes.htm#TLicenseManager.Save">Save</a> method<br />
|
||||
[-] The "Move resources to the end of the file" option is removed. The resource section is always the last one now.<br /></p>
|
||||
|
||||
<h3>Version 2.08</h3>
|
||||
|
||||
<p>[!] Fixed a bug that occurred when assembling the TEST [XXXX], REG command<br />
|
||||
[!] Fixed a bug that occurred while disassembling х64 commands with the 0x67 prefix<br />
|
||||
[*] Improved support for files with small values of
|
||||
SectionAlignment<br />
|
||||
[*] Improved placement of markers and strings for Intel
|
||||
Compiler 12 and Lazarus<br />
|
||||
[*] Improved <a href="project_options.htm#ImportProtection">import protection
|
||||
</a><br />
|
||||
[*] Ultimate: Now you can load project files with licensing parameters<br />
|
||||
[+] Ultimate: Added <a href=
|
||||
"project_options.htm#ResourceProtection">resource protection</a><br />
|
||||
[+] Ultimate: The script now includes classes: <a href=
|
||||
"script_classes.htm#TLicense">TLicense</a> and <a href=
|
||||
"script_classes.htm#TLicenseManager">TLicenseManager</a><br /></p>
|
||||
|
||||
<h3>Version 2.07</h3>
|
||||
|
||||
<p>[!] Fixed an error occurred when working with the <a href=
|
||||
"manager/licenses.htm">license manager</a> if Windows had other system language than English<br />
|
||||
[+] In the expert mode you can now change the default messages: "Debugger is detected", "Virtualization tools are detected", "File is corrupted" and "Serial number is required"
|
||||
<br />
|
||||
[+] The script class <a href=
|
||||
"script_classes.htm#TVMProtector">TVMProtector</a> now has the <a href=
|
||||
"script_classes.htm#TVMProtector.Messages">Messages</a> property<br />
|
||||
[*] Improved compatibility of <a href=
|
||||
"project_options.htm#MemoryProtection">memory protection</a> with some antiviruses<br /></p>
|
||||
|
||||
<h3>Version 2.06</h3>
|
||||
|
||||
<p>[!] Fixed a bug with marker name identification for MinGW<br />
|
||||
[!] Fixed an error occurred during <a href=
|
||||
"project_options.htm#ImportProtection">import protection</a> in х64 files
|
||||
<br />
|
||||
[!] Fixed an error occurred during virtualization of FILD WORD
|
||||
PTR [XXXX]<br />
|
||||
[!] Fixed an error occurred while disassembling PSRLW<br />
|
||||
[!] Fixed an error occurred in <a href=
|
||||
"project_files.htm">DLL Box</a> when the antivirus was active<br />
|
||||
[*] Project file is now saved as XML<br />
|
||||
[*] Script is now stored in a project file<br />
|
||||
[*] Ultimate: <a href="manager/licenses.htm">License manager</a> is now in the GUI version<br />
|
||||
[*] Ultimate: Significantly sped up execution of code <a href=
|
||||
"project_functions.htm#LockToKey">locked to a serial number</a><br />
|
||||
[+] Added support for MAP files for MinGW<br />
|
||||
[+] Added support for JCLDEBUG<br />
|
||||
[+] The script class <a href=
|
||||
"script_classes.htm#TPEDirectory">TPEDirectory</a> now has the
|
||||
Clear method<br />
|
||||
[+] The script class <a href=
|
||||
"script_classes.htm#TVMProcedure">TVMProcedure</a> now has properties:
|
||||
<a href=
|
||||
"script_classes.htm#TVMProcedure.InputSize">InputSize</a> and
|
||||
<a href=
|
||||
"script_classes.htm#TVMProcedure.OutputSize">OutputSize</a><br />
|
||||
[+] Ultimate: New API are added to SDK - <a href=
|
||||
"sdk_functions.htm#VMProtectBeginVirtualizationLockByKey">VMProtectBeginVirtualizationLockByKey</a>
|
||||
and <a href=
|
||||
"sdk_functions.htm#VMProtectBeginUltraLockByKey">VMProtectBeginUltraLockByKey</a><br />
|
||||
</p>
|
||||
|
||||
<h3>Version 2.05</h3>
|
||||
|
||||
<p>[!] Fixed errors with line identification for MinGW programs<br />
|
||||
[!] Fixed the "Out of system resources" error occurred when many procedures were added to the project<br />
|
||||
[!] Fixed an error occurred in the console version during output of strings<br />
|
||||
[*] MAP file date is now taken from its contents<br />
|
||||
[+] Ultimate: Added examples on working with the <a href=
|
||||
"manager/index.htm">licensing system</a> (on MSVC and
|
||||
Delphi)<br />
|
||||
[+] Ultimate: Added source codes of the <a href=
|
||||
"manager/keygen/keygen_dll.htm">serial number generator</a>
|
||||
on MSVC<br />
|
||||
[+] Ultimate: Added <a href="project_files.htm">DLL Box</a>
|
||||
(available only for EXE files)<br />
|
||||
[+] Ultimate: A new class <a href=
|
||||
"script_classes.htm#TInternalDLLs">TInternalDLLs</a> is added to the script<br />
|
||||
[+] Ultimate: In the script class <a href=
|
||||
"script_classes.htm#TVMProtector">TVMProtector</a> a new property is added: <a href=
|
||||
"script_classes.htm#TVMProtector.InternalDlls">InternalDlls</a><br />
|
||||
|
||||
[+] In the script class <a href=
|
||||
"script_classes.htm#TMapRecord">TMapRecord</a> a new property is added:
|
||||
<a href=
|
||||
"script_classes.htm#TMapRecord.SegmentName">SegmentName</a><br />
|
||||
[+] In the script class <a href=
|
||||
"script_classes.htm#TIntelRecord">TIntelRecord</a> a new property is added: <a href=
|
||||
"script_classes.htm#TIntelRecord.Operands">Operands</a><br />
|
||||
[+] Czech language is added<br /></p>
|
||||
|
||||
<h3>Version 2.04</h3>
|
||||
|
||||
<p>[!] Fixed an error occurred during obfuscation of FDIVR
|
||||
[ESP+XXXX]<br />
|
||||
[!] Fixed an error occurred during obfuscation of SWITCH in x64 applications
|
||||
<br />
|
||||
[*] When using the "<a href=
|
||||
"project_options.htm#MemoryProtection">Memory protection</a>" option, a file is checked for integrity now<br />
|
||||
[*] Ultimate: Better licensing module integration to the protected program<br />
|
||||
[+] Added support for files with overlay<br />
|
||||
[+] Ultimate: Added an example of <a href=
|
||||
"manager/keygen/keygen_net.htm">C# serial number generator</a><br />
|
||||
[+] Ultimate: <a href="manager/licenses.htm">License manager</a> now has export of product parameters for a generator on C#<br />
|
||||
[+] Ultimate: The <a href="mode_console.htm">console version</a>
|
||||
now has the "-lf" parameter to specify a file with licensing parameters<br />
|
||||
[+] Added French help file<br /></p>
|
||||
|
||||
<h3>Version 2.03</h3>
|
||||
|
||||
<p>[!] Fixed an error occurred when using <a href=
|
||||
"project_options.htm#ImportProtection">import protection</a> in SYS files (base address of hal.dll wasn't determined under Windows 7)<br />
|
||||
[!] Fixed an error occurred during obfuscation of command using CRx registers in SYS files<br />
|
||||
[!] Fixed small issues<br />
|
||||
[*] Improvements in <a href="manager/index.htm">licensing system</a> of the Ultimate version<br />
|
||||
[+] French language is added<br /></p>
|
||||
|
||||
<h3>Version 2.02</h3>
|
||||
|
||||
<p>[!] An error is fixed in SenseLock Edition occurred when several programs using different licenses on the key run simultaneously
|
||||
(users of SenseLock Edition should update master key firmware)<br />
|
||||
[!] Fixed EntryPoint disassembly error in Delphi programs<br />
|
||||
[!] Fixed small issues<br />
|
||||
[*] Important improvements in <a href="manager/index.htm">licensing system</a> of the Ultimate version<br />
|
||||
[*] SenseLock Edition now uses the licensing system of the Ultimate version (users of SenseLock Edition should update master key firmware)<br />
|
||||
[*] Improved detection of strings marked with <a href=
|
||||
"sdk_functions.htm#VMProtectDecryptStringA">VMProtectDecryptStringA</a>/<a href="sdk_functions.htm#VMProtectDecryptStringW">VMProtectDecryptStringW</a><br />
|
||||
|
||||
[+] GUI now supports Unicode<br />
|
||||
[+] Traditional Chinese is added<br /></p>
|
||||
|
||||
<h3>Version 2.01</h3>
|
||||
|
||||
<p>[!] Fixed small issues in the installer, the <a href=
|
||||
"manager/licenses.htm">license manager</a> and <a href=
|
||||
"sdk_functions.htm">SDK</a><br />
|
||||
[*] VMProtect is registered with its own
|
||||
<a href="manager/index.htm">licensing system now</a><br />
|
||||
[+] Added Chinese Simplified<br /></p>
|
||||
|
||||
<h3>Version 2.0</h3>
|
||||
|
||||
<p>[!] Fixed disassembly and virtualization bugs of CALL FWORD PTR [XXXX] and JMP FWORD PTR [XXXX] commands<br />
|
||||
[!] An error is fixed in SenseLock Edition occurred when the serial number is asked after the standard PIN of a user has changed<br />
|
||||
[!] Fixed an error occurred during virtualization of SWITCH in х64 applications<br />
|
||||
[!] Fixed an error occurred while disassembling commands:
|
||||
ROL, ROR, RCL, RCR, SHL, SHR, SAL and SAR, with the REX prefix in х64 applications<br />
|
||||
[!] Fixed an error occurred during virtualization of the CMOVxx command<br />
|
||||
[!] Fixed small issues<br />
|
||||
[*] The help file in Russian is updated<br />
|
||||
[*] The help file in English is updated<br />
|
||||
[+] Added the <a href="manager/index.htm">licensing system</a> (available only in Ultimate version)<br />
|
||||
[+] New API are added to the SDK - <a href=
|
||||
"sdk_functions.htm#VMProtectDecryptStringA">VMProtectDecryptStringA</a>
|
||||
and <a href=
|
||||
"sdk_functions.htm#VMProtectDecryptStringW">VMProtectDecryptStringW</a><br />
|
||||
|
||||
[+] The script class <a href=
|
||||
"script_classes.htm#TVMProcedure">TVMProcedure</a> now has a new property
|
||||
<a href=
|
||||
"script_classes.htm#TVMProcedure.CompilationOptions">CompilationOptions</a><br />
|
||||
|
||||
[+] The script class <a href=
|
||||
"script_classes.htm#TVMProcedure">TVMProcedure</a> now has properties
|
||||
<a href=
|
||||
"script_classes.htm#TVMProcedure.SELicense">SELicense</a> and
|
||||
<a href="script_classes.htm#TVMProcedure.SEVersion">SEVersion</a>
|
||||
(available in SenseLock Edition only)<br />
|
||||
[+] The script class <a href=
|
||||
"script_classes.htm#TVMProtector">TVMProtector</a> has new properties added: <a href=
|
||||
"script_classes.htm#TVMProtector.VMSectionName">VMSectionName</a>
|
||||
and <a href=
|
||||
"script_classes.htm#TVMProtector.VMExecutorCount">VMExecutorCount</a><br />
|
||||
|
||||
[+] The script class <a href=
|
||||
"script_classes.htm#TVMProtector">TVMProtector</a> has new properties added:
|
||||
<a href=
|
||||
"script_classes.htm#TVMProtector.SEMasterPassword">SEMasterPassword</a>,
|
||||
<a href=
|
||||
"script_classes.htm#TVMProtector.SEUserPIN">SEUserPIN</a>,
|
||||
<a href="script_classes.htm#TVMProtector.SEKeyID">SEKeyID</a>,
|
||||
<a href="script_classes.htm#TVMProtector.SELicense">SELicense</a>
|
||||
and <a href=
|
||||
"script_classes.htm#TVMProtector.SEVersion">SEVersion</a>
|
||||
(available in SenseLock Edition only)<br />
|
||||
[-] The option "Create online commands dynamically" is removed<br /></p>
|
||||
|
||||
<h3>Version 1.81</h3>
|
||||
|
||||
<p>[!] Fixed an error occurred during execution of mutated code on Pentium 4 processors<br />
|
||||
[!] Fixed an error occurred during execution of virtualized code on some Athlon processors<br />
|
||||
[!] Fixed errors occurred during disassembly and virtualization of exception handler structures with an exception filter
|
||||
(for program on Delphi and Borland
|
||||
C++ Builder)<br />
|
||||
[!] Fixed an error occurred when using <a href=
|
||||
"project_options.htm#VirtualMachines">several VM</a> in 64-bit files<br />
|
||||
[!] Fixed small issues<br />
|
||||
[*] Enhanced detection of <a href=
|
||||
"use_markers.htm">marker</a> names (for programs on Visual C)<br />
|
||||
[*] Significantly reduced memory consumption during compilation<br />
|
||||
[*] The "HTML" resource is not packed now<br />
|
||||
[*] The help file in Russian is updated<br />
|
||||
[+] Added wildcard search of procedures in the "Master" mode<br />
|
||||
[+] Added <a href="project_options.htm#PackOutputFile">new packing mode</a> featuring higher compression rate<br />
|
||||
[+] Added support for files with TLS callbacks<br />
|
||||
[+] New API is added to the SDK - <a href=
|
||||
"sdk_functions.htm#VMProtectIsValidImageCRC">VMProtectIsValidImageCRC</a><br />
|
||||
</p>
|
||||
|
||||
<h3>Version 1.8</h3>
|
||||
|
||||
<p>[!] Fixed errors occurred during <a href=
|
||||
"project_options.htm#ImportProtection">import protection</a> in SYS files<br />
|
||||
[!] Fixed errors occurred during <a href=
|
||||
"project_options.htm#MemoryProtection">memory protection</a> in
|
||||
DLL/SYS files<br />
|
||||
[!] Fixed errors occurred when using <a href=
|
||||
"project_options.htm#VirtualMachines">multiple VM</a> in
|
||||
DLL/SYS-files<br />
|
||||
[!] Fixed an error occurred during mutation of the code with exception handlers<br />
|
||||
[!] Fixed an error occurred when <a href=
|
||||
"project_options.htm#MemoryProtection">memory protection</a> and
|
||||
<a href="project_options.htm#Watermarks">watermarks</a> were used simultaneously<br />
|
||||
[!] Fixed small bugs<br />
|
||||
[*] Improved detection of references to <a href=
|
||||
"use_markers.htm">marked</a> strings (you don't have to mark every reference to a protected string now)<br />
|
||||
[*] Improved <a href="project_options.htm#ImportProtection">import protection</a><br />
|
||||
[*] Improved <a href=
|
||||
"project_options.htm#DebuggerDetection">debugger detection</a><br />
|
||||
[*] The help file in Russian is updated<br />
|
||||
[+] The GUI version now allows saving project files under different names<br />
|
||||
[+] Now you can open project files<br />
|
||||
[+] Added <a href=
|
||||
"project_options.htm#VirtualizationToolsDetection">Sandboxie detection</a><br />
|
||||
[+] Added support for files compiled with the /SAFESEH key<br />
|
||||
[+] Added support for CodeGear 2009<br />
|
||||
[+] Now you can have named markers (when <a href=
|
||||
"sdk_functions.htm#VMProtectBegin">VMProtectBegin</a>/<a href=
|
||||
"sdk_functions.htm#VMProtectBeginMutation">VMProtectBeginMutation</a>/<a href="sdk_functions.htm#VMProtectBeginVirtualization">VMProtectBeginVirtualization</a>/<a href="sdk_functions.htm#VMProtectBeginUltra">VMProtectBeginUltra</a>
|
||||
from VMProtectSDKxx.dll/VMProtectDDKxx.sys are used)<br />
|
||||
[+] New API are added to the SDK (<a href=
|
||||
"sdk_functions.htm#VMProtectIsDebuggerPresent">VMProtectIsDebuggerPresent</a>
|
||||
and <a href=
|
||||
"sdk_functions.htm#VMProtectIsVirtualMachinePresent">VMProtectIsVirtualMachinePresent</a>)<br />
|
||||
|
||||
[+] A new utility was added to SenseLock Edition - "Remote update and licensing system"<br />
|
||||
[+] SenseLock Edition now has key id lock<br /></p>
|
||||
|
||||
<h3>Version 1.7</h3>
|
||||
|
||||
<p>[!] Sections with SHAREABLE+WRITABLE flags are not packed now<br />
|
||||
[!] Fixed small issues<br />
|
||||
[*] Improved <a href="project_options.htm#ImportProtection">import protection</a> for SYS files<br />
|
||||
[*] Improved <a href=
|
||||
"project_options.htm#PackOutputFile">packing</a> of SYS files
|
||||
(packed sections are not flagged with WRITABLE any more)<br />
|
||||
[*] Improved <a href=
|
||||
"project_options.htm#DebuggerDetection">debugger detection</a><br />
|
||||
[+] Added the "<a href=
|
||||
"project_options.htm#MemoryProtection">Memory protection</a>" option (this option prevent changes to be made to memory while the application is running)<br />
|
||||
[+] Added the "<a href=
|
||||
"project_options.htm#VirtualizationToolsDetection">Detect virtualization tools (VMware/Virtual PC)</a>" option<br />
|
||||
[+] The script class <a href=
|
||||
"script_classes.htm#TPEFile">TPEFile</a> now has a property
|
||||
<a href=
|
||||
"script_classes.htm#TPEFile.EntryPoint">EntryPoint</a><br /></p>
|
||||
|
||||
<h3>Version 1.65</h3>
|
||||
|
||||
<p>[!] Fixed small issues<br />
|
||||
[*] Improved <a href="project_options.htm#ImportProtection">import protection</a><br />
|
||||
[*] Improved <a href=
|
||||
"project_options.htm#DebuggerDetection">debugger detection
|
||||
</a><br />
|
||||
[+] Added identification of unpaired <a href=
|
||||
"use_markers.htm">markers</a> (unpaired markers are available in the general list of objects)<br />
|
||||
[+] Added markers to apply a pre-defined compilation type:
|
||||
VMProtectBeginVirtualization, VMProtectBeginMutation and
|
||||
VMProtectBeginUltra<br />
|
||||
[+] Added Chinese Traditional language<br /></p>
|
||||
|
||||
<h3>Version 1.64</h3>
|
||||
|
||||
<p>[!] Fixed a bug occurred during execution of a <a href=
|
||||
"project_options.htm#PackOutputFile">packed file</a>,
|
||||
if it had "TYPELIB", "REGISTRY" and "MUI" resources<br />
|
||||
[!] Fixed the R6002 error occurred during execution of a packed file (for programs written on Visual C)<br />
|
||||
[!] Fixed a bug occurred when the
|
||||
"<a href="project_options.htm#ImportProtection">Import protection</a>" option was used in 64-bit SYS files<br />
|
||||
[!] Fixed small issues<br />
|
||||
[*] The settings file is now saved to %APPDATA%/PolyTech/VMProtect<br />
|
||||
[*] Improved <a href="project_options.htm#ImportProtection">import protection
|
||||
</a><br />
|
||||
[+] Added the option "<a href=
|
||||
"project_options.htm#VirtualMachines">Virtual machines</a>"
|
||||
(different virtualized fragments of code are executed on different virtual machines with different architecture)<br />
|
||||
[+] Added the option "<a href=
|
||||
"project_options.htm#DebuggerDetection">Debugger detection</a>"
|
||||
(if a debugger is detected during the protected application execution, the app shows a corresponding message and closes)<br />
|
||||
[+] The script class <a href=
|
||||
"script_classes.htm#TPESection">TPESection</a> now has a property
|
||||
<a href=
|
||||
"script_classes.htm#TPESection.IncludedInPacking">IncludedInPacking</a><br />
|
||||
|
||||
[+] Added support for IRETD command<br />
|
||||
[+] Added an example of using markers in Lazarus<br /></p>
|
||||
|
||||
<h3>Version 1.63</h3>
|
||||
|
||||
<p>[!] Fixed an error occurred when using the
|
||||
"<a href="project_options.htm#ImportProtection">Import protection</a>" option<br />
|
||||
[!] Fixed small issues<br />
|
||||
[+] A new event was added to the script: <a href=
|
||||
"script_events.htm#OnBeforePackFile">OnBeforePackFile</a><br />
|
||||
[+] The script class <a href=
|
||||
"script_classes.htm#TPEFile">TPEFile</a> now has a new property
|
||||
<a href="script_classes.htm#TPEFile.Handle">Handle</a><br />
|
||||
[+] Added an example of using <a href=
|
||||
"use_markers.htm">markers</a> in Free Pascal<br />
|
||||
[*] Improved integrity control of VM objects<br /></p>
|
||||
|
||||
<h3>Version 1.62</h3>
|
||||
|
||||
<p>[!] Fixed errors occurring when using the
|
||||
"<a href="project_options.htm#ImportProtection">Import protection
|
||||
</a>" option<br />
|
||||
[!] Fixed an error occurred when handling an exception in the TRY/EXCEPT/END block in the "Ultra" mode (for programs written on Delphi and
|
||||
Borland C++ Builder)<br />
|
||||
[*] Improved <a href="project_options.htm#ImportProtection">import protection</a> for SYS files<br />
|
||||
[+] Every object of a project now can have its own compilation options for individual performance tuning
|
||||
(individual options are configured in the project tree)<br />
|
||||
[+] Added the "Move resources to the end of the file" option<br />
|
||||
[+] Added an example of using extended markers (see
|
||||
Examples\Scripts\UseExtMarkers)<br /></p>
|
||||
|
||||
<h3>Version 1.61</h3>
|
||||
|
||||
<p>[!] Fixed an error occurred when starting packed files under Windows 95/98<br />
|
||||
[!] Fixed small issues<br />
|
||||
[+] An ability to pass a file name via the command line is added to the Lite version<br />
|
||||
[+] A history is added in the "Master" mode<br />
|
||||
[+] Language selection is added in the "Master" mode<br />
|
||||
[+] Added the "<a href=
|
||||
"project_options.htm#ImportProtection">Import protection</a>" option
|
||||
(recommended for use along with packing of the output file)<br />
|
||||
[+] In the <a href="mode_console.htm">console version</a>, a new parameter "-we" is added(with this parameter all warnings are displayed as error)<br />
|
||||
[+] A new class <a href=
|
||||
"script_classes.htm#TPEResourceRecords">TPEResourceRecords</a> is added to the script<br />
|
||||
|
||||
[+] The script class <a href=
|
||||
"script_classes.htm#TPEFile">TPEFile</a> now has a new property
|
||||
<a href=
|
||||
"script_classes.htm#TPEFile.ResourceRecords">ResourceRecords</a><br />
|
||||
</p>
|
||||
|
||||
<h3>Version 1.6</h3>
|
||||
|
||||
<p>[!] Fixed small issues<br />
|
||||
[*] Improved work with identical strings(now identical strings are displayed as a single object with multiple elements inside)<br />
|
||||
[+] Added an option to pack the output file<br />
|
||||
[+] A new class <a href=
|
||||
"script_classes.htm#TPEExportRecords">TPEExportRecords</a> is added to the script<br />
|
||||
[+] The script class <a href=
|
||||
"script_classes.htm#TPEFile">TPEFile</a> now has a property
|
||||
<a href=
|
||||
"script_classes.htm#TPEFile.ExportRecords">ExportRecords</a><br />
|
||||
|
||||
[+] A new event <a href=
|
||||
"script_events.htm#OnBeforeSaveFile">OnBeforeSaveFile</a> is added to the script<br />
|
||||
[+] The help file in Chinese is added (translation by Wang
|
||||
Xiaopeng)<br />
|
||||
[+] Added MAP-file date/time check. (If modification date and time of the MAP-file differ from those of the protected file, the MAP-file is not loaded)<br /></p>
|
||||
|
||||
<h3>Version 1.56</h3>
|
||||
|
||||
<p>[!] Fixed an error occurred during virtualization of BT, BTC, BTR and BTS commands<br />
|
||||
[!] Fixed small issues<br />
|
||||
[*] List of options is sorted in order of priority<br />
|
||||
[*] Improved support for SEH for VC8<br />
|
||||
[*] Improved dynamic online-command production<br />
|
||||
[*] Improved VM object integrity control<br />
|
||||
[+] Added support for PREFETCH and PREFETCHW commands<br />
|
||||
[+] New functions CompareText and
|
||||
AnsiCompareText are added to the script<br />
|
||||
[+] The script class <a href=
|
||||
"script_classes.htm#TPEFile">TPEFile</a> now has a new property
|
||||
<a href="script_classes.htm#TPEFile.Size">Size</a><br />
|
||||
[+] Added an example of using <a href=
|
||||
"use_markers.htm">markers</a> in MinGW<br />
|
||||
[+] Added Chinese language (translation by Wang Xiaopeng)<br />
|
||||
[+] In the procedure adding dialog <a href=
|
||||
"project_functions.htm#Search">wildcard search</a> is added ("*" and "?" are allowed)<br />
|
||||
[+] Messages of the compiler now includes output file size<br /></p>
|
||||
|
||||
<h3>Version 1.55</h3>
|
||||
|
||||
<p>[!] Fixed an error occurred when working with a file having unaligned ImageSize value<br />
|
||||
[!] Fixed an error occurred when calculating TRY block beginning in Delphi programs<br />
|
||||
[!] Fixed an error occurred when a "mixed" code was processed in Discardable and NonDiscardable section of SYS-files<br />
|
||||
[!] Fixed an error occurred during virtualization of 64-bit DLL/SYS-files<br />
|
||||
[*] The "Encrypt registers upon exit of the VM" option is restored<br />
|
||||
[+] A new class <a href=
|
||||
"script_classes.htm#TIniFile">TIniFile</a> is added to the script<br />
|
||||
[+] The script class <a href=
|
||||
"script_classes.htm#TPEFile">TPEFile</a> now has new properties and methods<br />
|
||||
[+] The GUI-version now features a calculator to calculate file offsets by addresses<br />
|
||||
[+] Added Italian language (translation by Gabriele Lanza)<br /></p>
|
||||
|
||||
<h3>Version 1.54</h3>
|
||||
|
||||
<p>[!] Fixed an error occurred during mutation of the PUSH ESP command<br />
|
||||
[!] ИFixed an error occurred during virtualization of the FLDCW [ESP+xxxx] command<br />
|
||||
[!] Fixed an error occurred during obfuscation of the bytecode<br />
|
||||
[*] GUI is enhanced<br />
|
||||
[+] Added German and Spanish languages<br />
|
||||
[+] Added support for <a href="script.htm">scripts</a><br />
|
||||
[+] In the <a href="mode_console.htm">console version</a> a parameter is added to specify a script file name<br /></p>
|
||||
|
||||
<h3>Version 1.53</h3>
|
||||
|
||||
<p>[!] Fixed errors occurred during virtualization of code in DLL/SYS-files<br />
|
||||
[*] Code virtualization improvements<br />
|
||||
[*] In the <a href="mode_console.htm">console version</a> "running" percent is removed when the output is directed to a file<br />
|
||||
[+] Added an option to insert markers for x86-64<br />
|
||||
[+] Added an ability to create folders in a project<br />
|
||||
[+] In the <a href="mode_console.htm">console version</a> a new parameter is added to identify the file name of a project<br /></p>
|
||||
|
||||
<h3>Version 1.52</h3>
|
||||
|
||||
<p>[!] Fixed an error occurred during mutation of CMOVxx, CMPXCHG and CMPXCHG8B commands<br />
|
||||
[!] Fixed an error occurred during mutation of LEA ESP,[ESP+xxxx] command<br />
|
||||
[*] The RCL and RCR commands are added to the basic logic of VM<br />
|
||||
[+] Added support for x86-64<br />
|
||||
[+] In the GUI-version, the "<a href=
|
||||
"project_options.htm">Options</a>" tab now can be set to display an output file name<br />
|
||||
[+] Added the help file in Russian and English<br /></p>
|
||||
|
||||
<h3>Version 1.51</h3>
|
||||
|
||||
<p>[!] Fixed an error occurred during creating a "Relocation
|
||||
Table" of zero length<br />
|
||||
[!] Fixed an error occurred during mutation of the CALL [xxxx] command in the "Mutation" mode in DLL/SYS files<br />
|
||||
[!] In the Delphi example, VMProtectBegin definition now includes a command preventing optimization of VMProtectBegin
|
||||
(optimization could lead to a non-functional protected application)<br />
|
||||
[+] Added the "Autosave project after compiling" option<br /></p>
|
||||
|
||||
<h3>Version 1.5</h3>
|
||||
|
||||
<p>[!] Fixed an error occurred while dragging files to the main window<br />
|
||||
[!] Fixed an error occurred when working with read-only files<br />
|
||||
[!] Fixed small issue during compilation in the "Ultra" mode<br />
|
||||
[*] A protected file now inherits attributes of the original file<br />
|
||||
[+] the list of protected procedures can now include strings (string assignment must be selected with markers)<br />
|
||||
[+] The installation package includes examples of using markers in Borland C++ Builder, Delphi, MASM, Visual Basic and Visual
|
||||
C++<br />
|
||||
[+] Added an option: "Integrate to shell"<br /></p>
|
||||
|
||||
<h3>Version 1.4</h3>
|
||||
|
||||
<p>[!] Fixed an error occurred during mutation of IMUL, MUL, IDIV, DIV commands<br />
|
||||
[!] Fixed an error occurred during virtualization of multiple CASE tables following one by one<br />
|
||||
[!] Fixed an error occurred during virtualization of POP word/dword ptr [esp+xxxx] and IMUL reg8 commands<br />
|
||||
[!] Fixed an error occurred while disassembling MOVNTPS and MOVNTPD commands<br />
|
||||
[+] Added a new type of compilation "Ultra" (mutation + virtualization)"<br />
|
||||
[+] Added compilation type selection in the add/modify procedure window<br />
|
||||
[+] Added search for watermarks in processes (used for searching watermarks in packed files)<br />
|
||||
[*] Enhanced compatibility with ASM compilers (TASM, MASM etc.)<br /></p>
|
||||
|
||||
<h3>Version 1.3</h3>
|
||||
|
||||
<p>[!] Fixed an error occurred during emulation of the FILD word ptr [xxxx] command<br />
|
||||
[+] Each procedure can be specified a certain compilation type ("Mutation" or "Virtualization")<br /></p>
|
||||
|
||||
<h3>Version 1.25</h3>
|
||||
|
||||
<p>[+] Added support for SEH for VC7-8<br />
|
||||
[+] Added support for markers in Visual Basic (begin and end of a fragment are marked with the following lines: Call VarPtr("VMProtect
|
||||
begin") and Call VarPtr("VMProtect end"))<br />
|
||||
[*] In the registered version, the VM interpreter completely changes now (to prevent automatic detection of protection by signature scanners such as PEiD, RDG Packer
|
||||
Detector and others)<br /></p>
|
||||
|
||||
<h3>Version 1.24</h3>
|
||||
|
||||
<p>[+] Added a possibility to insert watermarks to a protected file<br />
|
||||
[*] VM interpreter now supports multi-threaded applications (no need to create a procedure to allocate memory for interpreter's needs)<br />
|
||||
[-] The option to allocate memory for VM interpreter's neds is removed. <br /></p>
|
||||
|
||||
<h3>Version 1.23</h3>
|
||||
|
||||
<p>[!] Fixed small issues [+] Added the "Master" mode [+] The procedure tree now displays links [*] Options
|
||||
"Hide constants", "Dynamically create online commands",
|
||||
"Encrypt registers on jumps", "VM object integrity control" and others are only available for registered users now</p>
|
||||
|
||||
<h3>Version 1.22.2</h3>
|
||||
|
||||
<p>[!]Fixed an error occurred during compilation of projects with the "Memory allocation in the interpreter" option enabled<br /></p>
|
||||
|
||||
<h3>Version 1.22</h3>
|
||||
|
||||
<p>[!] Fixed small issues<br />
|
||||
[+] Added a possibility to check integrity of a bytecode (requires enabling the "VM object integrity control" option on)<br /></p>
|
||||
|
||||
<h3>Version 1.21</h3>
|
||||
|
||||
<p>[!] Fixed an error occurred during emulation of CMPXCHG8b, if operands are EAX and EDX<br />
|
||||
[+] Now interpreter contains only those commands that will be used to execute a bytecode<br />
|
||||
[-] Some commands were removed from the basic logic of VM (to complicate analysis and decompiling of a bytecode)<br /></p>
|
||||
|
||||
<h3>Version 1.2</h3>
|
||||
|
||||
<p>[!] Fixed an error occurred when the Bound Import directory is moved<br />
|
||||
[+] Added a possibility to include marked parts of the code to the project(the beginning and the end of the
|
||||
fragment are marked by the following code assembler insertions - "db $EB,$10,'VMProtect begin',0" and "db
|
||||
$EB,$0E,'VMProtect end',0")<br />
|
||||
[+] Added an option to include exported functions to the project<br />
|
||||
[-] Removed the "Encrypt bytecode" option (bytecode is now always encrypted)<br /></p>
|
||||
|
||||
<h3>Version 1.1</h3>
|
||||
|
||||
<p>[!] Fixed errors occurred while: emulation of SBB
|
||||
(wrong state of some flags); emulation of CMOVxx,
|
||||
CMPXCHG and CMPXCHG8b (when the second operand was addressed using ESP or a DWORD value)<br />
|
||||
[+] Added support for SEH in VB6 (native)<br />
|
||||
[+] Added support for MAP-files generated by IDA<br />
|
||||
[+] Added an option for batch adding of procedures<br />
|
||||
[+] Added displaying of links to commands directly in the list of procedures<br />
|
||||
[+] Added a new option: "Encrypt registers on jumps"<br /></p>
|
||||
|
||||
<h3>Version 1.09</h3>
|
||||
|
||||
<p>[*] End of procedure detection process while disassembling of cycles is improved<br />
|
||||
[+] For UPX compatibility, Shareable flag of Writeable sections is cleared (if the old relocation table is used for VM needs)<br /></p>
|
||||
|
||||
<h3>Version 1.08</h3>
|
||||
|
||||
<p>[*] Big fragments of code disassembly is sped up<br />
|
||||
[*] Metamorphism mechanism of bytecode interpreter is improved<br /></p>
|
||||
|
||||
<h3>Version 1.07</h3>
|
||||
|
||||
<p>[!] Fixed errors occurred when: working with PE files (when code section virtual size was equal to zero);
|
||||
obfuscating FPU commands (errors led to wrong results); disassembly (CWD was detected instead of CWDE);
|
||||
emulation of ROL and ROR commands (if the argument was 1-byte)<br />
|
||||
[+] Added support for SSE2 command group<br /></p>
|
||||
|
||||
<h3>Version 1.06</h3>
|
||||
|
||||
<p>[!] Fixed an error corrupting the A flag state after emulating SUB, CMP, DEC, NEG, CMPXCHG, SCAS and
|
||||
CMPS commands.<br />
|
||||
[!] Fixed an error occurred when working with an unaligned file<br />
|
||||
[+] Added support for BSF, BSR and CMPXCHG8b instructions<br />
|
||||
[+] For multi-threaded applications, you can specify a memory allocation procedure for the VM interpreter
|
||||
(memory allocation procedure must be defined as fastcall)<br /></p>
|
||||
|
||||
<h3>Version 1.05</h3>
|
||||
|
||||
<p>[+] Added support for FUCOMPP and FCMOVxx instructions<br />
|
||||
[+] The type of strings
|
||||
(ANSI/Unicode/Pascal) and comments for structure fields made by compilers are now shown
|
||||
when looking at parts of the code<br />
|
||||
[+] Added a metamorphism procedure for the bytecode interpreter<br />
|
||||
[+] Added new compilation options: "Bytecode encryption" and
|
||||
"Strip relocations (for EXE files only)"<br />
|
||||
[-] Removed the "Obfuscate bytecode" option (now always on)<br /></p>
|
||||
|
||||
<h3>Version 1.04</h3>
|
||||
|
||||
<p>[!] Fixed an error occurred while detecting SEH handlers for C++<br />
|
||||
[*] Bytecode obfuscator is totally reworked<br />
|
||||
[+] Relocations are highlighted in the code now<br /></p>
|
||||
|
||||
<h3>Version 1.03</h3>
|
||||
|
||||
<p>[+] "Free space" from original parts of code is used to store the bytecode<br />
|
||||
[+] Added detection of "short" pascal-format strings (first byte defines the length of a string)<br /></p>
|
||||
|
||||
<h3>Version 1.02</h3>
|
||||
|
||||
<p>[!] Fixed errors related to execution of online-commands in DLL/SYS<br />
|
||||
[*] Changed the calculation algorithm of bytecode checksum<br />
|
||||
[+] Added an option "VM interpreter integrity control" (also works as an anti-debug technique if the interpreter is being debugged and the debugger uses INT 03 as breakpoints).<br />
|
||||
[+] Usage of "old" relocation tables to store the bytecode<br /></p>
|
||||
|
||||
<h3>Version 1.01</h3>
|
||||
|
||||
<p>[!] Fixed an error occurred when files with relocations were created(the error arose during operation of DLL/SYS-files in Windows 95/98/Me)<br />
|
||||
[!] Fixed small issues in the disassembler<br />
|
||||
[+] Added support for instructions: F2XM1, FABS, FCLEX, FCOS,
|
||||
FDECSTP, FINCSTP, FINIT, FLDCW, FLDLN2, FLDLG2, FPREM, FREM1,
|
||||
FPTAN, FRNDINT, FSIN, FSTCW, FTST, FYL2X, FPATAN, FLDZ,
|
||||
FISTP<br />
|
||||
[+] Added support for MAP-files of Borland C Builder<br />
|
||||
[+] Now you can select the language of the interface and messages (Russian and English are available)<br /></p>
|
||||
|
||||
<h3>Version 1.0</h3>
|
||||
|
||||
<p>[!] Fixed small bugs in the interface<br />
|
||||
[+] Added support for CMOV and CMPXCHG<br /></p>
|
||||
|
||||
<h3>Version 0.97</h3>
|
||||
|
||||
<p>[!] Fixed small bugs in the interface<br />
|
||||
[+] Added support for Virtual Pascal<br /></p>
|
||||
|
||||
<h3>Version 0.96</h3>
|
||||
|
||||
<p>[!] Fixed error in the compiler (incorrect work with the C flag while compiling NEG and SBB instructions; fixed POPF processing;
|
||||
fixed wrong bytecode CRC check when processing external conditional jumps)<br />
|
||||
[!] Fixed bugs in the VM interpreter related to bytecode obfuscation<br />
|
||||
[+] Improved processing of a MAP-file generated by C/C++
|
||||
compilers (procedure names contain information about arguments)<br /></p>
|
||||
|
||||
<h3>Version 0.94</h3>
|
||||
|
||||
<p>[!] Fixed many errors<br /></p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
BIN
help/en/images/activation_setup.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
help/en/images/button_action.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
BIN
help/en/images/button_compilation.png
Normal file
After Width: | Height: | Size: 299 B |
BIN
help/en/images/button_execute.png
Normal file
After Width: | Height: | Size: 362 B |
BIN
help/en/images/button_open.png
Normal file
After Width: | Height: | Size: 387 B |
BIN
help/en/images/button_project.png
Normal file
After Width: | Height: | Size: 5.5 KiB |
BIN
help/en/images/button_save.png
Normal file
After Width: | Height: | Size: 297 B |
BIN
help/en/images/button_search.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
BIN
help/en/images/codelock_error.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
help/en/images/delphi_map.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
help/en/images/delphi_project.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
help/en/images/depends.png
Normal file
After Width: | Height: | Size: 72 KiB |
BIN
help/en/images/expert_find.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
help/en/images/export_keys.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
help/en/images/functions.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
help/en/images/import_key.png
Normal file
After Width: | Height: | Size: 4.9 KiB |
BIN
help/en/images/licenses1.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
help/en/images/lock_to_serial.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
help/en/images/main_window.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
help/en/images/menu_edit.png
Normal file
After Width: | Height: | Size: 8.5 KiB |
BIN
help/en/images/menu_file.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
help/en/images/menu_help.png
Normal file
After Width: | Height: | Size: 5.0 KiB |
BIN
help/en/images/menu_project.png
Normal file
After Width: | Height: | Size: 8.9 KiB |
BIN
help/en/images/menu_project_import.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
help/en/images/menu_tools.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
BIN
help/en/images/preferences.png
Normal file
After Width: | Height: | Size: 5.9 KiB |
BIN
help/en/images/project_add_folder.png
Normal file
After Width: | Height: | Size: 8.8 KiB |
BIN
help/en/images/project_add_function.png
Normal file
After Width: | Height: | Size: 9.7 KiB |
BIN
help/en/images/project_add_license.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
help/en/images/project_file_delete.png
Normal file
After Width: | Height: | Size: 3.8 KiB |
BIN
help/en/images/project_file_menu.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
help/en/images/project_file_protection.png
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
help/en/images/project_file_settings.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
help/en/images/project_functions.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
help/en/images/project_functions_content.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
help/en/images/project_functions_content2.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
help/en/images/project_functions_menu.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
BIN
help/en/images/project_functions_menu2.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
help/en/images/project_functions_menu3.png
Normal file
After Width: | Height: | Size: 7.6 KiB |
BIN
help/en/images/project_functions_search.png
Normal file
After Width: | Height: | Size: 6.5 KiB |
BIN
help/en/images/project_generate_keys.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
help/en/images/project_options.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
help/en/images/project_script.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
help/en/images/properties_calc.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
help/en/images/properties_directory.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
help/en/images/properties_dump.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
help/en/images/properties_dump_goto.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
help/en/images/properties_export.png
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
help/en/images/properties_import.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
help/en/images/properties_resources.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
help/en/images/properties_segments.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
help/en/images/visual_studio_map.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
help/en/images/watermarks_add.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
help/en/images/watermarks_menu.png
Normal file
After Width: | Height: | Size: 6.4 KiB |
BIN
help/en/images/watermarks_search.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
help/en/images/watermarks_setup.png
Normal file
After Width: | Height: | Size: 8.1 KiB |
BIN
help/en/images/weblm_1.png
Normal file
After Width: | Height: | Size: 206 KiB |
BIN
help/en/images/weblm_2.png
Normal file
After Width: | Height: | Size: 314 KiB |
40
help/en/info.htm
Normal file
@ -0,0 +1,40 @@
|
||||
<!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>"Details" section</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>"Details" section</h1>
|
||||
<p>The "Details" section displays various information about the protected application.
|
||||
It also allows you to exclude certain segments of data or resources from packing. Changes you make in this section are saved to the project file.</p>
|
||||
<p><img src="images/properties_directory.png" /></p>
|
||||
<p>"Details" section contains the following subsections:</p>
|
||||
<ul>
|
||||
<li><a href="info_directories.htm">Directories</a></li>
|
||||
<li><a href="info_segments.htm">Segments</a></li>
|
||||
<li><a href="info_imports.htm">Imports</a></li>
|
||||
<li><a href="info_exports.htm">Exports</a></li>
|
||||
<li><a href="info_resources.htm">Resources</a></li>
|
||||
<li><a href="info_calc.htm">Calculator</a></li>
|
||||
<li><a href="info_dump.htm">Dump</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/en/info_calc.htm
Normal 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>"Calculator" section</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>"Calculator" section</h1>
|
||||
|
||||
<p>Allows you to determine the file offset by the virtual address or vice versa:</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>
|
30
help/en/info_directories.htm
Normal 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>"Directories" section</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>"Directories" section</h1>
|
||||
|
||||
<p>Displays information about file directories:</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/en/info_dump.htm
Normal 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>"Dump" section</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>"Dump" section</h1>
|
||||
|
||||
<p>Displays the memory dump of the protected application as machine language codes and assembler instructions:</p>
|
||||
<p><img src="images/properties_dump.png" /></p>
|
||||
|
||||
<p>The "Go To Address" button on the toolbar allows you to go to a specified address of the protected application:</p>
|
||||
<p><img src="images/properties_dump_goto.png" /></p>
|
||||
<p>To quickly go to a certain function, start typing its name in the quick search box. You can also enter its exact address.</p>
|
||||
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
28
help/en/info_exports.htm
Normal 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>"Exports" section</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>"Exports" section</h1>
|
||||
|
||||
<p>Displays information about exports the file has:</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/en/info_imports.htm
Normal 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>"Imports" section</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>"Imports" section</h1>
|
||||
|
||||
<p>Displays information about imported functions and libraries:</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>
|
31
help/en/info_resources.htm
Normal 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>"Resources" section</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>"Resources" section</h1>
|
||||
|
||||
<p>Displays information about resources:</p>
|
||||
<p><img src="images/properties_resources.png" /></p>
|
||||
<ul>
|
||||
<li><strong> Excluded from packing</strong> - a resource can be excluded from <a href="project_options.htm#PackOutputFile">packing</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/en/info_segments.htm
Normal 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>"Segments" section</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>"Segments" section</h1>
|
||||
|
||||
<p>Displays information about segments:<p></p>
|
||||
<p><img src="images/properties_segments.png" /></p>
|
||||
<ul>
|
||||
<li><strong>Excluded from memory protection</strong> - a segment can be excluded from <a href="project_options.htm#MemoryProtection">memory protection</a>.</li>
|
||||
<li><strong> Excluded from packing</strong> - a segment can be excluded from <a href="project_options.htm#PackOutputFile">packing</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/en/main_menu.htm
Normal 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>Main menu</title>
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
div.c2 {text-align: center}
|
||||
/*]]>*/
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Main menu</h1>
|
||||
|
||||
<p>The main menu consists of the following items:</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="menu_file.htm">File</a></li>
|
||||
<li><a href="menu_edit.htm">Edit</a></li>
|
||||
<li><a href="menu_project.htm">Project</a></li>
|
||||
<li><a href="menu_tools.htm">Tools</a></li>
|
||||
<li><a href="menu_help.htm">Help</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/en/main_window.htm
Normal 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>Main window</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Main window</h1>
|
||||
|
||||
<p>Main window consists of the following elements:</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="main_menu.htm">Main menu</a></li>
|
||||
<li><a href="toolbar.htm">Toolbar</a></li>
|
||||
<li>Control panel divided to three sections:
|
||||
<ul>
|
||||
<li><a href="project.htm">"Project" section</a></li>
|
||||
<li><a href="functions.htm">"Functions" section</a></li>
|
||||
<li><a href="info.htm">"Details" section</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Compilation log</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>
|
54
help/en/manager/activation.htm
Normal file
@ -0,0 +1,54 @@
|
||||
<!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>Activation system</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Activation system</h1>
|
||||
|
||||
<h3>What is it?</h3>
|
||||
|
||||
<p>Activation is a two-stage process of registering an application. On the first step (usually, directly after the purchase) a user receives an activation code that usually looks like XXXX-YYYY-ZZZZ. On the second stage, the customer enters the code to the application, the application connects to the server of the developer via the Internet, the server checks the activation code and returns a serial number to the application tied to the given activation code and usually locked to user's hardware.</p>
|
||||
|
||||
<p>Such approach allows the developer to control license usage by customers, prevent licenses from leaking and offers additional possibilities, for example, making demo licenses or offering reliable trial periods.</p><strong>Why do I need it?</strong>
|
||||
|
||||
<p>The activation system gives a software developer a lot of possibilities, for instance:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Short serial numbers</strong> - long serial numbers are great, except they are long. User may make a typo while entering them, e-mail client break those keys or replace some symbols. At the same time, long serial numbers can hold a sufficient volume of additional information. Activation codes can resolve all issues of long serial numbers while taking the most benefit from their advantages.</li>
|
||||
|
||||
<li><strong>Installation control</strong> - all activations are available to the developer online in real-time. Each activation can be monitored, analyzed, blocked. The developer can provide support to users and so on.</li>
|
||||
|
||||
<li><strong>Trial periods</strong> - you can create time-limited serial numbers by using product "modes".</li>
|
||||
|
||||
<li><strong>Subscriptions</strong> - subscriptions are similar to trial periods, but are offered for a fee. You can sell the right to use the program for a specified time to a user, just like antiviruses do. Simply sell activation codes for each service year.</li>
|
||||
</ul>
|
||||
|
||||
<p>You can find more detailed information about the activation system in the corresponding <a href=
|
||||
"http://vmpsoft.com/products/web-license-manager/" target=
|
||||
"_blank">section</a> of our website.</p>
|
||||
|
||||
<h3>What do I need?</h3>
|
||||
|
||||
<p>VMProtect Ultimate features several <a href=
|
||||
"activation/api.htm">functions</a> for relatively easy implementation of both online and offline activation. You will also need
|
||||
<a href="activation/weblm.htm">Web License Manager</a> installed on your server. Finally, you should <a href="activation/vmprotect.htm">configure</a>
|
||||
the protection project in VMProtect, to make the activation module know the URL of the WebLM server.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
174
help/en/manager/activation/api.htm
Normal file
@ -0,0 +1,174 @@
|
||||
<!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>Activation 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>Activation API</h1>
|
||||
|
||||
<p>Activation API contains only 4 functions. Two for online activation and other two for offline activation when the computer has no access to the Internet. Activation API is intended to work in cooperation with Web License Manager, so a developer still should invoke licensing system API to use serial numbers obtained from WebLM.</p><strong id=
|
||||
"VMProtectActivateLicense">VMProtectActivateLicense</strong>
|
||||
|
||||
<p>The function passes the activation code to the server and returns a serial number for this specific computer. Otherwise, an <a href="#codes">error code</a> is returned.</p>
|
||||
<pre class="code">int VMProtectActivateLicense(const char *code, char *serial, int size);
|
||||
</pre>
|
||||
|
||||
<p>The <strong>code</strong> parameter holds the activation code obtained from Web License Manager during the license purchase process.
|
||||
The <strong>serial</strong> parameter specifies a memory block of the given
|
||||
<strong>size</strong>, where the serial number generated by WebLM is put to.</p><strong id=
|
||||
"VMProtectDeactivateLicense">VMProtectDeactivateLicense</strong>
|
||||
|
||||
<p>This function passes a serial number to the server for deactivation.
|
||||
Possible return codes are listed <a href=
|
||||
"#codes">below</a>.</p>
|
||||
<pre class="code">int VMProtectDeactivateLicense(const char *serial);
|
||||
</pre>
|
||||
|
||||
<p>The <strong>serial</strong> parameters contains the serial number (not the activation code) obtained from WebLM earlier during activation.</p><strong id=
|
||||
"VMProtectGetOfflineActivationString">VMProtectGetOfflineActivationString</strong><br />
|
||||
|
||||
<strong id=
|
||||
"VMProtectGetOfflineDeactivationString">VMProtectGetOfflineDeactivationString</strong>
|
||||
|
||||
<p>These two functions work similar to the previous two, except they do not try to connect to the WebLM server. Instead, they return a text block that a user should copy to a computer connected to the Internet, open the WebLM offline activation form and paste the text there.</p>
|
||||
<pre class="code">int VMProtectGetOfflineActivationString(const char *code, char *buf, int size);
|
||||
int VMProtectGetOfflineDeactivationString(const char *serial, char *buf, int size);
|
||||
</pre>
|
||||
|
||||
<p>The <strong>code</strong> and <strong>serial</strong> parameters are similar to those of the online version of these functions. The
|
||||
<strong>buf</strong> parameter should point to a buffer of 1000 bytes or more where the text block for the offline activation form will be copied to. Possible error codes are listed <a href=
|
||||
"#codes">below</a>.</p>
|
||||
|
||||
<h3 id="codes">Possible error codes</h3>
|
||||
|
||||
<table border="1" cellspacing="0" cellpadding="2">
|
||||
<tr>
|
||||
<th>Code</th>
|
||||
|
||||
<th>Value</th>
|
||||
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_OK</td>
|
||||
|
||||
<td>0</td>
|
||||
|
||||
<td>Activation is successful. The serial number is put to the
|
||||
<strong>serial</strong> variable.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_SMALL_BUFFER</td>
|
||||
|
||||
<td>1</td>
|
||||
|
||||
<td>The buffer is too small to hold the serial number. The minimum buffer size is calculated as: bits / 8 * 3 / 2 + N,
|
||||
where bits is the length of the RSA key in bits, and N is a "security constant" - additional bytes for possible line breaks and other special symbols. We recommend using at least 10.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_NO_CONNECTION</td>
|
||||
|
||||
<td>2</td>
|
||||
|
||||
<td>The activation module couldn't connect to Web License
|
||||
Manager.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_BAD_REPLY</td>
|
||||
|
||||
<td>3</td>
|
||||
|
||||
<td>The activation server returned an unexpected result. This means some configuration issues on the server, wrong server URL or a hack attempt.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_BANNED</td>
|
||||
|
||||
<td>4</td>
|
||||
|
||||
<td>This activation code is banned on the server by the software vendor via the WebLM interface (for example, if the key has leaked or pirated). Not to be confused with ACTIVATION_ALREADY_USED.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_CORRUPTED</td>
|
||||
|
||||
<td>5</td>
|
||||
|
||||
<td>Something has gone completely wrong. The error is produced by the activation module self-check system and usually means a hacking attempt. If you've got this error, all further operations with serial numbers and activation are not safe.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_BAD_CODE</td>
|
||||
|
||||
<td>6</td>
|
||||
|
||||
<td>The specified code is not found in the database of the activation server. Perhaps, a user made a mistake while entering the code, so we can ask him or her to check if everything all right.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_ALREADY_USED</td>
|
||||
|
||||
<td>7</td>
|
||||
|
||||
<td>The activation counter for this code is depleted and all further activations are impossible. This doesn't mean the code is bad or banned. The code is good, but it just can't be activated any more. The user should contact the software vendor and purchase additional licenses or uninstall the software on other computer to increase the value of the activation counter on the server.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_SERIAL_UNKNOWN</td>
|
||||
|
||||
<td>8</td>
|
||||
|
||||
<td>Activation error. The given serial number is not found in the database on the server. Therefore, deactivation is impossible.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_EXPIRED</td>
|
||||
|
||||
<td>9</td>
|
||||
|
||||
<td>Activation error. Means the activation period of the code has expired.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>ACTIVATION_NOT_AVAILABLE</td>
|
||||
|
||||
<td>10</td>
|
||||
|
||||
<td>This error means activation/deactivation is unavailable.</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Tips and tricks</h3>
|
||||
|
||||
<p>Activation API is pretty simple, so you shouldn't experience difficulties with it. Do not forget to offer a way to activate the program offline for users who have problems with the Internet. Also, don't forget, the Activation API does not save the serial number it receives and does not pass it to the licensing module - this should be done by the developer. You don't have to call Activation API on every launch of the application. You just need to call it once, get a serial number from WebLM, save it where appropriate and then use this saved copy.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
33
help/en/manager/activation/vmprotect.htm
Normal file
@ -0,0 +1,33 @@
|
||||
<!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>Configuring activation in VMProtect</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Configuring activation in VMProtect</h1>
|
||||
|
||||
<p>For the <a href="api.htm">Activation API</a> to work, the WebLM URL is required, so you should specify it in the project settings in VMProtect. To do this, open VMProtect and switch to the options section:</p><br /><img src="../../images/activation_setup.png" alt="Configuring the activation server" />
|
||||
|
||||
<p>Enter the address to the "Activation Server" field. The address should look as: <em>http://yourserver/weblm
|
||||
path</em>. This is the first place to check if you face problems with online activation.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
43
help/en/manager/activation/weblm.htm
Normal 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>Activation in Web License Manager</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Activation in Web License Manager</h1>
|
||||
|
||||
<p>You can find the detailed Web License Manager description on <a href=
|
||||
"http://vmpsoft.com/products/web-license-manager/" target=
|
||||
"_blank">our website</a>, and here we merely provide minimum steps required to create an activation code for use with the Activation API.</p>
|
||||
|
||||
<p>First, enter Web License Manager (you can use the demo on our website) and create a product. Then export the product as a VMProtect project to be able to configure licensing and activation. After the project is set up, all check are added to the code of your app and the executable is protected, click the "Add New Code" link on the left panel in WebLM:</p>
|
||||
<p><img src="../../images/weblm_1.png" /></p>
|
||||
|
||||
<p>Select the product you need from the upper drop-down list and fill in the rest of form with the data you want to put into the serial number. Click the "Save" button. You should see the activation code you can use to debug Activation API.</p>
|
||||
<p><img src="../../images/weblm_2.png" /></p>
|
||||
|
||||
<p>You can study rich capabilities of Web License Manager (such as integration to e-commerce providers and automatic activation code generation) in
|
||||
the <a href=
|
||||
"http://vmpsoft.com/products/web-license-manager/" target=
|
||||
"_blank">online user manual</a>.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
71
help/en/manager/features.htm
Normal file
@ -0,0 +1,71 @@
|
||||
<!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>Licensing system features</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Licensing system features</h1>
|
||||
|
||||
<h3>Secure serial numbers</h3>
|
||||
|
||||
<p>The license system uses an asymmetric algorithm to encrypt serial numbers. The number is encrypted with a private key that only the developer has. The protected product uses the corresponding public key to decrypt the serial number and checks it. Due to the length of keys the system uses (1024 bit or higher for RSA) it is virtually impossible to compute the private key and make a key generator for the application.</p>
|
||||
|
||||
<h3 id="lock">Locking the code to a serial number</h3>
|
||||
|
||||
<p>VMProtect allows execution of a part of the program code on a virtual machine. The set of commands of the virtual machine changes on every build of the protected program. The licensing system allows to encrypt a part of virtual machine commands with the key stored in a serial number. Therefore, even if a hacker modifies a conditional jump in the program, the code still will not work without the correct serial number. And since code decryption is managed by the virtual machine, the decryption algorithm is hard to analyze even if the serial number is available.
|
||||
</p>
|
||||
|
||||
<h3>Limiting the period of free upgrades</h3>
|
||||
|
||||
<p>The licensing system can write a date into the key so that all application versions after that date will not work with this key. This mechanism allows you to limit the period of free upgrades. For example, upon purchase the current date plus one year is written to the key, so a user will be able to download new versions from the website within one year. The key will work in these versions only. When the one-year period ends, a user has a choice: either use the last working version of the program or purchase an update for one more year.</p>
|
||||
|
||||
<h3>Key expiration date</h3>
|
||||
|
||||
<p>The licensing system allows you to write a date into the key, after which that key stops working. This is a convenient option for products that require systematic updates. For example, upon purchase the current date plus one year is put to the key, and the program works for the given user for one year. Unlike the period of free upgrades, the user has no choice here - he has to purchase a new license if he wants to continue using the program.</p>
|
||||
|
||||
<h3>Limiting the program operation time</h3>
|
||||
|
||||
<p>The licensing system allows you to limit the maximum operation time of a copy of the program. This proves to be useful in many demo applications. For example, a user wants to test a full-featured copy of the program. In this case you can send to him or her a serial number that limits the maximum session time of the program with say ten minutes. After that, the program stops functioning. This option is also convenient for various server applications, where a user can't easily restart the program.</p>
|
||||
|
||||
<h3>Hardware locking</h3>
|
||||
|
||||
<p>The licensing system allows the developer to receive a hardware identifier of user's PC based on information about CPU, network card and OS. The licensing system can produce a serial number that will be only valid on that hardware only. This option allows you to limit usage of the application to several computers.</p>
|
||||
|
||||
<h3>Black list</h3>
|
||||
|
||||
<p>If a serial number is compromised, the licensing system allows adding such a number into the black list. The blocked serial number will not work in all further versions of the application.</p>
|
||||
|
||||
<h3>Data storage</h3>
|
||||
|
||||
<p>The licensing system stores in a serial number and provides to the program the following data: a user name, an e-mail and up to 255 bytes of arbitrary information (the so called custom user data). You can use this capability to show additional information in the "About" window of the program, to implement additional security checks if the entered serial number, to store constants available in the registered version of the product only and so on.</p>
|
||||
|
||||
<h3>Time-limited demo versions</h3>
|
||||
|
||||
<p>With the <a href="activation.htm">activation</a> system, a software developer can automatically build time-limited serial numbers locked to user's hardware. This allows you to setup a secure trial period (demo) for an application, because VMProtect does not try to hide trial marks on user's computer, and instead generates a working, but time-limited serial number. Activation is carried out over the Internet, but the activation API also provides the offline activation mode.</p><br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<h3>What can't the system do and why</h3>
|
||||
|
||||
<h3>100% secure hardware lock</h3>
|
||||
|
||||
<p>Besides the licensing system allows locking a serial number to a hardware identifier, you should understand that most of hardware data is received using operating system means, so a hacker can intercept them and modify this information. The licensing system uses certain ways to minimize this risk, but if you need 100% secure hardware lock, we recommend to use a solution based on USB keys also supported by VMProtect.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
42
help/en/manager/howitworks.htm
Normal 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>How the licensing system works</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>How the licensing system works</h1>
|
||||
|
||||
<h3>Application protection</h3>
|
||||
|
||||
<p>To protect an application, VMProtect embeds the special code into it. This code checks serial numbers using information specified in the "Licensing" subsection of the "Project" section. A public key is embedded to the application and is used then to decrypt serial numbers. Also, the protection date and some additional information the licensing requires to work is put into the application.</p>
|
||||
|
||||
<h3>Creating serial numbers</h3>
|
||||
|
||||
<p>Serial numbers can be created in the <a href=
|
||||
"licenses.htm">"Licensing"</a> section of the "Project" section or using third-party applications
|
||||
- <a href="keygen/index.htm">key generators</a>. A serial number is a set of data about a customer encrypted using the asymmetric algorithm. The serial number then is passed to the customer, he or she enters it to the program, and the licensing system checks it.</p>
|
||||
|
||||
<h3>Checking a serial number in the program</h3>
|
||||
|
||||
<p>The licensing system has
|
||||
<a href="usage/api.htm">several functions</a> a program can use to work with serial numbers. The program sends a serial number to the licensing system and queries information about it. The licensing system returns the state of a serial number (valid/invalid and why) and also can provide detailed information about the serial numbers including a user name, an e-mail, the expiration date of this serial number and so on. The protected program analyzes serial number information and decides whether or not to continue operation and to limit the functionality.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
35
help/en/manager/index.htm
Normal 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>Licensing system</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Licensing system</h1>
|
||||
|
||||
<p>The licensing system creates and checks for validity serial numbers. It supports limiting the protected software by date and time, locking it to specific hardware, encrypting the code with a serial number, limiting the period of free updates and many more. The system is based on asymmetric cryptographic algorithms to minimize chances that an unauthorized serial number generator will be built. To protect the licensing system itself, VMProtect uses virtualization therefore minimizing chances that the application will be cracked or patched on the code level.</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="features.htm">Licensing system features</a></li>
|
||||
<li><a href="howitworks.htm">How the licensing system works</a></li>
|
||||
<li><a href="licenses.htm">Managing licenses: creating, changing, blocking and so on</a></li>
|
||||
<li><a href="usage/index.htm">Example of how to integrate the system to your application</a></li>
|
||||
<li><a href="keygen/index.htm">Automatic serial number generation</a></li>
|
||||
</ul>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
47
help/en/manager/keygen/algorithms.htm
Normal file
@ -0,0 +1,47 @@
|
||||
<!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>Serial number encryption algorithms</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Serial number encryption algorithms</h1>
|
||||
|
||||
<p>The security of a key in the licensing system is based on asymmetric cryptography algorithms. The current version implements the RSA algorithm with the key length from 1024 to 16384 bits. Future versions are planned to implement other algorithms based on ECC as well as symmetric+asymmetric combined cryptography.</p>
|
||||
|
||||
<p>The algorithm used is unique for each product. Keys made with one algorithm cannot be used with another one, this means changing algorithms after at least one license is created is not allowed. The protection module in the protected program "knows" which algorithm the serial number is encrypted with and will not accept keys made with other algorithms or with the same algorithm but different parameters (say, different key length).</p>
|
||||
|
||||
<h3>RSA Algorithm</h3>
|
||||
|
||||
<p>A serial number is encrypted with the RSA algorithm as follows:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Adding random data to the beginning of the serial number</strong> - the method is based on RFC2313, but the implementation is slightly different. The following bytes are added to the beginning of the key: 00 02 NN...NN 00, where NN..NN
|
||||
are from 8 to 16 random non-zero bytes. The number of bytes is random, but the system takes into account the length of the key and its maximum capacity.</li>
|
||||
|
||||
<li><strong>Adding random data to the end of the serial number</strong>
|
||||
- the total number of bytes in a serial number must be equal to the number of bits in keys of the algorithm divided by 8.
|
||||
The serial number is appended with the corresponding number of bytes holding random data. As a result, the following serial number format is produced: 00 02 NN..NN 00 DD..DD MM..MM, where NN is a set of random non-zero bytes, DD is the original serial number, MM is a set of random bytes (including zeros). The summary length of the sequence should be equal to the number of bits in keys of the algorithm divided by 8</li>
|
||||
|
||||
<li><strong>Encryption</strong> goes using a typical procedure implemented in many libraries to process big numbers. The PHP generator contains all the required information.</li>
|
||||
|
||||
<li><strong>Packing</strong> - the set of bytes obtained after encryption is encoded to base-64 — this is a serial number that goes to a customer.</li>
|
||||
</ul><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
70
help/en/manager/keygen/index.htm
Normal file
@ -0,0 +1,70 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href=
|
||||
"../../default.css" />
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=utf-8" />
|
||||
|
||||
<title>Serial number generators</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Serial number generators</h1><strong>What are they for?</strong>
|
||||
|
||||
<p>Apart from VMProtect, other software can generate serial numbers too. This is necessary to automate sending serial numbers. A customer purchases the product, an e-commerce agent sends an HTTP query to the website of the vendor, the generator runs on the server and produces a serial number based on customer's data. The serial number is sent to the customer and to the vendor. The vendor then adds the serial to VMProtect manually using the import license dialog.</p><strong>How it works</strong>
|
||||
|
||||
<p>The licensing system of VMProtect is based on asymmetric algorithms, that is why a secret product key is required to generate a serial number. You can export this key in the project properties window and pass it to the generator in any suitable way.</p>
|
||||
|
||||
<p>The generator is called by the e-commerce agent using an HTTP query. A PHP generator can be called directly, a DLL-based generator - indirectly, but the principle is the same:</p>
|
||||
|
||||
<ul>
|
||||
<li>Receive user data from the e-commerce agent</li>
|
||||
|
||||
<li>Add all required information specified by the vendor</li>
|
||||
|
||||
<li>Generate a serial number</li>
|
||||
|
||||
<li>Encrypt it with one of algorithms</li>
|
||||
|
||||
<li>Send the result to the e-commerce agent</li>
|
||||
</ul><strong>Are there any existing generators?</strong>
|
||||
|
||||
<p>The licensing system comes with three ready to use serial number generators <a href="keygen_dll.htm">as DLL</a>,
|
||||
<a href="keygen_net.htm">for the .Net platform</a> and <a href=
|
||||
"keygen_php.htm">on PHP</a>.</p><strong>Can I make my own generator?</strong>
|
||||
|
||||
<p>Yes, you can. The format of the serial number is <a href=
|
||||
"serial_format.htm">here</a>, serial number encryption algorithms are described <a href=
|
||||
"algorithms.htm">here</a>.</p><strong>Is it safe?</strong>
|
||||
|
||||
<p>Generally, yes, this is safe. However, you should follow these recommendations:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Use HTTPS</strong> - if your e-commerce provider can send HTTPS queries, and your web hosting provider can answer such requests - you should prefer this variant over the typical HTTP, because in this case all data are transmitted in the encrypted form and the generated serial number cannot be intercepted.</li>
|
||||
|
||||
<li><strong>"Hide" your generator</strong> - make sure no one can open the generator occasionally. The
|
||||
www.site.com/keygen.php address is a bad idea. While
|
||||
www.site.com/abc123.php is much better. Make sure you do not put any external links to the key generator, it isn't listed in website directories, and don't put it into any service file like robot.txt. The less is known about the location of the generator, the better. Optionally, you can even place the generator on another website.</li>
|
||||
|
||||
<li><strong>Make sure it is the e-commerce agent who calls the generator</strong> -
|
||||
the program processing queries from the agent should check the IP address of the caller. E-commerce providers usually publish the IP-range the use to query serial number generators. Find that list at your agent and add a check to the program. If IP address sending a query lies beyond the specified IP range, do not produce comprehensible error messages. Either do not return anything or produce a simple 404.
|
||||
Do not give any clues to why the query has failed.</li>
|
||||
|
||||
<li><strong>Check input parameters</strong> - product settings in the e-commerce agent's control panel usually allow you to specify a query string the agent should make to receive a license. For instance, you want to receive user name, e-mail address, date of purchase and the order id. So make sure all these parameters are passed and all of them have the correct format. Do not produce any response to erroneous queries. Send a message to your own e-mail whenever an erroneous query to the generator is made. This should help to investigate the issue.</li>
|
||||
|
||||
<li><strong>Add a "password"</strong> specify an additional parameter in the query sent by the e-commerce agent, a password. It should have an non-obvious name and value. Check this parameter from the receiving side. If the value is wrong, or the parameter is not specified - do not generate a serial number.</li>
|
||||
</ul><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
199
help/en/manager/keygen/keygen_dll.htm
Normal file
@ -0,0 +1,199 @@
|
||||
<!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-version</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Windows-version</h1>
|
||||
|
||||
<h3>Description</h3>
|
||||
|
||||
<p>Windows key generators are DLL-files for x86 and x64 platforms, a C language header file and an MSVC-compatible lib-file. Therefore, the library can be both linked statically and loaded dynamically.</p>
|
||||
|
||||
<p>All files of the generator are located in the
|
||||
<strong>Keygen\DLL</strong> folder. A test application generating serial numbers is also there.</p>
|
||||
|
||||
<h3>Generator API</h3>
|
||||
|
||||
<p>The generator exports just two functions: the first one generates a serial number, while the second one frees up memory allocated by the first one. Let's start with the first and the main one:</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>The first parameter is a pointer to the
|
||||
<strong>VMProtectProductInfo</strong> structure, which contents are uploaded to VMProtect (see <a href=
|
||||
"../licenses.htm#export">Exporting product parameters</a>).
|
||||
The structure contains product private key, the algorithm used and the identifier of the product. More details on filling this structure follow below.</p>
|
||||
|
||||
<p>The second parameter is a pointer to the
|
||||
<strong>VMProtectSerialNumberInfo</strong> structure, which contents are moved to the generated serial number. The structure holds all fields of a serial number and a bit mask that defines which fields should be written to the serial number.</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>The <strong>flags</strong> field contains bit flags from the
|
||||
<strong>VMProtectSerialNumberFlags</strong> set described before the structure:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>HAS_USER_NAME</strong> - put the user name from the
|
||||
<strong>pUserName</strong> variable into the serial number.</li>
|
||||
|
||||
<li><strong>HAS_EMAIL</strong> - put the e-mail from the
|
||||
<strong>pEMail</strong> variable into the serial number.</li>
|
||||
|
||||
<li><strong>HAS_EXP_DATE</strong> - the serial number will expire after the date specified in the
|
||||
<strong>dwExpDate</strong> variable.</li>
|
||||
|
||||
<li><strong>HAS_MAX_BUILD_DATE</strong> - the serial number will only work with version of the product built up to the date specified in the <strong>dwMaxBuildDate</strong> variable.</li>
|
||||
|
||||
<li><strong>HAS_TIME_LIMIT</strong> - the program stops working after the time specified in the
|
||||
<strong>nRunningTimeLimit</strong> variable expires (the time is specified in minutes and shouldn't exceed 255).</li>
|
||||
|
||||
<li><strong>HAS_HARDWARE_ID</strong> - the program works only on hardware with the id specified in the <strong>pHardwareID</strong> variable.</li>
|
||||
|
||||
<li><strong>HAS_USER_DATA</strong> - put custom user data of
|
||||
<strong>nUserDataLength</strong> length at the address of <strong>pUserData</strong> to the serial number.</li>
|
||||
</ul>
|
||||
|
||||
<p>The third parameter is a pointer to a pointer. The address of the generated serial number is written there. After generating the serial number, it should be copied, and the address must be passed to the second API function of the generator that will free memory taken by the serial number.</p>
|
||||
<pre class="code"><strong>void</strong> __stdcall <strong>VMProtectFreeSerialNumberMemory</strong>(<strong>char *</strong> pSerialNumber);
|
||||
</pre>
|
||||
|
||||
<p>The <strong>VMProtectGenerateSerialNumber</strong> function
|
||||
returns a <strong>VMProtectErrors</strong> value that either contains 0 if the serial number is successfully generated, or an error code.
|
||||
Possible error codes are:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>ALL_RIGHT</strong> - no errors, the serial number is generated.</li>
|
||||
|
||||
<li><strong>UNSUPPORTED_ALGORITHM</strong> - an incorrect key encryption algorithm is passed in the first parameter of the function.</li>
|
||||
|
||||
<li><strong>UNSUPPORTED_NUMBER_OF_BITS</strong> - an incorrect number of bits is passed in the first parameter of the function.</li>
|
||||
|
||||
<li><strong>USER_NAME_IS_TOO_LONG</strong> - the length of the UTF-8 encoded user name exceeded 255 byte.</li>
|
||||
|
||||
<li><strong>EMAIL_IS_TOO_LONG</strong> - the length of the UTF-8 encoded user e-mail exceeded 255 byte.</li>
|
||||
|
||||
<li><strong>USER_DATA_IS_TOO_LONG</strong> - the length of the user data exceeded 255 byte.</li>
|
||||
|
||||
<li><strong>HWID_HAS_BAD_SIZE</strong> - the hardware identifier has incorrect size.</li>
|
||||
|
||||
<li><strong>PRODUCT_CODE_HAS_BAD_SIZE</strong> - the identifier of the product passed in the first parameter of the function has incorrect size.</li>
|
||||
|
||||
<li><strong>SERIAL_NUMBER_TOO_LONG</strong> - the serial number is too long and can't fit the number of bits specified in the algorithm.</li>
|
||||
|
||||
<li><strong>BAD_PRODUCT_INFO</strong> - the first parameter of the function is incorrect or NULL.</li>
|
||||
|
||||
<li><strong>BAD_SERIAL_NUMBER_INFO</strong> - the second parameter of the function is incorrect or NULL.</li>
|
||||
|
||||
<li><strong>BAD_SERIAL_NUMBER_CONTAINER</strong> - the third parameter of the function doesn't point to memory to write the serial number address to.</li>
|
||||
|
||||
<li><strong>NOT_EMPTY_SERIAL_NUMBER_CONTAINER</strong> - the third parameter of the function doesn't point to an empty memory cell, the cell must be NULL.</li>
|
||||
|
||||
<li><strong>BAD_PRIVATE_EXPONENT</strong> - the first parameter of the function contains an incorrect value of the private exponent.</li>
|
||||
|
||||
<li><strong>BAD_MODULUS</strong> - the first parameter of the function contains an incorrect value of modulus.</li>
|
||||
</ul>
|
||||
|
||||
<p>Errors can be of two categories: those caused by incorrect parameters or incorrect value of the first parameter, and all the rest. First category errors are rare and they indicate incorrect configuration of the structure. You should upload the product information again and check if the structure is filled correctly. An example of a proper filling of the structure can be found below.</p>
|
||||
|
||||
<p>Second category errors are caused by an attempt to put more data to the key than it can hold with its size. In this case we recommend to send a message to the e-commerce provider containing a text like "The key will be sent in 24 hours" instead of the actual serial number, and send all the required information to your own e-mail. In this case, the key is generated manually in VMProtect, some data are truncated to fit all crucial information to the maximum key size.</p>
|
||||
|
||||
<h3>Example of usage</h3>
|
||||
|
||||
<p>Below is a code example that calls the above functions and generates a serial number. Notice the block of code in the very beginning. The example will not work until you replace it with the one exported from VMProtect for your product:</p>
|
||||
<pre class="code">//////////////////////////////////////////////////////////////////////////
|
||||
// !!! this block should be generated by VMProtect !!! ///
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
<strong>VMProtectAlgorithms</strong> g_Algorithm = ALGORITHM_RSA;
|
||||
<strong>size_t</strong> g_nBits = 0;
|
||||
<strong>byte</strong> g_vModulus[1];
|
||||
<strong>byte</strong> g_vPrivate[1];
|
||||
<strong>byte</strong> g_vProductCode[1];
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
<strong>int</strong> _tmain(<strong>int</strong> argc, <strong>_TCHAR*</strong> argv[])
|
||||
{
|
||||
<strong>VMProtectProductInfo</strong> pi;
|
||||
pi.algorithm = g_Algorithm;
|
||||
pi.nBits = g_nBits;
|
||||
pi.nModulusSize = sizeof(g_vModulus);
|
||||
pi.pModulus = g_vModulus;
|
||||
pi.nPrivateSize = sizeof(g_vPrivate);
|
||||
pi.pPrivate = g_vPrivate;
|
||||
pi.nProductCodeSize = sizeof(g_vProductCode);
|
||||
pi.pProductCode = g_vProductCode;
|
||||
|
||||
<strong>VMProtectSerialNumberInfo</strong> si = {0};
|
||||
si.flags = HAS_USER_NAME | HAS_EMAIL;
|
||||
si.pUserName = L"John Doe";
|
||||
si.pEMail = L"john@doe.com";
|
||||
<strong>char *</strong> pBuf = NULL;
|
||||
<strong>VMProtectErrors</strong> res = <strong>VMProtectGenerateSerialNumber</strong>(&pi, &si, &pBuf);
|
||||
<strong>if</strong> (res == ALL_RIGHT)
|
||||
{
|
||||
<strong>printf</strong>("Serial number:\n%s\n", pBuf);
|
||||
<strong>VMProtectFreeSerialNumberMemory</strong>(pBuf);
|
||||
}
|
||||
else
|
||||
{
|
||||
<strong>printf</strong>("Error: %d\n", res);
|
||||
}
|
||||
|
||||
<strong>return</strong> 0;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>This is an example project for Microsoft Visual Studio from <strong>Keygen\DLL\Example</strong>. Below are the most interesting parts of the code with our comments.</p>
|
||||
|
||||
<p>First lines of the <strong>main</strong> function fill the <strong>VMProtectProductInfo</strong> structure with data, exported from VMProtect. This code is typical and it shouldn't be changed to avoid errors. Then we create the
|
||||
<strong>VMProtectSerialNumberInfo</strong> structure and insert a bit combination of user name and e-mail to the flag field.
|
||||
In the next line, we put the user name and the password to the appropriate fields in the structure. Note, values are accepted in the UNICODE encoding. The key generator will transform them to UTF-8.</p>
|
||||
|
||||
<p>Then, we initialize a pointer variable where the address of the generated key will be stored, and call
|
||||
<strong>VMProtectGenerateSerialNumber</strong>, then analyze the return code. If there are no errors, the generated key goes out to console, and a call to free serial number memory function is made.</p><strong>The rest fields of the
|
||||
VMprotectSerialNumberInfo structure</strong>
|
||||
|
||||
<p>Some fields of the structure may needs some additional explanations. For example, <strong>dwExpDate</strong> and
|
||||
<strong>dwMaxBuildDate</strong> fields contain dates in the specific format: <strong>0xYYYYMMDD</strong>, that is, the year is stored in the high wordб while the month and the day are in the respectively high and low bytes of the low word.
|
||||
To produce such a number, the following macros is used: <strong>MAKEDATE(y,
|
||||
m, d)</strong>. You can call it like this: <strong>MAKEDATE(2010,
|
||||
05, 12)</strong>.</p>
|
||||
|
||||
<p>The <strong>pHardwareID</strong> field should contain a pointer to a string the
|
||||
<strong>VMProtectGetCurrentHWID</strong> method from the licensing SDK has returned.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
78
help/en/manager/keygen/keygen_net.htm
Normal file
@ -0,0 +1,78 @@
|
||||
<!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-version</title>
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
p.c1 {color:red;}
|
||||
/*]]>*/
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>.Net-version</h1>
|
||||
|
||||
<h3>Description</h3>
|
||||
|
||||
<p>The .Net-version of the key generator is a build containing all that is required to generate serial numbers. Source codes are in <strong>Keygen\Net</strong> as two projects: KeyGen (the key generator itself) and Usage (an example of use of the key generator).</p>
|
||||
|
||||
<p class="c1">The key generator is supplied in source codes for quick building under a given version of the .Net
|
||||
Framework, however we strongly do not recommend to apply any changes to the code. In future versions of VMProtect some new possibilities may be added to the generator, and that may lead to repeated modification of the code. Also, this may lead to errors that are very difficult to locate.
|
||||
If you found errors in the original code of the generator or would like to suggest improvements, please contact the support team.</p>
|
||||
|
||||
<h3>Using the generator</h3>
|
||||
|
||||
<p>Take the code from the <strong>Usage</strong> project as a base,
|
||||
then add to your project a link to the VMProtect.KeyGen.dll build. After that you will be able to generate serial numbers in your application. To function properly, the generator must "know" which product you generate serial numbers for.
|
||||
To achieve this, in VMProtect open the "Project | Export key pair" dialog and select the "Parameters for KeyGen.Net" option. The text area below will contain text information you should copy and paste to your application as a string constant.</p>
|
||||
|
||||
<p>Here is an example code to call the generator:</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>The string you copied from VMProtect should be placed to the <strong>data</strong> variable passed as a parameter to the serial number class constructor. In case of any problems occur while parsing the product data, the constructor throws an exception containing a description of the problem. If the constructor successfully finishes its work, the generator is ready to produce serial numbers.</p>
|
||||
|
||||
<p>A serial number can contain various information specified using the generator properties. The above example displays how to fill all and every field of a serial number. Certain fields have limitations. For example, the <strong>User Name</strong> and
|
||||
<strong>E-Mail</strong> cannot accept strings exceeding 255 symbols in the UTF-8 encoding. If incorrect data are supplied, properties throw exceptions containing a description of the problem.</p>
|
||||
|
||||
<p>When the generator setup is done, the
|
||||
<strong>Generate()</strong> method is invoked. This method generates a serial number. At this step, all data of the serial number are combined, the checksum is calculated and the data are encrypted. If the volume of data exceeds the allowed length, the method throws an exception.</p>
|
||||
|
||||
<p>If you need to generate multiple serial numbers, you can use the generator class several times in a row, without the need to create it from scratch. To clear any given property of the generator, simply assign a <strong>null</strong> value to it.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
94
help/en/manager/keygen/keygen_php.htm
Normal file
@ -0,0 +1,94 @@
|
||||
<!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-version</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>UNIX-version</h1>
|
||||
|
||||
<h3>Description</h3>
|
||||
|
||||
<p>The UNIX-version of the key generator is a PHP file that contains all necessary information for serial number generation. The file is located in <strong>Keygen\PHP</strong>. Below we describe the key points of using such a generator.</p>
|
||||
|
||||
<h3>Configuring the generator</h3>
|
||||
|
||||
<p>In the beginning of the PHP file, the setup code is located:</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>This code is automatically generated by VMProtect (see <a href=
|
||||
"../licenses.htm#export">Exporting product parameters</a>) and is unique for each particular product. It is crucial to copy it accurately, as otherwise the generator will work incorrectly.</p>
|
||||
|
||||
<h3>Contents of a key</h3>
|
||||
|
||||
<p>Then, the generator specifies the contents of a serial number
|
||||
The contents are specified in an array, with all possible parameters of the key listed below. However, in real applications, some of them may be omitted:</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>Successful key generation handler function</h3>
|
||||
|
||||
<p>Below you can see a simplest function called upon successful generation of a serial number. The only parameter sent to it is a serial number string. The function must pass the serial number to the caller (an e-commerce agent), usually with the <strong>echo</strong> command. The string is preliminarily split to sub-strings 75 symbols each, for convenience. Also, this function could send the generated serial number by e-mail to the developer or add it to a database.</p>
|
||||
<pre class="code">function <strong>OnSerialGenerated</strong>($serial)
|
||||
{
|
||||
$serial = <strong>wordwrap</strong>($serial, 75, "\n", true);
|
||||
<strong>echo</strong> $serial;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<h3>Key generator error handler function</h3>
|
||||
|
||||
<p>The final part of the code that needs our attention is a function called when something goes wrong. This function receives a string with the error message, and when it finishes, the <strong>die()</strong> function is called. The handler function must do two things: instead of a key, return to an e-commerce agent a message saying the key will be sent manually. And send to the developer an exhaustive information about the error to fix it and generate the key manually.</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>There are several possible causes of mistakes: incorrect parameters of the algorithms, incorrect parameters of the key, a too long user name or e-mail, or a too long serial number that doesn't fit to the number of bits specified in the algorithm.
|
||||
That is why the <strong>OnSerialGenerationFailed</strong> function must send a detailed information about the issue to the developer, so he could generate a serial number and send it to the customer.</p>
|
||||
|
||||
<h3>Other things to consider</h3>
|
||||
|
||||
<p>Examples hold a simplified version of the key generator. It doesn't take into account <a href="index.htm">recommendations to develop web generators</a>. It does not check the IP address of the caller and does not analyze input parameters. Please pay attention to this when developing your own generator based on this one.</p>
|
||||
|
||||
<p>A user name and an e-mail must be passed as UTF-8 strings. Make sure your e-commerce agent sends these data in the UTF-8 encoding, or transcode the information if this is not so. Wrong encoding won't lead to an incorrect serial number generated, but the registration name displayed for such a serial number can be different from the real user's name, so he or she may be surprised to see it in the "About" window of the application</p>
|
||||
|
||||
<p>Asymmetric encryption is a complex mathematical process. If it is implemented using pure PHP without any third-party libraries, serial number generation can take dozens of seconds. The generator uses
|
||||
<strong>gmp_powm</strong>, <strong>bi_powmod</strong>,
|
||||
<strong>bcpowod</strong> functions whenever they are available. If serial number generation take too long on your hosting, we recommend to ask the hosting provider to enable these functions. For example, the <strong>gmp_powm</strong> function works ten of times faster than <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>
|
206
help/en/manager/keygen/serial_format.htm
Normal file
@ -0,0 +1,206 @@
|
||||
<!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>Serial number format</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>Serial number format</h1>
|
||||
|
||||
<h3>Serial number structure</h3>
|
||||
|
||||
<p>The serial number consists of blocks. Each block starts from an identifier byte that indicates contents of the block and possibly its length. The last block always has the 255 identifier that contains a checksum of the serial number except the last block.</p>
|
||||
|
||||
<p>Depending on the type of the block, it can have constant or variable length. In the latter case, the length is specified in the byte following the block identifier. The exact format of each block is described below.</p>
|
||||
|
||||
<h3>Block format</h3>
|
||||
|
||||
<table border="1" cellspacing="0" cellpadding="2">
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
|
||||
<th>Name</th>
|
||||
|
||||
<th>Size (byte)</th>
|
||||
|
||||
<th>Description</th>
|
||||
|
||||
<th>Example</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x01</td>
|
||||
|
||||
<td>Version</td>
|
||||
|
||||
<td>1</td>
|
||||
|
||||
<td>The block contains a version of the serial number, 1-byte sized.
|
||||
The version must be 1.</td>
|
||||
|
||||
<td>01 01</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x02</td>
|
||||
|
||||
<td>User name</td>
|
||||
|
||||
<td>1 + N</td>
|
||||
|
||||
<td>The block contains a UTF-8 encoded user name. Before the user name, there is 1 byte holding the length of the name. Therefore, the total length of a user name must not exceed 255 bytes. No trailing 0 is required.</td>
|
||||
|
||||
<td>02 04 4A 5F 48 4E</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x03</td>
|
||||
|
||||
<td>E-Mail</td>
|
||||
|
||||
<td>1 + N</td>
|
||||
|
||||
<td>The block contains a UTF-8 encoded e-mail of the user.
|
||||
Before the e-mail there is 1 byte holding the length. Therefore, the total length of an e-mail must not exceed 255 bytes. No trailing 0 is required.</td>
|
||||
|
||||
<td>03 07 61 40 62 2E 63 6F 6D</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x04</td>
|
||||
|
||||
<td>Hardware identifier</td>
|
||||
|
||||
<td>1 + N</td>
|
||||
|
||||
<td>The block contains hardware identifier as returned by the <strong>VMProtectGetCurrentHWID()</strong> function. The function returns a base-64 string. A decoded version of the string is put to the serial number. The length of the data block must be a multiple of 4. There is a length byte before the data block. The maximum block length is 32 bytes.</td>
|
||||
|
||||
<td>04 08 E1 E2 E3 E4 A1 A2 A3 A4</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x05</td>
|
||||
|
||||
<td>License expiration date</td>
|
||||
|
||||
<td>4</td>
|
||||
|
||||
<td>The block contains serial number expiration date
|
||||
Date format is described below.</td>
|
||||
|
||||
<td>05 01 0A 07 DA</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x06</td>
|
||||
|
||||
<td>Maximum operation time</td>
|
||||
|
||||
<td>1</td>
|
||||
|
||||
<td>the block contains 1 byte holding the time in minutes the program can operate. Therefore, the maximum time can be 255 minutes.</td>
|
||||
|
||||
<td>06 05</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x07</td>
|
||||
|
||||
<td>Product code</td>
|
||||
|
||||
<td>8</td>
|
||||
|
||||
<td>The block contains a product code - 8 bytes created by VMProtect and exported with product parameters.
|
||||
These data are exported in the base-64 encoding and must be decoded to a byte array before putting to a serial number.
|
||||
The size of the array must be exactly 8 bytes.
|
||||
<strong>This block is obligatory! Without it, the protected program will not work correctly.</strong></td>
|
||||
|
||||
<td>07 01 02 03 04 05 06 07 08</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x08</td>
|
||||
|
||||
<td>User data</td>
|
||||
|
||||
<td>1 + N</td>
|
||||
|
||||
<td>The block contains up to 255 bytes of custom user data.
|
||||
The license system doesn't analyze these data and will return them when the
|
||||
<strong>VMProtectGetSerialNumberData()</strong> function is called. Before the data block, there is a byte holding the size of the user data.</td>
|
||||
|
||||
<td>08 05 01 02 03 04 05</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0x09</td>
|
||||
|
||||
<td>Maximum build date</td>
|
||||
|
||||
<td>4</td>
|
||||
|
||||
<td>The block contains the maximum build date of the application. The format is described below.</td>
|
||||
|
||||
<td>09 01 0A 07 DA</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>0xFF</td>
|
||||
|
||||
<td>Checksum</td>
|
||||
|
||||
<td>4</td>
|
||||
|
||||
<td>The block contains the serial number checksum. The block is located before the last one, and the checksum is calculated for all previous blocks. The checksum calculation mechanism is described below.</td>
|
||||
|
||||
<td>FF 01 02 03 04</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3>Date storage format</h3>
|
||||
|
||||
<p>Dates are stored in a serial number as a double word -
|
||||
0xYYYYMMDD. The high order word contains the year, and the lower order word holds the day and the month.
|
||||
Bytes follow the Little Endian representation - from lower to higher. If there is a pointer to the first byte of the record, the date can be read or written with the following code:</p>
|
||||
<pre class="code"><strong>byte *</strong>pDate = 0xNNNNNN; // date address
|
||||
<strong>*</strong>(<strong>DWORD *</strong>)pDate = (2010 << 16) | (10 << 8) | 1; // October 1, 2010
|
||||
<strong>DWORD</strong> dwExp = *(<strong>DWORD *</strong>)pDate;
|
||||
</pre>
|
||||
|
||||
<h3>Checksum calculation</h3>
|
||||
|
||||
<p>The checksum of the serial number is calculated using the SHA-1 hashing algorithm. The result is five 32-bit words. The first word is used as a checksum for the serial number. <strong>Please note:</strong> the word is Little Endian (from lower to higher). The string representation of SHA-1 hash the Big Endian is used - numbers go from the higher byte to the lower one, so if the SHA-1 hash is generated by a string function (like in PHP), the first four bytes of the hash must be reversed.</p>
|
||||
|
||||
<h3>Additional information</h3>
|
||||
|
||||
<p>Block with numbers other than those specified above are ignored by the licensing system. New blocks may be added in newer versions. <strong>We do not recommend creating your own blocks using non-occupied identifiers!</strong> Firstly, this could render the key non-functional with newer version of the licensing system. Secondly, the protected program cannot read the values of theses blocks anyway. To store additional information in a key, use the <strong>User
|
||||
Data</strong> field instead. It was meant exactly for this purpose.</p>
|
||||
|
||||
<p>A serial number doesn't have SALT, a random information intended to provide variability of keys based on the same input data. This task is imposed to the encryption algorithm. If you need differences on the serial number level, for example, when selling a series of keys to an organization, you can add individual indices to the user name field ("Company" LLC,
|
||||
key 1 of 10) or insert this information to the <strong>User
|
||||
Data</strong> field in any appropriate format.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
72
help/en/manager/licenses.htm
Normal file
@ -0,0 +1,72 @@
|
||||
<!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>Managing licenses</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Managing licenses</h1>
|
||||
|
||||
<h3>Initialization</h3>
|
||||
|
||||
<p>By default, licensing functions are off. To enable them, you should create a pair of keys in the "Licenses" subsection of the "Project" section. If the project links to the license manager database (in older versions of VMProtect the license manager was a standalone program), VMProtect will suggest you to import the corresponding licenses to the project. When initialization finishes, the Lock to Serial Number option will be available, and you will be able to create and process serial numbers.</p>
|
||||
|
||||
<h3>Interface</h3>
|
||||
|
||||
<p>The "Interface" section displays a full list of licenses in the left panel and parameters of the selected element in the main panel.</p>
|
||||
|
||||
<p><img src="../images/licenses1.png" /></p>
|
||||
|
||||
<p>The right panel displays detailed information about the selected license. It also allows blocking a serial number, copying it to the clipboard or seeing hardware id information (by clicking it).</p>
|
||||
|
||||
<h3 id="AddLicense">Creating a license</h3>
|
||||
|
||||
<p>To add a new license, click the corresponding button on the toolbar.
|
||||
AThe Add License dialog appears:</p>
|
||||
|
||||
<p><img src="../images/project_add_license.png" /></p>
|
||||
|
||||
<p>The upper part of the dialog allows to specify main parameters of the new license. The lower section configures which parameters will be finally put into a serial number and allows adding additional data: for example, a hardware identifier or custom user data.
|
||||
When you finish filling the data, click OK, and VMProtect creates a new license.</p>
|
||||
|
||||
<h3>Removing and blocking licenses</h3>
|
||||
|
||||
<p>To delete a license, right-click it in the list of licenses and choose "Delete" in the context menu. Or simply select the license and press Del. To block a license, turn the "Blocked" parameter in the main panel to "Yes".</p><p>There is a difference between deleting a license and clocking it. Removed serial numbers are not blocked by the licensing system. They simply do not exist any more in the database. If a license was created by mistake and the serial number never was sent to anyone, you can delete such a license. However, if the serial number was compromised, you should not just delete the license, you should block it instead. In this case the information about this serial number is passed to the licensing system, and it will not further accept this serial number.</p>
|
||||
|
||||
<h3>Importing serial numbers</h3>
|
||||
|
||||
<p>Serial numbers can be created not only in VMProtect, but also in third-party programs - key generators. Key generators allow you to automatically provide e-commerce agents with serial numbers whenever a license is purchased. To add such serial numbers to the database, you can import them. To import serial numbers, press
|
||||
Ctrl+I or select the "Import" command in the "Project" menu.</p>
|
||||
|
||||
<p><img src="../images/menu_project_import.png" /></p>
|
||||
|
||||
<p>The first step to import a serial number is the import dialog:</p>
|
||||
|
||||
<p><img src="../images/import_key.png" /></p>
|
||||
|
||||
<p>If the entered license already presents in the database, the edit license window will be opened. Otherwise, the new license dialog appears where you can adjust the license information and confirm license creation by clicking the OK button. The license is added to the database.</p><a name="export" id="export"></a>
|
||||
|
||||
<h3>Exporting license parameters</h3>
|
||||
|
||||
<p>External key generators require secret key of the product to work properly. You can obtain this information in the most suitable form by using the "Export key pair" command from the "Project" menu. The following export dialog appears:</p>
|
||||
|
||||
<p><img src="../images/export_keys.png" /></p>
|
||||
|
||||
<p>The "Export format" field allows you to select one of the supported formats, while the "Results of export" field contains the key data in the most appropriate format for the selected type of a key generator. To copy the contents to the clipboard, click the "Copy" button.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
259
help/en/manager/usage/api.htm
Normal file
@ -0,0 +1,259 @@
|
||||
<!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>Licensing API functions</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>Licensing API functions</h1>
|
||||
|
||||
<p>The licensing system API is an integral part of VMProtect API and its SDK. API allows you to specify a serial number and retrieve all information about it: whether it suits the program or not, is the serial number expired, the name this product is registered to and so on. Also, the API provides a hardware identifier of the computer the program runs on.</p><strong id=
|
||||
"VMProtectSetSerialNumber">VMProtectSetSerialNumber</strong>
|
||||
|
||||
<p>This function loads a serial number to the licensing system. Call syntax:</p>
|
||||
<pre class="code">int VMProtectSetSerialNumber(const char *SerialNumber);
|
||||
</pre>
|
||||
|
||||
<p>The input <strong>SerialNumber</strong> parameter must contain a pointer to a null-terminated string ('\0') containing a base-64 encoded serial number. The function returns a bit mask of serial number status flags, the same as the one <strong>VMProtectGetSerialNumberState()</strong> returns. You can read more about flags below. The serial number is "good" if the function returned 0.</p><br />
|
||||
<strong id=
|
||||
"VMProtectGetSerialNumberState">VMProtectGetSerialNumberState</strong>
|
||||
|
||||
<p>This function returns status flags for the serial number specified by a call to
|
||||
<strong>VMProtectSetSerialNumber()</strong>.</p>
|
||||
<pre class="code">int VMProtectGetSerialNumberState();
|
||||
</pre>
|
||||
|
||||
<p>If at least one flag is set, there is a problem with the serial number. The program shouldn't work if at least one bit is set. The detailed description of flags and their values is listed in the table below:</p>
|
||||
|
||||
<table border="1" cellspacing="0" cellpadding="2">
|
||||
<tr>
|
||||
<th>Flag</th>
|
||||
|
||||
<th>Value</th>
|
||||
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>SERIAL_STATE_FLAG_CORRUPTED</td>
|
||||
|
||||
<td>0x00000001</td>
|
||||
|
||||
<td>The licensing system is corrupted. Possible reasons are: incorrect setup of the protection project, cracking attempt.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>SERIAL_STATE_FLAG_INVALID</td>
|
||||
|
||||
<td>0x00000002</td>
|
||||
|
||||
<td>The serial number is incorrect. The flag is set if the licensing system cannot decrypt the serial number.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>SERIAL_STATE_FLAG_BLACKLISTED</td>
|
||||
|
||||
<td>0x00000004</td>
|
||||
|
||||
<td>The serial number matches the product, but is black listed in VMProtect.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>SERIAL_STATE_FLAG_DATE_EXPIRED</td>
|
||||
|
||||
<td>0x00000008</td>
|
||||
|
||||
<td>The serial number is expired. You can obtain the detailed information about the expiration date by calling
|
||||
<strong>VMProtectGetSerialNumberData()</strong></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>SERIAL_STATE_FLAG_RUNNING_TIME_OVER</td>
|
||||
|
||||
<td>0x00000010</td>
|
||||
|
||||
<td>Operating time of the program is depleted. You can obtain the detailed information about the operating time of the program by calling
|
||||
<strong>VMProtectGetSerialNumberData()</strong></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>SERIAL_STATE_FLAG_BAD_HWID</td>
|
||||
|
||||
<td>0x00000020</td>
|
||||
|
||||
<td>Hardware identifier does not match the hardware identifier prescribed in the key.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED</td>
|
||||
|
||||
<td>0x00000040</td>
|
||||
|
||||
<td>The serial number does not match the current version of the protected program. You can obtain the maximum build date of the program this serial number matches by calling
|
||||
<strong>VMProtectGetSerialNumberData()</strong>.</td>
|
||||
</tr>
|
||||
</table><br /><br />
|
||||
<strong id=
|
||||
"VMProtectGetSerialNumberData">VMProtectGetSerialNumberData</strong>
|
||||
|
||||
<p>This function obtains information about contents of the serial number acquired with a call to
|
||||
<strong>VMProtectSetSerialNumber()</strong>. Call syntax:</p>
|
||||
<pre class="code">bool VMProtectGetSerialNumberData(VMProtectSerialNumberData *Data, int Size);
|
||||
</pre>
|
||||
|
||||
<p>The first parameter is a pointer to the
|
||||
<strong>VMProtectSerialNumberData</strong> structure, where all necessary information will be written to. The second parameter is the size of the structure passed in the first parameter. It is required to control the structure's format. The function returns FALSE if the licensing system is corrupted (see the SERIAL_STATE_FLAG_CORRUPTED flag), if a zero address of the structure is provided or if the passed size of the structure is incorrect. In all other cases, the function returns TRUE and records all information about the serial number to the provided address. Below are the elements of the structure:</p>
|
||||
|
||||
<table border="1" cellspacing="0" cellpadding="2">
|
||||
<tr>
|
||||
<th>Element</th>
|
||||
|
||||
<th>Type</th>
|
||||
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>nState</td>
|
||||
|
||||
<td>int</td>
|
||||
|
||||
<td>A bit flag mask indicating the status of a key. Similar to the one returned by
|
||||
<strong>VMProtectGetSerialNumberState()</strong>.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>wUserName</td>
|
||||
|
||||
<td>wchar_t[256]</td>
|
||||
|
||||
<td>The name of a customer in UNICODE, null-terminated.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>wEMail</td>
|
||||
|
||||
<td>wchar_t[256]</td>
|
||||
|
||||
<td>The e-Mail of a customer in UNICODE, null-terminated.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>dtExpire</td>
|
||||
|
||||
<td>VMProtectDate</td>
|
||||
|
||||
<td>The key expiration date. The format of the
|
||||
VMProtectDate structure is described below.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>dtMaxBuild</td>
|
||||
|
||||
<td>VMProtectDate</td>
|
||||
|
||||
<td>The maximum product build date the given key can work with. The format of the VMProtectDate structure is described below.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>bRunningTime</td>
|
||||
|
||||
<td>int</td>
|
||||
|
||||
<td>The amount of minutes the program will work (maximum duration of a session). The value in minutes counts from the moment the program starts.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>nUserDataLength</td>
|
||||
|
||||
<td>unsigned char</td>
|
||||
|
||||
<td>The length of user data in the
|
||||
<strong>bUserData</strong> field.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>bUserData</td>
|
||||
|
||||
<td>unsigned char[255]</td>
|
||||
|
||||
<td>User data put into the key. The actual number of bytes is specified in
|
||||
<strong>nUserDataLength</strong>.</td>
|
||||
</tr>
|
||||
</table><br />
|
||||
|
||||
<p>The <strong>VMProtectDate</strong> structure is a compact representation of date. Its fields are listed in the table below:</p>
|
||||
|
||||
<table border="1" cellspacing="0" cellpadding="2">
|
||||
<tr>
|
||||
<th>Element</th>
|
||||
|
||||
<th>Type</th>
|
||||
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>wYear</td>
|
||||
|
||||
<td>unsigned short</td>
|
||||
|
||||
<td>Year.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>bMonth</td>
|
||||
|
||||
<td>unsigned char</td>
|
||||
|
||||
<td>Month, starts from 1.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>bDay</td>
|
||||
|
||||
<td>unsigned char</td>
|
||||
|
||||
<td>Day, starts from 1.</td>
|
||||
</tr>
|
||||
</table><br />
|
||||
<br />
|
||||
<strong id=
|
||||
"VMProtectGetCurrentHWID">VMProtectGetCurrentHWID</strong>
|
||||
|
||||
<p>This function obtains a hardware identifier of the PC the program is working on. Call syntax:</p>
|
||||
<pre class="code">int VMProtectGetCurrentHWID(char * HWID, int Size);
|
||||
</pre>
|
||||
|
||||
<p>The first parameter is a pointer to a memory area where the identifier is written to. The second parameter is the size of this area. The function returns the number of bytes written inclusive of the trailing zero byte ('\0'). If NULL is provided in the first parameter, the function returns the number of bytes required to store the hardware identifier. Here is the correct way to use the function:</p>
|
||||
<pre class="code"><strong>int</strong> nSize = <strong>VMProtectGetCurrentHWID</strong>(NULL, 0); // get the required buffer size
|
||||
<strong>char *</strong>pBuf = <strong>new char</strong>[nSize]; // allocate memory for the buffer
|
||||
<strong>VMProtectGetCurrentHWID</strong>(pBuf, nSize); // obtain the identifier
|
||||
// use the identifier
|
||||
<strong>delete</strong> [] pBuf; // release memory
|
||||
</pre><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
74
help/en/manager/usage/index.htm
Normal file
@ -0,0 +1,74 @@
|
||||
<!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>Integrating to application</title>
|
||||
<style type="text/css">
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Integrating to application</h1>
|
||||
|
||||
<p>In the several steps described below we will create a test application that queries the licensing system: provides serial numbers to it, receives the status of a serial number and its contents. On the first stage, we use the license system in the test mode; one the second stage we use it as it would be used in actual practice.</p><strong>Work modes of the licensing system</strong>
|
||||
|
||||
<p>Building protection always goes through two main steps: development and release. As for licensing, at first you create an application, integrate protection into it, then add checks and functional limitations. And only after thorough testing you can make the product available to users and begin the second stage. Testing of a protected application is a complex process, because you need to make sure all checks and conditional jumps operate correctly. Making "real" serial numbers for all possible test cases is inconvenient. That is why the licensing system offers the "developer mode" (AKA "test mode") as well. In this work mode, no protection is applied to the app, and reaction of the system to supplied serial numbers is adjusted in the configuration file. When the application is free from bugs and it correctly works with the licensing system, VMProtect replaces the "test" licensing module with the real one that do perform real serial number checking. This is done when the application is protected, so you can't avoid this step by mistake.</p><strong id="TestMode">Stage 1:
|
||||
Test mode</strong>
|
||||
|
||||
<p>In the test mode, all reactions of the licensing system (statuses and data it returns) to supplied serial numbers is described in the configuration file. The file is called VMPLicense.ini and should be located in the working folder of the application. In 10 steps provided below we will go from creating the simplest application to full-featured use of the licensing system in the test mode with hardware locking and limiting the period of free upgrades.</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="step11_app.htm">Step 1.1: Creating a protected application</a></li>
|
||||
|
||||
<li><a href="step12_code.htm">Step 1.2: Adding the license checking code</a></li>
|
||||
|
||||
<li><a href="step13_flags.htm">Step 1.3: Retrieving serial number status flags</a></li>
|
||||
|
||||
<li><a href="step14_name.htm">Step 1.4: Retrieving the name and the e-mail of a user</a></li>
|
||||
|
||||
<li><a href="step15_exp.htm">Step 1.5: Checking the expiration date of the serial number</a></li>
|
||||
|
||||
<li><a href="step16_time.htm">Step 1.6: Limiting the operation time of the program</a></li>
|
||||
|
||||
<li><a href="step17_maxbuild.htm">Step 1.7: Limiting the free upgrades period</a></li>
|
||||
|
||||
<li><a href="step18_blacklist.htm">Step 1.8: Serial numbers in the black list</a></li>
|
||||
|
||||
<li><a href="step19_hwid.htm">Step 1.9: Hardware lock</a></li>
|
||||
|
||||
<li><a href="step1A_userdata.htm">Step 1.10: User data</a></li>
|
||||
</ul><strong id="RealMode">Stage 2: Real mode</strong>
|
||||
|
||||
<p>In the real mode VMProtect licensing system puts a special licensing module to the protected application. This module carries out the same functions as the test one in the SDK, but works with contents of a serial number instead of the configuration ini-file. The next five steps illustrate the process of protecting a simple application with a full-featured protection based on VMProtect and the licensing system.</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="step21_src.htm">Step 2.1: Creating a new protected application</a></li>
|
||||
|
||||
<li><a href="step22_vmp.htm">Step 2.2: Creating a VMProtect protection project</a></li>
|
||||
|
||||
<li><a href="step23_product.htm">Step 2.3: First start of the protected product</a></li>
|
||||
|
||||
<li><a href="step24_test.htm">Step 2.4: Testing the results</a></li>
|
||||
|
||||
<li><a href="step25_codelock.htm">Step 2.5: Locking the code to a serial number</a></li>
|
||||
</ul><strong>Additional information</strong>
|
||||
|
||||
<p>Values of all bit flags, structure formats and function call parameters can be found in the <a href="api.htm">Licensing system API
|
||||
</a> section of this help file. Use this section as a reference, while Steps provided above help to easily implement a typical ready-to-use protection.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
53
help/en/manager/usage/step11_app.htm
Normal 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>Step 1.1: Creating a protected application</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Step 1.1: Creating a protected application</h1>
|
||||
|
||||
<p>The first step is to create an application. This would be a simple app without any user interface and with no serious capabilities. Our goal is to pass a serial number to the licensing system and receive its answer..</p>
|
||||
<pre class="code">#include <windows.h>
|
||||
#include <stdio.h>
|
||||
|
||||
bool is_registered(const char *serial)
|
||||
{
|
||||
return serial && serial[0] == 'X';
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
char *serial = "Xserialnumber"; // we set the serial number directly in the code, for simplicity
|
||||
if (!is_registered(serial))
|
||||
{
|
||||
printf("please register!\n");
|
||||
return 0;
|
||||
}
|
||||
printf("We are registered.\n");
|
||||
return 0;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>The program uses a very simple way to check the serial number. The <strong>is_registered()</strong> function compares the first symbol of the serial number with 'X' and thinks the number is correct if this they match. For an incorrect serial number, a registration message is displayed, while if a user enter the correct key, "We are registered." is shown instead</p>
|
||||
|
||||
<p>The <a href="step12_code.htm">next step</a> is to add the code to check the serial number using the licensing system of
|
||||
VMProtect.</p><br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
79
help/en/manager/usage/step12_code.htm
Normal 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>Step 1.2: Adding the license checking code</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Step 1.2: Adding the license checking code</h1><strong>Include VMProtect SDK</strong>
|
||||
|
||||
<p>If you haven't do this before, it is time to include VMProtect SDK to your project. The SDK is three files: the header file (VMProtectSDK.h), the library file (VMProtectSDK32.lib) and the dll-file with implementation (VMProtectSDK32.dll). There are individual implementations of the library and the dll-file for 64-bit systems.</p>
|
||||
|
||||
<p>Put the dll-file, the header file and the library file to the working folder of our application, where the source files are, and include the header file to the main file:</p>
|
||||
<pre class="code">#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include "VMProtectSDK.h"
|
||||
</pre>
|
||||
|
||||
<p>Build the project and make sure it compiles and runs as before. The licensing system is inactive yet.</p><strong>Sending a serial number to the licensing system</strong>
|
||||
|
||||
<p>Now, right below the line with the serial number, we add a call to the SDK function of the licensing system:</p>
|
||||
<pre class="code">char *serial = "Xserialnumber"; // we set the serial number directly in the code, for simplicity
|
||||
int res = VMProtectSetSerialNumber(serial);
|
||||
printf("res = 0x%08X\n", res);
|
||||
</pre>
|
||||
|
||||
<p>If after you did this the program stops with an error saying the required dll-file is missing, make sure you put the corresponding DLL-file to the working folder of our application. In case of a successful execution, you should see the following message:</p>
|
||||
<pre class="code">res = 0x00000002
|
||||
</pre>
|
||||
|
||||
<p>2 corresponds to the SERIAL_STATE_FLAG_INVALID flag
|
||||
<a href="api.htm">described in the API</a>. This means the licensing system thinks our key is incorrect, which is pretty true, as we didn't "explain" to the system which keys are correct, and which ones are not.</p><strong>Specifying the "correct" serial number</strong>
|
||||
|
||||
<p>In the test mode, the licensing system analyzes the
|
||||
VMProtectLicense.ini file and reacts to function calls in accordance with the specified settings. We will thoroughly review the file on later steps, and now we simply create such a file and add the following text there:</p>
|
||||
<pre class="code">[TestLicense]
|
||||
AcceptedSerialNumber=Xserialnumber
|
||||
</pre>
|
||||
|
||||
<p>Now, run our program again. If you still receive the "2" error code, make sure the ini-file is located in the working folder of the app. This time we should receive "0". That's the sign that the licensing system accepted and approved the serial number. Now we can remove the
|
||||
<strong>is_registered()</strong> function from the code - the licensing system is now in charge for checking serial numbers:</p>
|
||||
<pre class="code">#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include "VMProtectSDK.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
char *serial = "Xserialnumber"; // we set the serial number directly in the code, for simplicity
|
||||
|
||||
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">Next step</a>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
75
help/en/manager/usage/step13_flags.htm
Normal file
@ -0,0 +1,75 @@
|
||||
<!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>Step 1.3: Retrieving serial number status flags</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Step 1.3: Retrieving serial number status flags</h1><strong>A handy function to print flags</strong>
|
||||
|
||||
<p>First of all, we need a handy function to transform numeric values of flags to comprehensible statuses of a serial number. Here is the code of this function:</p>
|
||||
<pre class="code">#define PRINT_HELPER(state, flag) if (state & flag) printf("%s ", #flag)
|
||||
void print_state(INT state)
|
||||
{
|
||||
if (state == 0)
|
||||
{
|
||||
printf("state = 0\n");
|
||||
return;
|
||||
}
|
||||
|
||||
printf("state = ");
|
||||
PRINT_HELPER(state, SERIAL_STATE_FLAG_CORRUPTED);
|
||||
PRINT_HELPER(state, SERIAL_STATE_FLAG_INVALID);
|
||||
PRINT_HELPER(state, SERIAL_STATE_FLAG_BLACKLISTED);
|
||||
PRINT_HELPER(state, SERIAL_STATE_FLAG_DATE_EXPIRED);
|
||||
PRINT_HELPER(state, SERIAL_STATE_FLAG_RUNNING_TIME_OVER);
|
||||
PRINT_HELPER(state, SERIAL_STATE_FLAG_BAD_HWID);
|
||||
PRINT_HELPER(state, SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED);
|
||||
printf("\n");
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Despite the size, function is really simple - checks all bit flags one by one and print all that are present in the status variable. Replace
|
||||
<strong>printf</strong> in the code after checking the serial number to the call to
|
||||
<strong>print_state</strong>, and make changes to the serial number we pass to the licensing system:</p>
|
||||
<pre class="code">char *serial = "Xserialnumber1"; // we set the serial number directly in the code, for simplicity
|
||||
int res = VMProtectSetSerialNumber(serial);
|
||||
print_state(res);
|
||||
</pre>
|
||||
|
||||
<p>Now, if we run this program, the following message will be printed to the console:</p>
|
||||
<pre class="code">state = SERIAL_STATE_FLAG_INVALID
|
||||
please register!
|
||||
</pre>
|
||||
|
||||
<p>Now, we put the old key back by removing "1" and run the program again:</p>
|
||||
<pre class="code">state = 0
|
||||
We are registered.
|
||||
</pre>
|
||||
|
||||
<p>Now, as we can see status flags of a serial number, let's move to retrieving flags and data from a serial number.</p><strong>Retrieving serial number status</strong>
|
||||
|
||||
<p>You can get the status of a serial number in three ways: by calling
|
||||
<strong>VMProtectSetSerialNumber()</strong>, by calling
|
||||
<strong>VMProtectGetSerialNumberState()</strong> or by calling
|
||||
<strong>VMProtectGetSerialNumberData()</strong> - status flags are put into one of fields of the structure. Each method is intended to use in specific time. The first check of the serial number is performed during installation. At this moment you should decline incorrect numbers, expired numbers, numbers in the black list and so on. Some limitations, for example, the maximum operation time of the program or serial number expiration date should also be checked in run-time. And the <strong>VMProtectGetSerialNumberState()</strong> method is the fastest and the most convenient way here. And if you need to receive complete information about the serial number, you can use the more powerful
|
||||
<strong>VMProtectGetSerialNumberData()</strong> function.</p><br />
|
||||
<a href="step14_name.htm">Next step</a>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
48
help/en/manager/usage/step14_name.htm
Normal file
@ -0,0 +1,48 @@
|
||||
<!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>Step 1.4: Retrieving the name and the e-mail of a user</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Step 1.4: Retrieving the name and the e-mail of a user</h1>
|
||||
|
||||
<p>Let's start with simple things. We want to get the name and the e-mail of a user from a serial number to show them in the About window (or anywhere else). To do this, we have to add two more lines to our ini-file:</p>
|
||||
<pre class="code">[TestLicense]
|
||||
AcceptedSerialNumber=Xserialnumber
|
||||
UserName=John Doe
|
||||
EMail=john@doe.com
|
||||
</pre>
|
||||
|
||||
<p>And in the program, if the registration is successful, we obtain these data and output them to the screen:</p>
|
||||
<pre class="code">VMProtectSerialNumberData sd = {0};
|
||||
VMProtectGetSerialNumberData(&sd, sizeof(sd));
|
||||
printf("name = %ls,\ne-mail = %ls\n", sd.wUserName, sd.wEMail);
|
||||
</pre>
|
||||
|
||||
<p>The structure contains UNICODE data, so <strong>printf()</strong> uses %ls specifiers instead of %s.
|
||||
The program should print the following text on the screen:</p>
|
||||
<pre class="code">state = 0
|
||||
We are registered.
|
||||
name = John Doe,
|
||||
e-mail = john@doe.com
|
||||
</pre><br />
|
||||
<a href="step15_exp.htm">Next step</a>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
55
help/en/manager/usage/step15_exp.htm
Normal 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>Step 1.5: Checking the expiration date of the serial number</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Step 1.5: Checking the expiration date of the serial number</h1>
|
||||
|
||||
<p>Now put a new line to the ini-file in the following format: ExpDate=YYYYMMDD. For example:</p>
|
||||
<pre class="code">ExpDate=20000101
|
||||
</pre>
|
||||
|
||||
<p>The date specified in this line must be already passed, that is, the maximum date is yesterday. When we run the program, we should see the following:</p>
|
||||
<pre class="code">state = SERIAL_STATE_FLAG_DATE_EXPIRED
|
||||
please register!
|
||||
</pre>
|
||||
|
||||
<p>Now let's get some more information before the "please register" message is shown and the program exists:</p>
|
||||
<pre class="code">if (res)
|
||||
{
|
||||
VMProtectSerialNumberData sd = {0};
|
||||
VMProtectGetSerialNumberData(&sd, sizeof(sd));
|
||||
printf("exp. date: y = %d, m = %d, d = %d\n", sd.dtExpire.wYear, sd.dtExpire.bMonth, sd.dtExpire.bDay);
|
||||
printf("please register!\n");
|
||||
return 0;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>The second run of the app now provides more details to us:</p>
|
||||
<pre class="code">state = SERIAL_STATE_FLAG_DATE_EXPIRED
|
||||
exp. date: y = 2000, m = 1, d = 1
|
||||
please register!
|
||||
</pre>
|
||||
|
||||
<p>Ok, now remove the ExpDate=... line from the ini-file, so it will not influence everything else we are to do.</p><br />
|
||||
<a href="step16_time.htm">Next step</a>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
62
help/en/manager/usage/step16_time.htm
Normal 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>Step 1.6: Limiting the operation time of the program</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Step 1.6: Limiting the operation time of the program</h1>
|
||||
|
||||
<p>You can limit the program operates since the moment it is started. This can be useful for demonstration purposes: you provide a real serial number to a user, but the program works no longer than 5 minutes. The licensing system doesn't force such a program to shut down, but merely sets the status flag. So, let's set a maximum working time of one minute, by adding the following line to the ini-file:</p>
|
||||
<pre class="code">TimeLimit=1
|
||||
</pre>
|
||||
|
||||
<p>And modify the program as follows:</p>
|
||||
<pre class="code">int main(int argc, char **argv)
|
||||
{
|
||||
char *serial = "Xserialnumber"; // we set the serial number directly in the code, for simplicity
|
||||
|
||||
int res = VMProtectSetSerialNumber(serial);
|
||||
print_state(res);
|
||||
if (res) return 0;
|
||||
|
||||
VMProtectSerialNumberData sd = {0};
|
||||
VMProtectGetSerialNumberData(&sd, sizeof(sd));
|
||||
printf("I will run for %d minute(s)\n", sd.bRunningTime);
|
||||
print_state(VMProtectGetSerialNumberState());
|
||||
Sleep(60 * 1000 * sd.bRunningTime);
|
||||
printf("After %d minute(s):\n", sd.bRunningTime);
|
||||
print_state(VMProtectGetSerialNumberState());
|
||||
|
||||
return 0;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>The program prints the status of the serial number upon start up, then calculates the maximum operating time and waits it to expire. Then the serial number status is printed again. With the maximum operation time set to one minute we should receive the following result:</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>The protected program should analyze the status of a serial number periodically and shut down if the flag is set. The licensing system does not do this automatically, because the program may need to free memory, save data to a file and so on. Also, you may want the program to not stop after the operation time has expired, but instead switch to a more restricted mode. The licensing system leaves this up to the developer.</p><br />
|
||||
<a href="step17_maxbuild.htm">Next step</a>
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<br />
|
||||
<hr noshade="noshade" size="1" />
|
||||
|
||||
<div align="center">
|
||||
© 2006-2015 Copyright VMProtect Software
|
||||
</div>
|
||||
</body>
|
||||
</html>
|