diff options
author | jmpoep <OriginalEntryPoint@qq.com> | 2023-12-07 16:51:07 +0800 |
---|---|---|
committer | jmpoep <OriginalEntryPoint@qq.com> | 2023-12-07 16:51:07 +0800 |
commit | 28008a746a31abb7909dd86cb0cd413ac8943b0b (patch) | |
tree | a30b74b8cad548048c3c1551d652828ab76fa9bd /help | |
download | vmprotect-3.5.1-master.tar vmprotect-3.5.1-master.tar.gz vmprotect-3.5.1-master.tar.bz2 vmprotect-3.5.1-master.zip |
Diffstat (limited to 'help')
277 files changed, 17137 insertions, 0 deletions
diff --git a/help/en/about_vmprotect.htm b/help/en/about_vmprotect.htm new file mode 100644 index 0000000..10a6e25 --- /dev/null +++ b/help/en/about_vmprotect.htm @@ -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> diff --git a/help/en/contacts.htm b/help/en/contacts.htm new file mode 100644 index 0000000..ac5b76c --- /dev/null +++ b/help/en/contacts.htm @@ -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> diff --git a/help/en/create_project.htm b/help/en/create_project.htm new file mode 100644 index 0000000..bb2e4ec --- /dev/null +++ b/help/en/create_project.htm @@ -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> diff --git a/help/en/default.css b/help/en/default.css new file mode 100644 index 0000000..2aed7c2 --- /dev/null +++ b/help/en/default.css @@ -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; +} diff --git a/help/en/dictionary.htm b/help/en/dictionary.htm new file mode 100644 index 0000000..926f0cc --- /dev/null +++ b/help/en/dictionary.htm @@ -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> diff --git a/help/en/en.qhcp b/help/en/en.qhcp new file mode 100644 index 0000000..e91c869 --- /dev/null +++ b/help/en/en.qhcp @@ -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>
\ No newline at end of file diff --git a/help/en/en.qhp b/help/en/en.qhp new file mode 100644 index 0000000..a70030e --- /dev/null +++ b/help/en/en.qhp @@ -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> diff --git a/help/en/faq.htm b/help/en/faq.htm new file mode 100644 index 0000000..4a0d931 --- /dev/null +++ b/help/en/faq.htm @@ -0,0 +1,109 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>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> diff --git a/help/en/functions.htm b/help/en/functions.htm new file mode 100644 index 0000000..ef72c49 --- /dev/null +++ b/help/en/functions.htm @@ -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> diff --git a/help/en/history.htm b/help/en/history.htm new file mode 100644 index 0000000..a1cae6e --- /dev/null +++ b/help/en/history.htm @@ -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> diff --git a/help/en/images/activation_setup.png b/help/en/images/activation_setup.png Binary files differnew file mode 100644 index 0000000..6e2fde2 --- /dev/null +++ b/help/en/images/activation_setup.png diff --git a/help/en/images/button_action.png b/help/en/images/button_action.png Binary files differnew file mode 100644 index 0000000..8484283 --- /dev/null +++ b/help/en/images/button_action.png diff --git a/help/en/images/button_compilation.png b/help/en/images/button_compilation.png Binary files differnew file mode 100644 index 0000000..bd2cc6e --- /dev/null +++ b/help/en/images/button_compilation.png diff --git a/help/en/images/button_execute.png b/help/en/images/button_execute.png Binary files differnew file mode 100644 index 0000000..82f3c9f --- /dev/null +++ b/help/en/images/button_execute.png diff --git a/help/en/images/button_open.png b/help/en/images/button_open.png Binary files differnew file mode 100644 index 0000000..b6b5bcb --- /dev/null +++ b/help/en/images/button_open.png diff --git a/help/en/images/button_project.png b/help/en/images/button_project.png Binary files differnew file mode 100644 index 0000000..19a37af --- /dev/null +++ b/help/en/images/button_project.png diff --git a/help/en/images/button_save.png b/help/en/images/button_save.png Binary files differnew file mode 100644 index 0000000..5df92e5 --- /dev/null +++ b/help/en/images/button_save.png diff --git a/help/en/images/button_search.png b/help/en/images/button_search.png Binary files differnew file mode 100644 index 0000000..92da88c --- /dev/null +++ b/help/en/images/button_search.png diff --git a/help/en/images/codelock_error.png b/help/en/images/codelock_error.png Binary files differnew file mode 100644 index 0000000..cc89c01 --- /dev/null +++ b/help/en/images/codelock_error.png diff --git a/help/en/images/delphi_map.png b/help/en/images/delphi_map.png Binary files differnew file mode 100644 index 0000000..c50db71 --- /dev/null +++ b/help/en/images/delphi_map.png diff --git a/help/en/images/delphi_project.png b/help/en/images/delphi_project.png Binary files differnew file mode 100644 index 0000000..f208ba5 --- /dev/null +++ b/help/en/images/delphi_project.png diff --git a/help/en/images/depends.png b/help/en/images/depends.png Binary files differnew file mode 100644 index 0000000..b9dd025 --- /dev/null +++ b/help/en/images/depends.png diff --git a/help/en/images/expert_find.png b/help/en/images/expert_find.png Binary files differnew file mode 100644 index 0000000..c04f64b --- /dev/null +++ b/help/en/images/expert_find.png diff --git a/help/en/images/export_keys.png b/help/en/images/export_keys.png Binary files differnew file mode 100644 index 0000000..f68cc4c --- /dev/null +++ b/help/en/images/export_keys.png diff --git a/help/en/images/functions.png b/help/en/images/functions.png Binary files differnew file mode 100644 index 0000000..7989724 --- /dev/null +++ b/help/en/images/functions.png diff --git a/help/en/images/import_key.png b/help/en/images/import_key.png Binary files differnew file mode 100644 index 0000000..df4e19a --- /dev/null +++ b/help/en/images/import_key.png diff --git a/help/en/images/licenses1.png b/help/en/images/licenses1.png Binary files differnew file mode 100644 index 0000000..62ecb6e --- /dev/null +++ b/help/en/images/licenses1.png diff --git a/help/en/images/lock_to_serial.png b/help/en/images/lock_to_serial.png Binary files differnew file mode 100644 index 0000000..b96aace --- /dev/null +++ b/help/en/images/lock_to_serial.png diff --git a/help/en/images/main_window.png b/help/en/images/main_window.png Binary files differnew file mode 100644 index 0000000..e9aba46 --- /dev/null +++ b/help/en/images/main_window.png diff --git a/help/en/images/menu_edit.png b/help/en/images/menu_edit.png Binary files differnew file mode 100644 index 0000000..95f86a6 --- /dev/null +++ b/help/en/images/menu_edit.png diff --git a/help/en/images/menu_file.png b/help/en/images/menu_file.png Binary files differnew file mode 100644 index 0000000..285fb1a --- /dev/null +++ b/help/en/images/menu_file.png diff --git a/help/en/images/menu_help.png b/help/en/images/menu_help.png Binary files differnew file mode 100644 index 0000000..e50991e --- /dev/null +++ b/help/en/images/menu_help.png diff --git a/help/en/images/menu_project.png b/help/en/images/menu_project.png Binary files differnew file mode 100644 index 0000000..99e7392 --- /dev/null +++ b/help/en/images/menu_project.png diff --git a/help/en/images/menu_project_import.png b/help/en/images/menu_project_import.png Binary files differnew file mode 100644 index 0000000..e279de9 --- /dev/null +++ b/help/en/images/menu_project_import.png diff --git a/help/en/images/menu_tools.png b/help/en/images/menu_tools.png Binary files differnew file mode 100644 index 0000000..c4a29fc --- /dev/null +++ b/help/en/images/menu_tools.png diff --git a/help/en/images/preferences.png b/help/en/images/preferences.png Binary files differnew file mode 100644 index 0000000..e0328e5 --- /dev/null +++ b/help/en/images/preferences.png diff --git a/help/en/images/project_add_folder.png b/help/en/images/project_add_folder.png Binary files differnew file mode 100644 index 0000000..eba65ac --- /dev/null +++ b/help/en/images/project_add_folder.png diff --git a/help/en/images/project_add_function.png b/help/en/images/project_add_function.png Binary files differnew file mode 100644 index 0000000..45c11a3 --- /dev/null +++ b/help/en/images/project_add_function.png diff --git a/help/en/images/project_add_license.png b/help/en/images/project_add_license.png Binary files differnew file mode 100644 index 0000000..fb1d384 --- /dev/null +++ b/help/en/images/project_add_license.png diff --git a/help/en/images/project_file_delete.png b/help/en/images/project_file_delete.png Binary files differnew file mode 100644 index 0000000..781e514 --- /dev/null +++ b/help/en/images/project_file_delete.png diff --git a/help/en/images/project_file_menu.png b/help/en/images/project_file_menu.png Binary files differnew file mode 100644 index 0000000..a2e5c32 --- /dev/null +++ b/help/en/images/project_file_menu.png diff --git a/help/en/images/project_file_protection.png b/help/en/images/project_file_protection.png Binary files differnew file mode 100644 index 0000000..dc632f9 --- /dev/null +++ b/help/en/images/project_file_protection.png diff --git a/help/en/images/project_file_settings.png b/help/en/images/project_file_settings.png Binary files differnew file mode 100644 index 0000000..37ed75f --- /dev/null +++ b/help/en/images/project_file_settings.png diff --git a/help/en/images/project_functions.png b/help/en/images/project_functions.png Binary files differnew file mode 100644 index 0000000..f0c6657 --- /dev/null +++ b/help/en/images/project_functions.png diff --git a/help/en/images/project_functions_content.png b/help/en/images/project_functions_content.png Binary files differnew file mode 100644 index 0000000..ea5d2a9 --- /dev/null +++ b/help/en/images/project_functions_content.png diff --git a/help/en/images/project_functions_content2.png b/help/en/images/project_functions_content2.png Binary files differnew file mode 100644 index 0000000..afbe976 --- /dev/null +++ b/help/en/images/project_functions_content2.png diff --git a/help/en/images/project_functions_menu.png b/help/en/images/project_functions_menu.png Binary files differnew file mode 100644 index 0000000..16796c5 --- /dev/null +++ b/help/en/images/project_functions_menu.png diff --git a/help/en/images/project_functions_menu2.png b/help/en/images/project_functions_menu2.png Binary files differnew file mode 100644 index 0000000..55c9d5a --- /dev/null +++ b/help/en/images/project_functions_menu2.png diff --git a/help/en/images/project_functions_menu3.png b/help/en/images/project_functions_menu3.png Binary files differnew file mode 100644 index 0000000..0ed1d67 --- /dev/null +++ b/help/en/images/project_functions_menu3.png diff --git a/help/en/images/project_functions_search.png b/help/en/images/project_functions_search.png Binary files differnew file mode 100644 index 0000000..d76cac6 --- /dev/null +++ b/help/en/images/project_functions_search.png diff --git a/help/en/images/project_generate_keys.png b/help/en/images/project_generate_keys.png Binary files differnew file mode 100644 index 0000000..54b4385 --- /dev/null +++ b/help/en/images/project_generate_keys.png diff --git a/help/en/images/project_options.png b/help/en/images/project_options.png Binary files differnew file mode 100644 index 0000000..1f634e7 --- /dev/null +++ b/help/en/images/project_options.png diff --git a/help/en/images/project_script.png b/help/en/images/project_script.png Binary files differnew file mode 100644 index 0000000..5b24b42 --- /dev/null +++ b/help/en/images/project_script.png diff --git a/help/en/images/properties_calc.png b/help/en/images/properties_calc.png Binary files differnew file mode 100644 index 0000000..0d19e4a --- /dev/null +++ b/help/en/images/properties_calc.png diff --git a/help/en/images/properties_directory.png b/help/en/images/properties_directory.png Binary files differnew file mode 100644 index 0000000..ce674da --- /dev/null +++ b/help/en/images/properties_directory.png diff --git a/help/en/images/properties_dump.png b/help/en/images/properties_dump.png Binary files differnew file mode 100644 index 0000000..c00b733 --- /dev/null +++ b/help/en/images/properties_dump.png diff --git a/help/en/images/properties_dump_goto.png b/help/en/images/properties_dump_goto.png Binary files differnew file mode 100644 index 0000000..f35a931 --- /dev/null +++ b/help/en/images/properties_dump_goto.png diff --git a/help/en/images/properties_export.png b/help/en/images/properties_export.png Binary files differnew file mode 100644 index 0000000..619a282 --- /dev/null +++ b/help/en/images/properties_export.png diff --git a/help/en/images/properties_import.png b/help/en/images/properties_import.png Binary files differnew file mode 100644 index 0000000..98fd578 --- /dev/null +++ b/help/en/images/properties_import.png diff --git a/help/en/images/properties_resources.png b/help/en/images/properties_resources.png Binary files differnew file mode 100644 index 0000000..b09174c --- /dev/null +++ b/help/en/images/properties_resources.png diff --git a/help/en/images/properties_segments.png b/help/en/images/properties_segments.png Binary files differnew file mode 100644 index 0000000..a48f777 --- /dev/null +++ b/help/en/images/properties_segments.png diff --git a/help/en/images/visual_studio_map.png b/help/en/images/visual_studio_map.png Binary files differnew file mode 100644 index 0000000..b04bd53 --- /dev/null +++ b/help/en/images/visual_studio_map.png diff --git a/help/en/images/watermarks_add.png b/help/en/images/watermarks_add.png Binary files differnew file mode 100644 index 0000000..4ed0ecd --- /dev/null +++ b/help/en/images/watermarks_add.png diff --git a/help/en/images/watermarks_menu.png b/help/en/images/watermarks_menu.png Binary files differnew file mode 100644 index 0000000..97470d3 --- /dev/null +++ b/help/en/images/watermarks_menu.png diff --git a/help/en/images/watermarks_search.png b/help/en/images/watermarks_search.png Binary files differnew file mode 100644 index 0000000..5840691 --- /dev/null +++ b/help/en/images/watermarks_search.png diff --git a/help/en/images/watermarks_setup.png b/help/en/images/watermarks_setup.png Binary files differnew file mode 100644 index 0000000..a074978 --- /dev/null +++ b/help/en/images/watermarks_setup.png diff --git a/help/en/images/weblm_1.png b/help/en/images/weblm_1.png Binary files differnew file mode 100644 index 0000000..26bdaee --- /dev/null +++ b/help/en/images/weblm_1.png diff --git a/help/en/images/weblm_2.png b/help/en/images/weblm_2.png Binary files differnew file mode 100644 index 0000000..6791edc --- /dev/null +++ b/help/en/images/weblm_2.png diff --git a/help/en/info.htm b/help/en/info.htm new file mode 100644 index 0000000..b8b6e35 --- /dev/null +++ b/help/en/info.htm @@ -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> diff --git a/help/en/info_calc.htm b/help/en/info_calc.htm new file mode 100644 index 0000000..5866395 --- /dev/null +++ b/help/en/info_calc.htm @@ -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> diff --git a/help/en/info_directories.htm b/help/en/info_directories.htm new file mode 100644 index 0000000..eabe5ca --- /dev/null +++ b/help/en/info_directories.htm @@ -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> diff --git a/help/en/info_dump.htm b/help/en/info_dump.htm new file mode 100644 index 0000000..468e128 --- /dev/null +++ b/help/en/info_dump.htm @@ -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> diff --git a/help/en/info_exports.htm b/help/en/info_exports.htm new file mode 100644 index 0000000..c5b3d31 --- /dev/null +++ b/help/en/info_exports.htm @@ -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> diff --git a/help/en/info_imports.htm b/help/en/info_imports.htm new file mode 100644 index 0000000..e38d478 --- /dev/null +++ b/help/en/info_imports.htm @@ -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> diff --git a/help/en/info_resources.htm b/help/en/info_resources.htm new file mode 100644 index 0000000..6eabd8d --- /dev/null +++ b/help/en/info_resources.htm @@ -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> diff --git a/help/en/info_segments.htm b/help/en/info_segments.htm new file mode 100644 index 0000000..60a80cb --- /dev/null +++ b/help/en/info_segments.htm @@ -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>
\ No newline at end of file diff --git a/help/en/main_menu.htm b/help/en/main_menu.htm new file mode 100644 index 0000000..895e79d --- /dev/null +++ b/help/en/main_menu.htm @@ -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> diff --git a/help/en/main_window.htm b/help/en/main_window.htm new file mode 100644 index 0000000..22ccb2b --- /dev/null +++ b/help/en/main_window.htm @@ -0,0 +1,42 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>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> diff --git a/help/en/manager/activation.htm b/help/en/manager/activation.htm new file mode 100644 index 0000000..415790e --- /dev/null +++ b/help/en/manager/activation.htm @@ -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> diff --git a/help/en/manager/activation/api.htm b/help/en/manager/activation/api.htm new file mode 100644 index 0000000..4a75ad2 --- /dev/null +++ b/help/en/manager/activation/api.htm @@ -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> diff --git a/help/en/manager/activation/vmprotect.htm b/help/en/manager/activation/vmprotect.htm new file mode 100644 index 0000000..cc8f8aa --- /dev/null +++ b/help/en/manager/activation/vmprotect.htm @@ -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> diff --git a/help/en/manager/activation/weblm.htm b/help/en/manager/activation/weblm.htm new file mode 100644 index 0000000..cd68ed6 --- /dev/null +++ b/help/en/manager/activation/weblm.htm @@ -0,0 +1,43 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>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> diff --git a/help/en/manager/features.htm b/help/en/manager/features.htm new file mode 100644 index 0000000..a2bd877 --- /dev/null +++ b/help/en/manager/features.htm @@ -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> diff --git a/help/en/manager/howitworks.htm b/help/en/manager/howitworks.htm new file mode 100644 index 0000000..3a8f3f6 --- /dev/null +++ b/help/en/manager/howitworks.htm @@ -0,0 +1,42 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>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> diff --git a/help/en/manager/index.htm b/help/en/manager/index.htm new file mode 100644 index 0000000..81585e9 --- /dev/null +++ b/help/en/manager/index.htm @@ -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> diff --git a/help/en/manager/keygen/algorithms.htm b/help/en/manager/keygen/algorithms.htm new file mode 100644 index 0000000..e1a50c9 --- /dev/null +++ b/help/en/manager/keygen/algorithms.htm @@ -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> diff --git a/help/en/manager/keygen/index.htm b/help/en/manager/keygen/index.htm new file mode 100644 index 0000000..097299f --- /dev/null +++ b/help/en/manager/keygen/index.htm @@ -0,0 +1,70 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>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> diff --git a/help/en/manager/keygen/keygen_dll.htm b/help/en/manager/keygen/keygen_dll.htm new file mode 100644 index 0000000..d568180 --- /dev/null +++ b/help/en/manager/keygen/keygen_dll.htm @@ -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> diff --git a/help/en/manager/keygen/keygen_net.htm b/help/en/manager/keygen/keygen_net.htm new file mode 100644 index 0000000..e67b4a2 --- /dev/null +++ b/help/en/manager/keygen/keygen_net.htm @@ -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> diff --git a/help/en/manager/keygen/keygen_php.htm b/help/en/manager/keygen/keygen_php.htm new file mode 100644 index 0000000..9da8d36 --- /dev/null +++ b/help/en/manager/keygen/keygen_php.htm @@ -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> diff --git a/help/en/manager/keygen/serial_format.htm b/help/en/manager/keygen/serial_format.htm new file mode 100644 index 0000000..9b502ea --- /dev/null +++ b/help/en/manager/keygen/serial_format.htm @@ -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> diff --git a/help/en/manager/licenses.htm b/help/en/manager/licenses.htm new file mode 100644 index 0000000..1eca870 --- /dev/null +++ b/help/en/manager/licenses.htm @@ -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> diff --git a/help/en/manager/usage/api.htm b/help/en/manager/usage/api.htm new file mode 100644 index 0000000..b227735 --- /dev/null +++ b/help/en/manager/usage/api.htm @@ -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> diff --git a/help/en/manager/usage/index.htm b/help/en/manager/usage/index.htm new file mode 100644 index 0000000..50f55d1 --- /dev/null +++ b/help/en/manager/usage/index.htm @@ -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> diff --git a/help/en/manager/usage/step11_app.htm b/help/en/manager/usage/step11_app.htm new file mode 100644 index 0000000..59bee08 --- /dev/null +++ b/help/en/manager/usage/step11_app.htm @@ -0,0 +1,53 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>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> diff --git a/help/en/manager/usage/step12_code.htm b/help/en/manager/usage/step12_code.htm new file mode 100644 index 0000000..7281851 --- /dev/null +++ b/help/en/manager/usage/step12_code.htm @@ -0,0 +1,79 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>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> diff --git a/help/en/manager/usage/step13_flags.htm b/help/en/manager/usage/step13_flags.htm new file mode 100644 index 0000000..d6c6469 --- /dev/null +++ b/help/en/manager/usage/step13_flags.htm @@ -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> diff --git a/help/en/manager/usage/step14_name.htm b/help/en/manager/usage/step14_name.htm new file mode 100644 index 0000000..5868070 --- /dev/null +++ b/help/en/manager/usage/step14_name.htm @@ -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> diff --git a/help/en/manager/usage/step15_exp.htm b/help/en/manager/usage/step15_exp.htm new file mode 100644 index 0000000..5d7628d --- /dev/null +++ b/help/en/manager/usage/step15_exp.htm @@ -0,0 +1,55 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>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> diff --git a/help/en/manager/usage/step16_time.htm b/help/en/manager/usage/step16_time.htm new file mode 100644 index 0000000..58e3a13 --- /dev/null +++ b/help/en/manager/usage/step16_time.htm @@ -0,0 +1,62 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>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> diff --git a/help/en/manager/usage/step17_maxbuild.htm b/help/en/manager/usage/step17_maxbuild.htm new file mode 100644 index 0000000..3eab065 --- /dev/null +++ b/help/en/manager/usage/step17_maxbuild.htm @@ -0,0 +1,69 @@ +<!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.7: Limiting the free upgrades period</title> +</head> + +<body> + <h1>Step 1.7: Limiting the free upgrades period</h1><strong>How it works</strong> + + <p>When VMProtect protects an application it records the date. The licensing system treats this date as a build date of the application. And you can put into a serial number the maximum build date this serial number can work with. Therefore, if you put the current date plus one year to the serial number, it will work with all versions of your programs you will be releasing in a year. A version you release one year and a day after will not work with this serial number, and a user will have a choice: use older version of your program or purchase a new key to work with the latest version of the program for one more year.</p><strong>Let's try it</strong> + + <p>Put the line formatted as MaxBuildDate=YYYYMMDD into the ini-file:</p> + <pre class="code">MaxBuildDate=20000101 +</pre> + + <p>In the test mode, the licensing system treats today as the build date, so it is important that the date specified in this line already passed. That is, the maximum date is yesterday. Modify the code of the <strong>main()</strong> function so that it looked like this:</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) + { + VMProtectSerialNumberData sd = {0}; + VMProtectGetSerialNumberData(&sd, sizeof(sd)); + printf("max. build date: y = %d, m = %d, d = %d\n", sd.dtMaxBuild.wYear, sd.dtMaxBuild.bMonth, sd.dtMaxBuild.bDay); + printf("please register!\n"); + return 0; + } + + printf("I'm registered\n"); + + return 0; +} +</pre> + + <p>Then, upon program run you should see the following:</p> + <pre class="code">state = SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED +max. build date: y = 2000, m = 1, d = 1 +please register! +</pre> + + <p>By replacing the date in the ini-file to today or tomorrow, we end up with the "working" program:</p> + <pre class="code">state = 0 +I'm registered +</pre> + + <p>Remove the MaxBuildDate=... line from the ini-file so that it would not influence our further steps.</p><br /> + <a href="step18_blacklist.htm">Next step</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/manager/usage/step18_blacklist.htm b/help/en/manager/usage/step18_blacklist.htm new file mode 100644 index 0000000..c0ae408 --- /dev/null +++ b/help/en/manager/usage/step18_blacklist.htm @@ -0,0 +1,55 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Step 1.8: Serial numbers in the black list</title> +</head> + +<body> + <h1>Step 1.8: Serial numbers in the black list</h1> + + <p>A serial number marked in VMProtect as "blocked" should not be accepted by the licensing system. When you will rebuild your application next time, VMProtect will add the hash of blacklisted serial numbers to the protected application. As a result, the licensing system of the application will decline these serial numbers in the future.</p> + + <p>Firstly, lets minimize the contents of the <strong>main()</strong> function:</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); + + return 0; +} +</pre> + + <p>Now, run the program and make sure the licensing system do accept our serial number:</p> + <pre class="code">state = 0 +</pre> + + <p>Now, add this serial number to the black list of the licensing system. Add the following line to the ini-file:</p> + <pre class="code">BlackListedSerialNumber=Xserialnumber +</pre> + + <p>And run the program again:</p> + <pre class="code">state = SERIAL_STATE_FLAG_BLACKLISTED +</pre> + + <p>Should we inform a user that the serial number he or she enters is blacklisted? It is up to you. You can simply tell the serial number is incorrect or inform the user that the key is compromised. The licensing system simply informs the program about the fact of using the blacklisted serial number.</p><br /> + <a href="step19_hwid.htm">Next step</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/manager/usage/step19_hwid.htm b/help/en/manager/usage/step19_hwid.htm new file mode 100644 index 0000000..5fcb599 --- /dev/null +++ b/help/en/manager/usage/step19_hwid.htm @@ -0,0 +1,98 @@ +<!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.9: Hardware lock</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + p.c1 {color:red;} + /*]]>*/ + </style> +</head> + +<body> + <h1>Step 1.9: Hardware lock</h1><strong>Receiving a hardware identifier</strong> + + <p>Before we lock to hardware, we must receive a hardware identifier. The identifier is put into a serial number, and when the number is passed to the licensing system, it checks if identifiers match. So, first we need to receive the identifier of our hardware. Let's reduce the + <strong>main()</strong> function to the bare minimum:</p> + <pre class="code">int main(int argc, char **argv) +{ + int nSize = VMProtectGetCurrentHWID(NULL, 0); + char *buf = new char[nSize]; + VMProtectGetCurrentHWID(buf, nSize); + printf("HWID: %s\n", buf); + delete [] buf; + return 0; +} +</pre> + + <p>By running the program, we receive a default test hardware identifier:</p> + <pre class="code">HWID: myhwid +</pre> + + <p>To change the identifier, add the following line to the ini-file:</p> + <pre class="code">MyHWID=test +</pre> + + <p>If we run the program afterwards, we can see the system thinks "test" is a hardware identifier of our PC:</p> + <pre class="code">HWID: test +</pre> + + <p class="c1"><strong>Important!</strong> The program will display the real hardware identifier only after it is processed with VMProtect.</p><br /> + <strong>Hardware-locked serial number</strong> + + <p>To lock our test serial number to hardware, we should add one more line to the ini-file. This time we define the identifier that is "put into" the serial number:</p> + <pre class="code">KeyHWID=test +</pre> + + <p>Then we complicate <strong>main()</strong> back a bit. Now it will pass a serial number and analyze the result it gets:</p> + <pre> +int main(int argc, char **argv) +{ + int nSize = VMProtectGetCurrentHWID(NULL, 0); + char *buf = new char[nSize]; + VMProtectGetCurrentHWID(buf, nSize); + printf("HWID: %s\n", buf); + delete [] buf; + + char *serial = "Xserialnumber"; + int res = VMProtectSetSerialNumber(serial); + print_state(res); + return 0; +} +</pre> + + <p>After running the code we will see the following result:</p> + <pre class="code">HWID: test +state = 0 +</pre> + + <p>The licensing system has compared the current hardware identifier with the one written in the serial number. Identifiers are equal, so the + <strong>VMProtectSetSerialNumber()</strong> function returned 0 - the serial number matches.</p> + + <p>Now let's try to "run" our program on another hardware. We simply change the value of the MyHWID parameter in the ini-file from "test" to "new test". Run the program again:</p> + <pre class="code">HWID: new test +state = SERIAL_STATE_FLAG_BAD_HWID +</pre> + + <p>This time the licensing system returned the + SERIAL_STATE_FLAG_BAD_HWID flag, which means the real hardware identifier and the one stored in the serial number are not matching. The current identifier we see on the screen is "new test", while the serial number holds "test". If we change the KeyHWID parameter in the ini-file to "new test" we can make our serial number work on this "hardware" too.</p><br /> + <a href="step1A_userdata.htm">Next step</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/manager/usage/step1A_userdata.htm b/help/en/manager/usage/step1A_userdata.htm new file mode 100644 index 0000000..16209ad --- /dev/null +++ b/help/en/manager/usage/step1A_userdata.htm @@ -0,0 +1,65 @@ +<!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.10: User data</title> +</head> + +<body> + <h1>Step 1.10: User data</h1> + + <p>A serial number can hold up to 255 bytes of arbitrary data that the licensing system passes to the program as they are. The data can hold any additional information about the sale, data required for operation of the full version or something else. Let's modify our + <strong>main()</strong> function so that it would read data from a serial number and display them on the screen:</p> + <pre class="code">int main(int argc, char **argv) +{ + char *serial = "Xserialnumber"; + int res = VMProtectSetSerialNumber(serial); + print_state(res); + if (res) return 0; + + VMProtectSerialNumberData sd = {0}; + VMProtectGetSerialNumberData(&sd, sizeof(sd)); + printf("Serial number has %d byte(s) of data\n", sd.nUserDataLength); + for (int i = 0; i < sd.nUserDataLength; i++) + printf("%02X ", sd.bUserData[i]); + printf("\n"); + return 0; +} +</pre> + + <p>We also reduce the Ini-file to this:</p> + <pre class="code">[TestLicense] +AcceptedSerialNumber=Xserialnumber +</pre> + + <p>Now, we run the program and make sure our serial number works well, but doesn't contain any data:</p> + <pre class="code">state = 0 +Serial number has 0 byte(s) of data +</pre> + + <p>To add new user data into the serial number, we need to create the UserData variable in the ini-file and assign data to it in the HEX format. Symbols must go in pairs, that is the length of a line must be a multiple of 2. Like this:</p> + <pre class="code">UserData=010203A0B0C0D0E0 +</pre> + + <p>In this case, if we runthe program we will receive the following result:</p> + <pre class="code">state = 0 +Serial number has 8 byte(s) of data +01 02 03 A0 B0 C0 D0 E0 +</pre><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/manager/usage/step21_src.htm b/help/en/manager/usage/step21_src.htm new file mode 100644 index 0000000..b1cfa0b --- /dev/null +++ b/help/en/manager/usage/step21_src.htm @@ -0,0 +1,98 @@ +<!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 2.1: Creating a new protected application</title> +</head> + +<body> + <h1>Step 2.1: Creating a new protected application</h1> + + <p>At the first stage we made several simple apps to test the API of the licensing system. Now, on the second stage we'll create just one application. It will also be a console app with the <strong>foo()</strong> function working only in the registered version. Here is the code of our test application:</p> + <pre class="code">#include <windows.h> +#include <stdio.h> +#include "VMProtectSDK.h" + +#define PRINT_HELPER(state, flag) if (state & flag) printf("%s ", #flag) +void print_state(INT state) +{ + if (state == 0) + { + printf("state = 0\n"); + return; + } + + printf("state = "); + PRINT_HELPER(state, SERIAL_STATE_FLAG_CORRUPTED); + PRINT_HELPER(state, SERIAL_STATE_FLAG_INVALID); + PRINT_HELPER(state, SERIAL_STATE_FLAG_BLACKLISTED); + PRINT_HELPER(state, SERIAL_STATE_FLAG_DATE_EXPIRED); + PRINT_HELPER(state, SERIAL_STATE_FLAG_RUNNING_TIME_OVER); + PRINT_HELPER(state, SERIAL_STATE_FLAG_BAD_HWID); + PRINT_HELPER(state, SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED); + printf("\n"); +} + +char *read_serial(const char *fname) +{ + FILE *f; + if (0 != fopen_s(&f, fname, "rb")) return NULL; + fseek(f, 0, SEEK_END); + int s = ftell(f); + fseek(f, 0, SEEK_SET); + char *buf = new char[s + 1]; + fread(buf, s, 1, f); + buf[s] = 0; + fclose(f); + return buf; +} + +// The foo() method is very short, but we need it to be an individual function +// so we asked the compiler to not compile it inline +__declspec(noinline) void foo() +{ + printf("I'm foo!\n"); +} + +int main(int argc, char **argv) +{ + char *serial = read_serial("serial.txt"); + int res = VMProtectSetSerialNumber(serial); + delete [] serial; + if (res) + { + printf("serial number is bad\n"); + print_state(res); + return 0; + } + printf("serial number is correct, calling foo()\n"); + foo(); + printf("done\n"); + return 0; +} +</pre> + + <p>Compile the program without the debug information, but in the linker settings we enable creating of the MAP-file - we will need it to work with VMProtect. After we run the program, we should see the following text:</p> + <pre class="code">serial number is bad +state = SERIAL_STATE_FLAG_INVALID +</pre> + + <p>Currently, the licensing system still works in the test mode, because the file wasn't processed by VMProtect and doesn't contain a licensing module in it. On the <a href= + "step22_vmp.htm">next step</a> we will create a VMProtect project and will try to protect our application.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/manager/usage/step22_vmp.htm b/help/en/manager/usage/step22_vmp.htm new file mode 100644 index 0000000..3457643 --- /dev/null +++ b/help/en/manager/usage/step22_vmp.htm @@ -0,0 +1,37 @@ +<!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 2.2: Creating a VMProtect protection project</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Step 2.2: Creating a VMProtect protection project</h1> + + <p>Now, as our test app is ready, compiled and has an assigned MAP-file in the same folder, we can run VMProtect + Ultimate and open the executable file. We need to add two functions to the project: _main (this is how Visual Studio renamed our main()) and foo(). Both functions can be seen in the list of functions in the "Functions" section in VMProtect.</p> + + <!-- <p class="c1"><br /><img src="../../images/real_project_functions.png" alt="Дерево проекта" /></p> --> + + <p>Then, we need to initialize the licensing system. + Open the "Licenses" section and create a pair of keys with the length of 2048 bit.</p><br /> + <a href="step23_product.htm">Next step</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/manager/usage/step23_product.htm b/help/en/manager/usage/step23_product.htm new file mode 100644 index 0000000..d7faa7a --- /dev/null +++ b/help/en/manager/usage/step23_product.htm @@ -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>Step 2.3: First start of the protected product</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Step 2.3: First start of the protected product</h1> + + <p>The licensing system is initialized, so let's try to compile the VMProtect project and run the protected file. After running it from the command line we will receive the following message:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is bad +state = SERIAL_STATE_FLAG_INVALID +</pre> + + <p>If you run depends.exe and can see that our protected executable file doesn't use the VMProtectSDK.dll any more. This means the licensing module is already built into the program. You can also review the list of used DLL from VMProtect, in the "Details | Imports" section.</p> + + <p><img src="../../images/depends.png" /></p> + + <p>Our protected program reads a serial number from the serial.txt file. Since there is no such file yet, the licensing module receives an empty serial number that is interpreted as incorrect. + Now we switch to the "Licenses" section and generate a serial number. + This procedure is described <a href= + "../licenses.htm">here</a> in all details, and now we merely create a simple serial number without any limitations.</p> + + <p><img src="../../images/project_add_license.png" /></p> + + <p>Then, we copy the serial number (select the "Serial number" field in the license properties and precc Ctrl+C), create a file named serial.txt in the same folder as the protected application, and paste the copied number there. Now, if we run our application we will see this:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is correct, calling foo() +I'm foo +done +</pre> + + <p>The licensing system checked the serial number and found it correct. On the <a href="step24_test.htm">next step</a> we will try to apply some limitations will watch the results.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/manager/usage/step24_test.htm b/help/en/manager/usage/step24_test.htm new file mode 100644 index 0000000..90cf607 --- /dev/null +++ b/help/en/manager/usage/step24_test.htm @@ -0,0 +1,65 @@ +<!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 2.4: Testing the results</title> +</head> + +<body> + <h1>Step 2.4: Testing the results</h1><strong>Serial number expiration date</strong> + + <p>Let's create another serial number with a certain expiration date. For example, 2005. This date has already passed and therefore our serial number must be incorrect. Switch to the "Licenses" section and click the "Add license" button on the toolbar. In the "Add license" dialog window enable the "Expiration date" option and specify September 30, 2005. + Create the serial number, copy it and paste to serial.txt, then run the program:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is bad +state = SERIAL_STATE_FLAG_DATE_EXPIRED +</pre> + + <p>the licensing module returned the "serial number is expired" flag. Now, put the working serial number back to the serial.txt file and make sure the licensing module accepts it perfectly.</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is correct, calling foo() +I'm foo +done +</pre><strong>Adding a serial number to the black list</strong> + + <p>Let's imagine our "good" serial number has leaked to the Internet and is compromised now. We need to block it so that it will not work in future versions of the program. To do this, select the serial number in the list and set the "Blocked" property in the main panel to "Yes". For now, the serial number is not yet blocked, but when you protect the file again, the application will not accept this number any more. Let's make sure this is really so. If we run our program now, it should accept the blocked serial number without any problems, because this is the old version that knows nothing about the blocked number:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is correct, calling foo() +I'm foo +done +</pre> + + <p>Now we make a copy of our program and name it as + "dummy_app1.vmp.exe", then open VMProtect and protect the application again. Then run this new version:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is bad +state = SERIAL_STATE_FLAG_BLACKLISTED +</pre> + + <p>And the old version again, for comparison:</p> + <pre class="code">C:\test>dummy_app1.vmp.exe +serial number is correct, calling foo() +I'm foo +done +</pre> + + <p>The older version doesn't know about the blocked serial number and works as before.</p><br /> + <br /><p>On the <a href= + "step25_codelock.htm">next step</a> we will try to lock the code to a serial number. But before we proceed, unblock the serial number and reapply protection in VMProtect to the application to make it accept this serial number again. Or simply create a new license.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/manager/usage/step25_codelock.htm b/help/en/manager/usage/step25_codelock.htm new file mode 100644 index 0000000..5fe08bb --- /dev/null +++ b/help/en/manager/usage/step25_codelock.htm @@ -0,0 +1,69 @@ +<!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 2.5: Locking the code to a serial number</title> + <style type="text/css"> +/*<![CDATA[*/ + p.c2 {color:red;} + span.c1 {background-color:yellow;} + /*]]>*/ + </style> +</head> + +<body> + <h1>Step 2.5: Locking the code to a serial number</h1> + + <p>One of the most common ways to crack programs is to locate the place where the serial number is checked and the nearby conditional jump that follows it. If the serial number is correct, the execution of the program goes one way, if not - the other way. A hacker locates this jump and replaces it with a jump to the "correct" way. Let's "crack" our test program using this technique. Directly in the source code, of course. Let's "switch off" our conditional jump:</p> + <pre class="code">char *serial = read_serial("serial.txt"); +int res = VMProtectSetSerialNumber(serial); +delete [] serial; +if (<span class="c1">false &&</span> res) +{ +</pre> + + <p>Now, our program accepts any serial number and works normally. Of course, if the file is protected with VMProtect, even an experienced hacker would spend months to locate and modify the conditional jump as we did it. And taking into account the program check the serial number multiple times and under different conditions, even such a simple check is quite secure. But let's go further.</p><strong>locking the code to a serial number</strong> + + <p class="c2"><strong>Important!</strong> The demo-version of VMProtect has a limitation on the number of processed function: only one function is processed. So if you use the demo-version, you should only include the foo() function to the project, otherwise the demo-version of VMProtect can choose the main() function and locking to a serial number will not work.</p> + + <p>The licensing system of VMProtect allows you to lock the code of one or more functions to a serial number so, that they will not work without the correct serial number provided. the body of the function is virtualized, then encrypted and can only be decrypted with the correct serial number. This means, even if a hacker finds and fixes the conditional jump in the serial number check, functions locked to the serial number still will not work. Let's try this. In the "Functions" section choose the <strong>foo()</strong> function and at the right panel change the "Lock to Serial Number" option to "Yes".</p> + + <p><img src="../../images/lock_to_serial.png" /></p> + + <p>Then, protect the application. Since, we already "hacked" it, put an arbitrary text into the serial.txt file and run the application. The following text appears in the console:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is correct, calling foo() +</pre> + + <p>This means, the hacker "fixed" the conditional jump, and the program runs on the "correct" way. But when the + <strong>foo()</strong> is invoked, the program displays a message:</p> + + <p><img src="../../images/codelock_error.png" /></p> + + <p>Since we locked the <strong>foo()</strong> function to the serial number, and the hacker does not have it, an attempt to decrypt the code of the function resulted in malfunction and inability to continue execution of the program. When "OK" is pressed, the program shuts down and the "done" message is never displayed in the console. + </p><strong>What should be locked to a serial number?</strong> + + <p>It makes sense to lock to a serial number a function that should only run in the registered version of the program. Since locking requires virtualization, you should take into account some loss of performance. For instance, if a text editor does not allow saving result in a demo-version, you can lock the save document function to a serial number. If during its operation this function calls other functions, it is not necessary to lock them too, as they won't be of any use without the main function.</p> + + <p>You should also remember that invoking the locked function without the serial number leads to program shut down, without a chance to save result of the work. that is why you should thoroughly test the application to make sure it doesn't calls such functions in the trial mode. In the above example, the text editor must disable the "Save" command in the demo mode and do not react on Ctrl+S shortcut as well. Of course, it also shouldn't ask to save the document on exit too. If you don't pay attention to this, a user may be disappointed with your "buggy" demo-version.</p><strong>Locking to a serial number and invalid serial numbers</strong> + + <p>When the <strong>VMProtectSetSerialNumber()</strong> function is invoked, the licensing module checks the serial number passed to this function. Encrypted fragments of the code are only executed if the serial number was absolutely correct at the moment of check - not blacklisted, with the correct hardware identifier, not expired and so on. In this case all encrypted procedures are executed until the application is closed, or <strong>VMProtectSetSerialNumber()</strong> is invoked again.</p> + + <p>Some limitations can "trigger" during execution of the program: for example, the operating time of the program may expire or the serial number expiration date comes. In this case the licensing module still encrypts and executes functions locked to the serial number. This is so, because it is hard for the protected application to detect the moment those limitations trigger and change the behaviour accordingly (block corresponding menu items and so on). If the licensing module suddenly stops execution of the code fragments that are locked to the serial number, this will very likely lead to malfunction of the application. That is why the decision is made when a serial number is set, and the corresponding execution mode is selected.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/menu_edit.htm b/help/en/menu_edit.htm new file mode 100644 index 0000000..4429214 --- /dev/null +++ b/help/en/menu_edit.htm @@ -0,0 +1,60 @@ +<!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>"Edit" menu</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + /*]]>*/ + </style> +</head> + +<body> + <h1>"Edit" menu</h1> + <br /><img src= + "images/menu_edit.png" alt="Image" /> + + <ul> + <!-- + <li><strong>Отменить</strong> - отменить последние + исправления;</li> + + <li><strong>Повторить</strong> - восстановить последние + отмененные исправления;</li> + + <li><strong>Вырезать</strong> - переместить выделенные данные в + буфер обмена;</li> + + <li><strong>Копировать</strong> - скопировать выделенные данные + в буфер обмена;</li> + + <li><strong>Вставить</strong> - вставить из буфера обмена;</li> +--> + <li><strong>Delete</strong> - delete the selected element;</li> + + <li><strong>Search</strong> - search for a given text string; + <p><img src="images/expert_find.png" alt="Search" /></p> + </li> + + <li><a name="Goto" id="Goto"><strong>Go To Address</strong></a> - go to the specified address in the protected application. + You can go to a specified address or to the address selected in the "Functions" list. You can also search the desired object by name; + <p><br /><img src="images/properties_dump_goto.png" alt="Image" /></p> + </li> + </ul> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html>
\ No newline at end of file diff --git a/help/en/menu_file.htm b/help/en/menu_file.htm new file mode 100644 index 0000000..8792fcb --- /dev/null +++ b/help/en/menu_file.htm @@ -0,0 +1,50 @@ +<!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>"File" menu</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + /*]]>*/ + </style> +</head> + +<body> + <h1>"File" menu</h1> + <p><img src="images/menu_file.png" /></p> + + <ul> + <li><a name="Open" id="Open"><strong>Open</strong></a> - + choose an executable you want to protect, or a project file + (*.vmp). You can also select a file to open from the list of previously protected applications shown in the File menu. You can also bring up the open dialog with the corresponding button on the toolbar <img src="images/button_open.png" />. Finally, you can drag-n-drop the file you need to the VMProtect window;</li> + + <li><strong>Save Project</strong> - save application protection settings to a "*.vmp" file. + Project settings file is saved to the same folder where the executable of the protected application is located. + Saving is also available with the toolbar button <img src="images/button_save.png" />;</li> + + <li><a name="SaveProjectAs" id= + "SaveProjectAs"><strong>Save Project As...</strong></a> - + save the project file to a file with a new name;</li> + + <li><strong>Close</strong> - finish working with the current project;</li> + + <li><strong>Exit</strong> - close VMProtect.</li> + </ul> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html>
\ No newline at end of file diff --git a/help/en/menu_help.htm b/help/en/menu_help.htm new file mode 100644 index 0000000..fb1167a --- /dev/null +++ b/help/en/menu_help.htm @@ -0,0 +1,38 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>"Help" menu</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + /*]]>*/ + </style> +</head> + +<body> + <h1>"Help" menu</h1> + <p><img src="images/menu_help.png" /></p> + + <ul> + <li><strong>Home Page</strong> - open VMProtect homepage;</li> + <li><strong>Contents</strong> - open VMProtect help file;</li> + <li><strong>About...</strong> - see general information about VMProtect.</li> + </ul> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/menu_project.htm b/help/en/menu_project.htm new file mode 100644 index 0000000..d46beb0 --- /dev/null +++ b/help/en/menu_project.htm @@ -0,0 +1,57 @@ +<!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>"Project" menu</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + /*]]>*/ + </style> +</head> + +<body> + <h1>"Project" menu</h1> + <p><img src="images/menu_project.png" /></p> + + <ul> + <li><strong>Add function</strong> - add a new function to the list of protected objects. You can specify the exact address of a function, or find that function by name: + <p><img src="images/project_add_function.png"/></p></li> + <li><strong>Add folder</strong> - add a folder to the project: + <p><img src="images/project_add_folder.png" /></p> + + <p>Usage of folders do not impacts protection of objects inside. Folders are only used to arrange protected objects in the project tree. You can move objects into a folder with simple drag-n-drop;</p></li> + + <li><strong>Add license</strong> - add a license to the project: + <p><img src="images/project_add_license.png" /></p> + + <p>This command adds a new user license and generate a license key based on entered user data: name, e-mail, date, order id and others. You can write this information inside the key, as well as to limit functionality of the license. For example, allow certain number of executions or specify an expiry date for the key.<br /> + To add a license you should first generate a pair of keys:</p> + <p><img src="images/project_generate_keys.png" /></p></li> + + <li><strong>Export Key Pair</strong> - exports project keys to the specified format of the <a href="manager/keygen/index.htm">key generator</a>: + <p><img src="images/export_keys.png" /></p></li> + + <li><strong>Import</strong> - imports a license from a serial number or from another project and adds it to the current project.</li> + + <li><strong>Compile</strong> - compile the protected application with the current protection settings. To compile the project, you can also click the toolbar button: <img src="images/button_compilation.png" />.</li> + + <li><strong>Execute</strong> - executes the protected application. Original/protected executable of the application can be started with the button on the toolbar: <img src="images/button_execute.png" />. The down arrow allows you to specify command line parameters for execution.</li> + </ul> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html>
\ No newline at end of file diff --git a/help/en/menu_tools.htm b/help/en/menu_tools.htm new file mode 100644 index 0000000..ae2db44 --- /dev/null +++ b/help/en/menu_tools.htm @@ -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>"Tools" menu</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + /*]]>*/ + </style> +</head> + +<body> + + <h1>"Tools" menu</h1> + + <p><img src="images/menu_tools.png" /></p> + + <ul> + <li><strong>Watermarks</strong> - brings up the <a href="watermarks.htm">Watermarks</a> dialog window: + <p><img src="images/watermarks_setup.png" /></p></li> + <li><strong>Preferences</strong> - brings up the Preferences window of the program: + <p><img src="images/preferences.png" /></p></li> + </ul> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/mode_console.htm b/help/en/mode_console.htm new file mode 100644 index 0000000..5319080 --- /dev/null +++ b/help/en/mode_console.htm @@ -0,0 +1,56 @@ +<!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>Console version</title> +</head> + +<body> + <h1>Console version</h1> + + <p>After you created a project in the <a href="main_window.htm">GUI + mode</a> you can use the console version + (VMProtect_Con.exe). You can execute it as follows:</p> + + <p><strong>VMProtect_Con File [Output File] [-pf Project File] + [-sf Script File] [-lf Licensing Parameters File] [-bd Build Date (yyyy-mm-dd)] [-wm Watermark Name] + [-we]</strong></p> + + <ul> + <li><strong>File</strong> - the file name of the executable you want to protect (*.exe, *.dll and so on), or the file name of a (*.vmp) project. If a project file name is specified, the file name of the executable is taken from the project file.</li> + + <li><strong>Output File</strong> - the file name and path to the protected file that should be created after processing the original file. If this parameter is not set, the value is taken from the project file.</li> + + <li><strong>Project File</strong> - the file name and path to the project file created in the + <a href="main_window.htm">GUI mode</a>. If the parameter is not set, the program searches for a *.vmp file in the folder of the executable.</li> + + <li><strong>Script file</strong> - the file name of the + <a href="script.htm">script</a> the protected file is processed with. If the parameter is not set, the script from the current project file is used.</li> + + <li><strong>Licensing Parameters File</strong> - the name of a file containing <a href="manager/licenses.htm">licensing parameters</a>. + If this parameter is not set, licensing parameters are taken from the current project file.</li> + + <li><strong>Build Date</strong> - Application build date in the following format: "yyyy-mm-dd". If this parameter is not set, the current date is used. + The build date is inscribed into the protected application and is used by the licensing system to check serial numbers against the "<a href="manager/licenses.htm#AddLicense">Maximum build date</a>" field.</li> + + <li><strong>Watermark Name</strong> - the name of a + <a href="watermarks.htm">watermark</a> inserted into the protected file. If the name of a watermark is not set, the watermark specified in the project settings is used.</li> + + <li><strong>we</strong> - when this parameter is set, all warnings are displayed as errors.</li> + </ul><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/project.htm b/help/en/project.htm new file mode 100644 index 0000000..743eefe --- /dev/null +++ b/help/en/project.htm @@ -0,0 +1,34 @@ +<!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>"Project" section</title> +</head> + +<body> + <h1>"Project" section</h1> + <p><img src="images/project_functions.png" /></p> + + The "Project" section contains the following subsections: + <ul><li><a href="project_functions.htm">Functions for Protection</a> - allows selecting objects for protection + <li><a href="manager/licenses.htm">Licenses</a> - allows managing licenses and serial numbers</li> + <li><a href="project_files.htm">Files</a> - allows including additional data files or DLL to the protected EXE file</li> + <li><a href="project_script.htm">Script</a> - allows enhancing protection capabilities by means of the built-in LUA script language</li> + <li><a href="project_options.htm">Options</a> - allows configuring application protection parameters</li> + </ul> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/project_files.htm b/help/en/project_files.htm new file mode 100644 index 0000000..ff6209f --- /dev/null +++ b/help/en/project_files.htm @@ -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>"Files" section</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>"Files" section</h1> + + <p>The "Files" section allows the developer to include to the protected EXE file additional data it requires for operation such as: images, data files, text resources and dynamically linked libraries. During execution of the protected EXE file, all types of data including DLL are loaded from memory of the process directly, bypassing writing of these data to the disk.</p> + <p><img src="images/project_file_protection.png" /></p> + + <p>The <strong>Add File</strong> toolbar button allows adding a new file to the project. You can also add a new file with the context menu:</p> + <p><img src="images/project_file_menu.png" /></p> + + <p>To adjust properties of the selected file, select it in the left list and edit its title, file name or properties.</p> + <p><img src="images/project_file_settings.png" /></p> + + <p>To remove a file from the list of protected objects, right-click it with the mouse and choose "Delete", or simply select it and press Del.</p> + <p><img src="images/project_file_delete.png" /></p> + <p>By right-clicking a section name, you can exclude the file from compiling. Compilation exclusions are saved to the project file.</p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/project_functions.htm b/help/en/project_functions.htm new file mode 100644 index 0000000..3483287 --- /dev/null +++ b/help/en/project_functions.htm @@ -0,0 +1,97 @@ +<!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 for Protection" section</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + /*]]>*/ + </style> +</head> + +<body> + <h1>"Functions for Protection" section</h1> + + <p>This section is for choosing which functions must be protected.</p> + <p><img src="images/project_functions.png" /></p> + <h3 id="AddFunction">Adding a function</h3> + <p>To add a new object to the project, click the "Add Function" button on the toolbar, or select the corresponding item in the context menu:</p> + <p><img src="images/project_functions_menu.png" /></p> + <p>A new function dialog appears:</p> + <p><img src="images/project_add_function.png" /></p> + <p>Specify the address of the function, or start typing function's name to the quick search box to select the function directly from the list on the "Functions" tab. Use multi-selection if you want to add several functions at once. All selected functions are added with the chosen protection options.</p> + <p><strong>Options</strong></p> + <ul> + <li><a name="CompilationTypes" id= + "CompilationTypes"><strong>Compilation type</strong></a> - + select the way the object is compiled. Selecting a proper way to protect each object (procedure, function, code fragment) from examination and hacking results in optimal balance between performance and security of the code. + VMProtect allows the developer to set the following compilation types for each protected object:</li> + <ul> + <li><strong>Mutation.</strong> The executable code is modified at the level of CPU commands - existing commands are mutated, various "garbage" commands are added and so on. This type of compilation is relatively weak in terms of protecting the code from hack or analysis. Its main purpose is to prevent detection of processed functions with automated signature analysers (PEiD+KANAL, IDA+FLIRT etc.). This type of compilation is worthwhile to protect library functions as they usually do not require strong protection from cracking and analysis. So it is enough to modify signatures so that a potential cracker couldn't automatically detect particular libraries used in the application. Mutation provides low level of protection and analysis, but high performance of code execution.</li> + + <li><strong>Virtualization.</strong> The executable code is translated to the bytecode executed on a virtual machine. + This compilation type should be applied to all critical parts of code that require both serious hacking and analysis countermeasures and high performance. Virtualization provides average protection from hacking and analysis and average execution speed.</li> + + <li><strong>Ultra (mutation + virtualization).</strong> + The executable code is mutated on the processor instruction level and then is translated to the bytecode executed on a virtual machine. + This type of compilation should be applied to all fragments of code when the speed of execution is not critical. Ultra protection provides high protection and is executed slowly.</li> + </ul> + + <li id="LockToKey"><strong>Lock to Serial Number</strong> - if this option is enable, the protected function become <a href="manager/features.htm#lock">unavailable without a valid serial number entered</a>. In such a way you can limit access to certain functions of the application in the unregistered version.</li> + </ul> + + <p id="Search"><strong>Search</strong></p> + + <p>You can locate objects you need by their name using the quick search box:</p> + <p><img src="images/project_functions_search.png" /></p> + + <p>You can use the following wildcard symbols in the search box:</p> + <ul> + <li><strong>*</strong> - replaces any number of symbols;</li> + <li><strong>?</strong> - replaces one symbol.</li> + </ul> + + <h3 id="AddFolder">Adding a folder</h3> + <p>You can add a folder to the project using the context menu:</p> + <p><img src="images/project_functions_menu.png" /></p> + <p>Folders group protected objects and allow changing protection parameters (exclusion from compilation, type of compilation) of all objects in a folder at once.</p> + <p>Enter the name of a new folder:</p> + <p><img src="images/project_add_folder.png" /></p> + + <h3>Editing objects</h3> + <p>The right side of the window displays contents of the selected object. If a protected object is selected in the project tree, the right part displays a disassembled representation of this object:</p> + + <p><img src="images/project_functions_content.png" alt= + "Code" /></p> + <p>Right-clicking a line of code brings up the context menu:</p> + <p><img src="images/project_functions_menu3.png" /></p> + <ul> + <li><a name="ExtAddress" id="ExtAddress"><strong>External address</strong></a> - Add the chosen address to the list of <a href= + "project_options_external_addresses.htm">external addresses</a>;</li> + + <li><strong>End of function</strong> - limit the list of command that should be processed during compilation;</li> + </ul> + + <p>If a folder is selected in the project tree, the right side displays the list of functions in that folder:</p> + + <p><img src="images/project_functions_content2.png" /></p> + + <p>You can move functions to and from folders with simple drag-n-drop.</p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/project_options.htm b/help/en/project_options.htm new file mode 100644 index 0000000..81cfca7 --- /dev/null +++ b/help/en/project_options.htm @@ -0,0 +1,85 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>"Options" section</title> +</head> + +<body> + <h1>"Options" section</h1> + + <p>The "Options" subsection of the "Project" section allows you to configure various protection parameters:</p> + <p><img src="images/project_options.png" /></p> + + <h3>File</h3> + + <ul> + <li><strong id="MemoryProtection">Memory Protection</strong> - + this option allows you to secure the image of the file in memory from any changes (data integrity is checked for all sections that do not have the WRITABLE attribute). Image integrity check is performed before passing the control to the original entry point of the program. If integrity is violated, a corresponding message is shown and the program stops execution.</li> + + <li><strong id="ImportProtection">Import Protection</strong> - + this option allows hiding the list of API the protected program uses from a cracker. We recommend using this option along with packing of the output file.</li> + + <li><strong id="ResourceProtection">Resource Protection</strong> - + this option encrypts resources of the program (except icons, manifests and other service resources).</li> + + <li> + <strong id="PackOutputFile">Pack the Output File</strong> + - this option allows you to pack the protected file to reduce its size. The application is unpacked automatically when the protected file is executed. The entire unpacking goes without any disk writing, completely in RAM. + + <p>When using this option, we also recommend to include + <a href="dictionary.htm#EntryPoint">EntryPoint</a> to the list of protected objects.<br /> + <strong>Important:</strong><br /> + When the program starts, after the code is unpacked the control is passed to EntryPoint. If the code of EntryPoint is virtualized, this code will be executed on the same VM interpreter as the code of the unpacker itself. Virtualization of EntryPoint combined with packing of the protected file prevents manual unpacking of the protected file, as in this case an intruder has to restore EntryPoint code to get a working file image.</p> + </li> + <li> + <strong id="Additional">Additional</strong> + - additional levels of protection:</li> + <ul> + <li> + <strong id="watermarks">Watermarks</strong> - allows adding <a href="watermarks.htm">watermarks</a> to the project. + </li> + <li><strong id="VMSectionName">VM Segments</strong> - + When the file is compiled, new segments will be added to it to the place where various system data are stored (virtualized and mutated code, VM interpreters, watermarks etc.). This option allows you to specify names for these new segments. + We recommend changing the standard ".vmp" name of segments to something else + (for example ".UPX").</li> + <li><strong>Strip Debug Information</strong> - removing of debug information impedes analysis of the code by a cracker.</li> + <li><strong>Strip Relocations</strong> - some compilers (i.e. Delphi) create a relocation table for EXE files that are not used by the operating system to load EXE files. If the option is enabled, the space occupied by relocation table is be used for VM needs.</li> + </ul> + + </ul> + + <h3>Detection</h3> + + <ul> + <li><strong id="DebuggerDetection">Debugger</strong> - this option prevents debugging of the protected file. There are 2 types of debuggers: User-mode debuggers (OllyDBG, WinDBG etc.) and + Kernel-mode debuggers(SoftICE, Syser and others). + Debugger detection is performed before passing control to the entry point of the program. If a debugger is detected, a corresponding message is shown and the program stops execution.</li> + + <li><strong id="VirtualizationToolsDetection">Virtualization Tools</strong> - this option prohibits executing the protected file in various virtual environments: + VMware, Virtual PC, VirtualBox, Sandboxie. Detection of virtualization is performed before passing control to the entry point of the program. If a virtual environment is detected, a corresponding message is shown and the program stops execution.</li> + </ul> + + <h3>Messages</h3> + <p>Here you can customize messages the program displays when it detects a debugger, a virtualization tool, if the file is corrupted or when there's an attempt to execute the code protected by a serial number.</p> + + <h3 id="LicensingParameters">Licensing parameters</h3> + + <p>Choose a project file created in the <a href="manager/licenses.htm">license manager</a> as a licensing parameter file. By default, the current project file is used.</p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/project_options_external_addresses.htm b/help/en/project_options_external_addresses.htm new file mode 100644 index 0000000..a15875e --- /dev/null +++ b/help/en/project_options_external_addresses.htm @@ -0,0 +1,52 @@ +<!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>External Addresses</title> +</head> + +<body> + <h1>External Addresses</h1> + + When protecting an application, VMProtect utilizes the space that becomes free during compilation for its own needs, including storage of various data (virtualized or mutated code, VM interpreters and so on). As a result, certain situations may occur when a jump "inside" the protected code is made from other parts of the program. Addresses such a jump is performed from are called external. A situation described above can happen when code markers are used and a jump from a non-protected part of the program is performed inside the markers: + <pre class="code">VMProtectBegin(nil); +for I:=0 to 10 do +begin + Inc(J); + VMProtectEnd; +end; +</pre> + + <p>In the assembler code this cycle looks as:</p> + <pre class="code">----------------- marker begin ---------------- +0044D12C mov eax, 0000000B +0044D131 inc ebx +----------------- marker end ----------------- +0044D132 dec eax +0044D133 jnz 0044D131 +</pre> + + <p>Apparently, when commands at 0044D12C and 0044D131 addresses are virtualized and a non-virtualized conditional jump at 0044D133 is performed, an error occurs, because the address of 0044D131 contains various data or just garbage instead of the original code. In this example, 0044D131 is an external address.</p> + + <p>When the "Debug mode" option is enabled, the INT 03 command replaces the original code. This is a simple breakpoint and a debugger command. + When the protected application is executed under a debugger and control is passed to the 0044D131 address, a breakpoint is activated, and the debugger window displays the address the given jump is initiated at.</p> + + <p>When such jumps are detected, we recommend to check all code markers, whether they are set properly. If the protected code is not marked, or if the program logic cannot be changed so to avoid passing control inside the protected code, you should mark such addresses as <a href= + "project_functions.htm#ExtAddress">external</a> in the GUI.</p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/project_script.htm b/help/en/project_script.htm new file mode 100644 index 0000000..ac5b3db --- /dev/null +++ b/help/en/project_script.htm @@ -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>"Script" section</title> +</head> + +<body> + <h1>"Script" section</h1> + + <p>The "Script" subsection of the "Project" section is for writing scripts using the built-in <a href="script.htm">script language</a>:</p> + <p><img src="images/project_script.png" /></p> + + <p>You can edit the code of the script on the main panel of the section. The right-click menu allows manipulating with fragments of the code.</p> + <p>Certain code blocks (cycles, functions) can be collapsed or expanded using a hierarchy sign (plus or minus) near the corresponding line number.</p> + <p>Right-click the section name to exclude the script from compilation. The excluded script is not executed and is not processed by the program. This parameter is saved in the project settings.</p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/recommendations.htm b/help/en/recommendations.htm new file mode 100644 index 0000000..96fbeaa --- /dev/null +++ b/help/en/recommendations.htm @@ -0,0 +1,169 @@ +<!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>Recommendations on protecting your application</title> +</head> + +<body> + <h1>Recommendations on protecting your application</h1> + + <p>VMProtect is a reliable tool to protect the application code from analysis and cracking, yet the most efficient use is only possible if the in-app protection mechanisms are built properly, without typical mistakes that could ruin the whole protection. Let's review crucial elements of developing a good protection of your program.</p> + + <h3>Registration procedure</h3> + + <p>A typical mistake many developers make when they design their own application registration procedure is enveloping the entire registration key check to an individual function that also returns an easy-to-comprehend value:</p> + <pre class="indent code">function CheckRegistration(const RegNumber: String): Boolean; +begin + if RegNumber='123' then + Result:=True + else + Result:=False; +end; + +procedure TForm1.Button1Click(Sender: TObject); +begin + ... + if not CheckRegistration(RegNumber) then + exit; + Application.CreateForm(TForm2, Form2); + Form2.ShowModal; + ... +end; +</pre> + + <p>With such an approach, an intruder doesn't even need to understand the key check algorithm. He may simply modify the code in the beginning of the check procedure so that it always returned a correct registration key value:</p> + <pre class="indent code">function CheckRegistration(const RegNumber: String): Boolean; +begin + Result:=True; + exit; + ... +end; +</pre> + + <p>A much more effective way to check the key is to embed the check for correctness to the main operation logic of the program, so that the algorithm of registration key check could not be separated from the algorithm of the calling procedure. We also recommend to "blend" the operation logic with the registration key check procedure to make the program fail if the check was bypassed. For the above example this can be done as follows:</p> + <pre class="indent code">function CheckRegistration(const RegNumber: String): Boolean; +begin + if RegNumber='123' then + begin + Application.CreateForm(TForm2, Form2); + Result:=True + end + else + Result:=False; +end; + +procedure TForm1.Button1Click(Sender: TObject); +begin + ... + Form2:=nil; + if not CheckRegistration(RegNumber) then + exit; + Form2.ShowModal; + ... +end; +</pre> + + <p>If the CheckRegistration function is implemented like that, an intruder will have to analyze the code of registration key check in all details in order to bypass it. If this application is protected by VMProtect, virtualization of both the CheckRegistration function and TForm1.Button1Click procedure is recommended. To make the hacking even more complex, you can turn on the <a href="project_functions.htm#CompilationTypes">"Ultra" protection mode</a> to combine mutation of the code and subsequent virtualization.</p> + + <h3>Checking registration keys</h3> + + <p>Another critical mistake developers make is wrong implementation of registration key checks. Often the entered key is simply compared with the correct value. A cracker can easily match the correct value of the key by tracing arguments of the string comparison function:</p> + <pre class="indent code">var ValidRegNumber: String; +... +function CheckRegistration(const RegNumber: String): Boolean; +begin + if RegNumber=ValidRegNumber then + Result:=True + else + Result:=False; +end; +</pre> + + <p>To avoid such situation we recommend comparing hashes of keys, instead of their actual values. The hash function is irreversible, so a cracker is unable to retrieve a real key value from the hash and has to spend a lot more time to study the program, because more code fragments need to be analyzed now, not just the registration key check procedure:</p> + <pre class="indent code">var + HashOfValidRegNumber: Longint; +... +// Peter Weinberger's PJW hashing algorithm example of use +function HashPJW(const Value: String): Longint; +var I:Integer; + G:Longint; +begin + Result:=0; + for I:=1 to Length(Value) do + begin + Result:=(Result shl 4)+Ord(Value[I]); + G:=Result and $F0000000; + if G<&gt0 then + Result:=(Result xor (G shr 24)) xor G; + end; +end; + +function CheckRegistration(const RegNumber: String): Boolean; +begin + if HashPJW(RegNumber)=HashOfValidRegNumber then + Result:=True + else + Result:=False; +end; +... +initialization + HashOfValidRegNumber:=HashPJW(ValidRegNumber); + +end. +</pre> + + <p>When protecting the application with VMProtect, HashPJW and CheckRegistration function should be processed to complicate hacker's life.</p> + + <h3>Saving check results</h3> + + <p>Usually, even developers who spent a lot of time on registration procedure do not give due attention to protecting the result of the registration procedure. The below example uses a global variable to store and control the registration state of the application before invoking the serial number check procedure. For an intruder, finding a global variable is a piece of cake - he simply compares data segments BEFORE and AFTER registration. By the way, the popular ArtMoney program uses the same principle.</p> + <pre class="indent code">var IsRegistered: Boolean; +... +procedure TForm1.Button1Click(Sender: TObject); +begin + ... + if not IsRegistered then + IsRegistered:=CheckRegistration(RegNumber); + if not IsRegistered then + exit; + ... +end; +</pre> + + <p>To avoid such a situation, we recommend to store results of all checks related to registration of the program in dynamic memory. In this case scanning data segments for modified memory blocks BEFORE and AFTER registration turns useless. Here is a very simple example demonstrating how to store the result in dynamically allocated memory:</p> + <pre class="indent code">type PBoolean = ^Boolean; + +var IsRegistered: PBoolean; +... +procedure TForm1.Button1Click(Sender: TObject); +begin + ... + if not IsRegistered^ then + IsRegistered^:=CheckRegistration(RegNumber); + if not IsRegistered^ then + exit; + ... +end; +... +initialization + New(IsRegistered); +</pre> + + <p>These are the simplest ways to utilize the built-in protection mechanisms. Real-world implementations of registration procedures, registration key checks and storing the result are only limited to creativity of a developer. Anyway, you should know about these potential mistakes to avoid them while developing your own protection mechanism.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/script.htm b/help/en/script.htm new file mode 100644 index 0000000..2016734 --- /dev/null +++ b/help/en/script.htm @@ -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>Using scripts</title> +</head> + +<body> + <h1>Using scripts</h1> + + <p>VMProtect has a built-in powerful script language <a href="http://www.lua.org/">LUA</a> greatly enhancing the default protection capabilities of VMProtect at every stage of protection.</p> + + <p>LUA syntax is very similar to that of JavaScript, but unlike it LUA doesn't contain explicit classes. Nevertheless, the script language allows easily implementing such object-oriented programming mechanisms as classes, inheritance and events. Script usage examples can be found in the "VMProtect/Examples/Scripts" folder.</p> + <ul> + <li><a href="script_classes.htm">Classes</a></li> + <li><a href="script_functions.htm">Built-in functions</a></li> + <li><a href="script_events.htm">Events</a></li> + </ul> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/script_classes.htm b/help/en/script_classes.htm new file mode 100644 index 0000000..e3b5b05 --- /dev/null +++ b/help/en/script_classes.htm @@ -0,0 +1,1185 @@ +<!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>Classes</title> +</head> + +<body> + <h1>Classes</h1> + + <p>The script language <a href="http://www.lua.org/about.html">LUA</a> built into VMProtect is object-oriented: it is very similar to JavaScript in its syntax, ideology and implementation. + The script language includes standard classes providing basic functionality and specialized classes giving access to application protection functionality. + </p> + +<h3>Class hierarchy</h3> +<ul> +<li><a href="#Core">Core</a><ul> + <li><a href="#Watermarks">Watermarks</a><ul> + <li><a href="#Watermark">Watermark</a></li> + </ul></li> + <li><a href="#Licenses">Licenses</a><ul> + <li><a href="#License">License</a></li> + </ul></li> + <li><a href="#Files">Files</a><ul> + <li><a href="#File">File</a></li> + </ul></li> + <li><a href="#Folders">Folders</a><ul> + <li><a href="#Folder">Folder</a></li> + </ul></li> + + <li><a href="#PEFile">PEFile</a><ul> + <li><a href="#PEFormat">PEFormat</a><ul> + </ul></li> + <li><a href="#PEArchitecture">PEArchitecture</a><ul> + <li><a href="#PESegments">PESegments</a><ul> + <li><a href="#PESegment">PESegment</a></li> + </ul></li> + <li><a href="#PESections">PESections</a><ul> + <li><a href="#PESection">PESection</a></li> + </ul></li> + <li><a href="#PEDirectories">PEDirectories</a><ul> + <li><a href="#PEDirectory">PEDirectory</a></li> + </ul></li> + <li><a href="#PEImports">PEImports</a><ul> + <li><a href="#PEImport">PEImport</a></li> + </ul></li> + <li><a href="#PEExports">PEExports</a><ul> + <li><a href="#PEExport">PEExport</a></li> + </ul></li> + <li><a href="#PEResources">PEResources</a><ul> + <li><a href="#PEResource">PEResource</a></li> + </ul></li> + <li><a href="#PEFixups">PEFixups</a><ul> + <li><a href="#PEFixup">PEFixup</a></li> + </ul></li> + </ul></li> + </ul></li> + <li><a href="#MacFile">MacFile</a><ul> + <li><a href="#MacFormat">MacFormat</a><ul> + </ul></li> + <li><a href="#MacArchitecture">MacArchitecture</a><ul> + <li><a href="#MacSegments">MacSegments</a><ul> + <li><a href="#MacSegment">MacSegment</a></li> + </ul></li> + <li><a href="#MacSections">MacSections</a><ul> + <li><a href="#MacSection">MacSection</a></li> + </ul></li> + <li><a href="#MacCommands">MacCommands</a><ul> + <li><a href="#MacCommand">MacCommand</a></li> + </ul></li> + <li><a href="#MacSymbols">MacSymbols</a><ul> + <li><a href="#MacSymbol">MacSymbol</a></li> + </ul></li> + <li><a href="#MacImports">MacImports</a><ul> + <li><a href="#MacImport">MacImport</a></li> + </ul></li> + <li><a href="#MacExports">MacExports</a><ul> + <li><a href="#MacExport">MacExport</a></li> + </ul></li> + <li><a href="#MacFixups">MacFixups</a><ul> + <li><a href="#MacFixup">MacFixup</a></li> + </ul></li> + </ul></li> + </ul></li> + <li><a href="#MapFunctions">MapFunctions</a><ul> + <li><a href="#MapFunction">MapFunction</a><ul> + <li><a href="#References">References</a><ul> + <li><a href="#Reference">Reference</a></li> + </ul></li> + </ul></li> + </ul></li> + <li><a href="#IntelFunctions">IntelFunctions</a><ul> + <li><a href="#IntelFunction">IntelFunction</a><ul> + <li><a href="#IntelSegment">IntelSegment</a><ul> + <li><a href="#IntelRegistr">IntelRegistr</a></li> + <li><a href="#IntelCommandType">IntelCommandType</a></li> + <li><a href="#IntelFlag">IntelFlag</a></li> + <li><a href="#IntelCommand">IntelCommand</a><ul> + <li><a href="#OperandType">OperandType</a><ul> + <li><a href="#IntelOperand">IntelOperand</a></li> + </ul></li> + </ul></li> + </ul></li> + <li><a href="#CommandLinks">CommandLinks</a><ul> + <li><a href="#LinkType">LinkType</a><ul> + <li><a href="#CommandLink">CommandLink</a></li> + </ul></li> + </ul></li> + </ul></li> + </ul></li> +</ul></li> +<li><a href="#FFILibrary">FFILibrary</a><ul> + <li><a href="#FFIFunction">FFIFunction</a></li> +</ul></li> +</ul> + +<h3>Core</h3> + +<p id="ProjectOption">Project options:</p> +<pre class="code"> +enum ProjectOption { + None, + Pack, + ImportProtection, + MemoryProtection, + ResourceProtection, + CheckDebugger, + CheckKernelDebugger, + CheckVirtualMachine, + StripFixups, + StripDebugInfo, + DebugMode +} +</pre> + +<p id="Core">A class to work with the VMProtect core:</p> +<pre class="code" id="Core"> +class Core { +public: + string projectFileName(); // returns the name of the project + void saveProject(); // saves the project + string inputFileName(); // returns the name of the source file for the current project + string outputFileName(); // returns the name of the output file for the current project + void setOutputFileName(string name); // sets the name of the output file for the current project + string watermarkName(); // returns the name of the watermark of the current project + void setWatermarkName(string name); // sets the name of the watermark for the current project + int options(); // returns <a href="#ProjectOption">options</a> of the current project + void setOptions(int options); // sets options of the current project + string vmSectionName(); // returns VM segment name for the current project + void setVMSectionName(); // sets VM segment name for the current project + <a href="#Licenses">Licenses</a> licenses(); // returns the list of licenses for the current project + <a href="#Files">Files</a> files(); // returns the list of files for the current project + <a href="#Watermarks">Watermarks</a> watermarks(); // returns the list of watermarks + <a href="#PEFile">PEFile</a>/<a href="#MacFile">MacFile</a> inputFile(); // returns source file + <a href="#PEFile">PEFile</a>/<a href="#MacFile">MacFile</a> outputFile(); // returns output file + <a href="#PEArchitecture">PEArchitecture</a>/<a href="#MacArchitecture">MacArchitecture</a> inputArchitecture(); // returns source architecture + <a href="#PEArchitecture">PEArchitecture</a>/<a href="#MacArchitecture">MacArchitecture</a> outputArchitecture(); // returns output architecture +}; +</pre> + +<h3>Watermarks</h3> + +<p id="Watermarks">A class to work with the list of <a href="watermarks.htm">watermarks</a>:</p> +<pre class="code"> +class Watermarks { +public: + <a href="#Watermark">Watermark</a> item(int index); // returns a watermark with the given index + int count(); // returns a number of watermarks in the list + <a href="#Watermark">Watermark</a> itemByName(string name); // returns a watermark with the given name + <a href="#Watermark">Watermark</a> add(string name, string value); // adds a watermark with the given name and value +} +</pre> + +<p id="Watermark">A class to work with a watermark:</p> +<pre class="code"> +class Watermark { +public: + string name(); // returns the name of the watermark + string value(); // returns the value of the watermarks + bool blocked(); // returns the "Blocked" property + void setBlocked(bool value); // sets the "Blocked" property +} +</pre> + +<h3>Licenses</h3> + +<p id="Licenses">A class to work with the list of <a href="manager/licenses.htm">licenses</a>:</p> +<pre class="code"> +class Licenses { +public: + int keyLength(); // returns the length of the key + string publicExp(); // returns the public exponent + string privateExp(); // returns the private exponent + string modulus(); // returns modulus + <a href="#License">License</a> item(int index); // returns a license with the given index + int count(); // returns the number of licenses in the list +} +</pre> + +<p id="License">A class to work with a license:</p> +<pre class="code"> +class License { +public: + string date(string format = "%c"); // returns the date of the license + string customerName(); // returns the name of the license owner + string customerEmail(); // returns an e-mail of the license owner + string orderRef(); // returns the order id the license was purchased + string comments(); // returns comments to the license + string serialNumber(); // returns the serial number of the license + bool blocked(); // returns the "Blocked" property + void setBlocked(bool value); // sets the "Blocked" property +} +</pre> + +<h3>Files</h3> + +<p id="Files">A class to work with the list of <a href="project_files.htm">files</a>:</p> +<pre class="code"> +class Files { +public: + <a href="#File">File</a> item(int index); // returns a file with the given index + int count(); // returns the number of files in the list +} +</pre> + +<p id="File">A class to work with a <a href="project_files.htm">file</a>:</p> +<pre class="code"> +class File { +public: + string name(); // returns the name of the file + string fileName(); // returns the filename + int options(); // returns options + void setName(string name); // sets the name of the file + void setFileName(string name); // sets the filename of the file + void setOptions(); // sets options +} +</pre> + +<h3>Folders</h3> + +<p id="Folders">A class to work with custom folders:</p> +<pre class="code"> +class Folders { +public: + int count(); // returns the number of folders in the list + <a href="#Folder">Folder</a> item(int index); // returns a folder with the given index + <a href="#Folder">Folder</a> add(string name); // adds a new folder + void clear(); // clears the list +}; +</pre> + +<p id="Folder">A class to work with a custom folder:</p> +<pre class="code" id="Folder"> +class Folder { +public: + int count(); // returns the number of subfolders + <a href="#Folder">Folder</a> item(int index); // returns a subfolder with the given index + <a href="#Folder">Folder</a> add(string name); // adds a new subfolder + string name(); // returns the name of the folder + void clear(); // clears the list of subfolders + void destroy(); // destroys the folder an all child subfolders +}; +</pre> + +<h3>PE files</h3> + +<p id="PEFormat">Constants to work with the PE format:</p> +<pre class="code"> +enum PEFormat { + // Directory Entries + IMAGE_DIRECTORY_ENTRY_EXPORT, + IMAGE_DIRECTORY_ENTRY_IMPORT, + IMAGE_DIRECTORY_ENTRY_RESOURCE, + IMAGE_DIRECTORY_ENTRY_EXCEPTION, + IMAGE_DIRECTORY_ENTRY_SECURITY, + IMAGE_DIRECTORY_ENTRY_BASERELOC, + IMAGE_DIRECTORY_ENTRY_DEBUG, + IMAGE_DIRECTORY_ENTRY_ARCHITECTURE, + IMAGE_DIRECTORY_ENTRY_TLS, + IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG, + IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT, + IMAGE_DIRECTORY_ENTRY_IAT, + IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT, + IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR, + // Section characteristics + IMAGE_SCN_CNT_CODE, + IMAGE_SCN_CNT_INITIALIZED_DATA, + IMAGE_SCN_CNT_UNINITIALIZED_DATA, + IMAGE_SCN_MEM_DISCARDABLE, + IMAGE_SCN_MEM_NOT_CACHED, + IMAGE_SCN_MEM_NOT_PAGED, + IMAGE_SCN_MEM_SHARED, + IMAGE_SCN_MEM_EXECUTE, + IMAGE_SCN_MEM_READ, + IMAGE_SCN_MEM_WRITE, + // Resource types + RT_CURSOR, + RT_BITMAP, + RT_ICON, + RT_MENU, + RT_DIALOG, + RT_STRING, + RT_FONTDIR, + RT_FONT, + RT_ACCELERATOR, + RT_RCDATA, + RT_MESSAGETABLE, + RT_GROUP_CURSOR, + RT_GROUP_ICON, + RT_VERSION, + RT_DLGINCLUDE, + RT_PLUGPLAY, + RT_VXD, + RT_ANICURSOR, + RT_ANIICON, + RT_HTML, + RT_MANIFEST, + RT_DLGINIT, + RT_TOOLBAR +}; +</pre> + +<p id="PEFile">A class to work with a PE file:</p> +<pre class="code"> +class PEFile { +public: + string name(); // returns the filename + string format(); // returns the "PE" format name + uint64 size(); // returns the size of the file + int count(); // returns the number of architectures in the list + <a href="#PEArchitecture">PEArchitecture</a> item(int index); // returns an architecture with the given index + uint64 seek(uint64 offset); // sets a file position + uint64 tell(); // returns a file position + int write(string buffer); // records a buffer to the file +}; +</pre> + +<p id="PEArchitecture">A class to work with the PE architecture:</p> +<pre class="code"> +class PEArchitecture { +public: + string name(); // returns the name of the architecture + <a href="#PEFile">PEFile</a> file(); // returns the parent file + uint64 entryPoint(); // returns the starting address + uint64 imageBase(); // returns the base offset + <a href="#OperandSize">OperandSize</a> cpuAddressSize(); // returns bit count of the architecture + uint64 size(); // returns the size of the architecture + <a href="#PESegments">PESegments</a> segments(); // returns the list of segments + <a href="#PESections">PESections</a> sections(); // returns the list of sections + <a href="#PEDirectories">PEDirectories</a> directories(); // returns the list of directories + <a href="#PEImports">PEImports</a> imports(); // returns the list of imported libraries + <a href="#PEExports">PEExports</a> exports(); // returns the list of exported functions + <a href="#PEResources">PEResources</a> resources(); // returns the list of resources + <a href="#PEFixups">PEFixups</a> fixups(); // returns the list of relocations (fixups); + <a href="#MapFunctions">MapFunctions</a> mapFunctions(); // returns the list of functions available for protection + <a href="#IntelFunctions">IntelFunctions</a> functions(); // returns the list of protected functions + bool addressSeek(uint64 address); // sets a file position + uint64 seek(uint64 offset); // sets a file position + uint64 tell(); // returns a file position + int write(string buffer); // writes a buffer to a file +}; +</pre> + +<p id="PESegments">A class to work with the list of segments for the PE architecture:</p> +<pre class="code"> +class PESegments { +public: + <a href="#PESegment">PESegment</a> item(int index); // returns a segment with the given index + int count(); // returns the number of segments in the list + <a href="#PESegment">PESegment</a> itemByAddress(uint64 address); // returns the segment at the given address +}; +</pre> + +<p id="PESegment">A class to work with a PE architecture segment:</p> +<pre class="code"> +class PESegment { +public: + uint64 address(); // returns the address of the segment + string name(); // returns the name of the segment + uint64 size(); // returns the size of the segment + int physicalOffset(); // returns the file position (offset) of the segment + int physicalSize(); // returns the file size of the segment + int flags(); // returns flags of the segment + bool excludedFromPacking(); // returns the "Excluded from packing" property + void setName(string name); // sets the name of the segment +}; +</pre> + +<p id="PESections">A class to work with the list of PE architecture sections:</p> +<pre class="code"> +class PESections { +public: + <a href="#PESection">PESection</a> item(int index); // returns a section with the given index + int count(); // returns the number of sections in the list + <a href="#PESection">PESection</a> itemByAddress(uint64 address); // returns a section at the given address +}; +</pre> + +<p id="PESection">A class to work with a PE architecture section:</p> +<pre class="code"> +class PESection { +public: + uint64 address(); // returns the address of the section + string name(); // returns the name of the section + uint64 size(); // returns the size of the section + int offset(); // returns the file positions of the section + <a href="#PESegment">PESegment</a> segment(); // returns the parent segment +}; +</pre> + +<p id="PEDirectories">A class to work with PE architecture directories:</p> +<pre class="code"> +class PEDirectories { +public: + <a href="#PEDirectory">PEDirectory</a> item(int index); // returns a directory with the given index + int count(); // returns the number of directories in the list + <a href="#PEDirectory">PEDirectory</a> itemByType(int type); // returns a directory of the given type +}; +</pre> + +<p id="PEDirectory">A class to work with a PE architecture directory:</p> +<pre class="code"> +class PEDirectory { +public: + uint64 address(); // returns the address of the directory + string name(); // returns the name of the directory + uint64 size(); // returns the size of the directory + int type(); // returns the type of the directory + void setAddress(uint64 address); // sets the address of the directory + void setSize(int size); // sets the size of the directory + void clear(); // clears the address and the size of the directory +}; +</pre> + +<p id="PEImports">A class to work with the list of imported libraries for the PE architecture:</p> +<pre class="code"> +class PEImports { +public: + <a href="#PEImport">PEImport</a> item(int index); // returns a library with the given index + int count(); // returns the number of libraries in the list + <a href="#PEImport">PEImport</a> itemByName(string name); // returns a library with the given name +}; +</pre> + +<p id="PEImport">A class to work with an imported library for the PE architecture :</p> +<pre class="code"> +class PEImport { +public: + string name(); // returns the name of the library + <a href="#PEImportFunction">PEImportFunction</a> item(int index); // returns an imported function with the given index + int count(); // returns the number of imported functions + void setName(string name); // sets the name of the library +}; +</pre> + +<p id="PEImportFunction">A class to work with a PE architecture imported function:</p> +<pre class="code"> +class PEImportFunction { +public: + uint64 address(); // returns a memory address where the imported function address is stored + string name(); // returns the name of the imported function +}; +</pre> + +<p id="PEExports">A class to work with the list of exported functions for the PE architecture :</p> +<pre class="code"> +class PEExports { +public: + string name(); // returns the name of the library + void setName(string name); // sets the name of the library + <a href="#PEExport">PEExport</a> item(int index); // returns an exported function with the given index + int count(); // returns the number of exported functions in the list + void clear(); // clears the list + <a href="#PEExport">PEExport</a> itemByAddress(uint64 address); // returns an exported function at the given address + <a href="#PEExport">PEExport</a> itemByName(string name); // returns an exported function with the given name +}; +</pre> + +<p id="PEExport">A class to wotk with a PE architecture exported function:</p> +<pre class="code"> +class PEExport { +public: + uint64 address(); // returns the address of the exported function + string name(); // returns the name of the exported function + void setName(string name); // sets the name of the exported function + int ordinal(); // returns the ordinal of the exported function + string forwardedName(); // returns the name of the function the exported function forwards to + void destroy(); // destroys the exported function +}; +</pre> + +<p id="PEResources">A class to work with the list of PE architecture resources:</p> +<pre class="code"> +class PEResources { +public: + <a href="#PEResource">PEResource</a> item(int index); // returns a resources with the given index + int count(); // returns the number of resources in the list + void clear(); // clears the list + <a href="#PEResource">PEResource</a> itemByType(int type); // returns a resource of the given type + <a href="#PEResource">PEResource</a> itemByName(string name); // returns a resource with the given name +}; +</pre> + +<p id="PEResource">A class to work with a PE architecture resource:</p> +<pre class="code"> +class PEResource { +public: + <a href="#PEResource">PEResource</a> item(int index); // returns a resource with the given index + int count(); // returns the number of resources in the list + void clear(); // clears the list + uint64 address(); // returns the address of the resource + int size(); // returns the size of the resource + string name(); // returns the name of the resource + int type(); // returns the type of the resource + bool isDirectory(); // returns the "Directory" property + void destroy(); // destroys the resource + <a href="#PEResource">PEResource</a> itemByName(string name); // returns a resource with the given name + bool excludedFromPacking(); // returns the "Excluded from packing" property +}; +</pre> + +<p id="PEFixups">A class to work with the list of PE architecture fixups (relocations):</p> +<pre class="code"> +class PEFixups { +public: + <a href="#PEFixup">PEFixup</a> item(int index); // returns an element with the given index + int count(); // returns the number of elements in the list + <a href="#PEFixup">PEFixup</a> itemByAddress(uint64 address); // returns an element at the given address +}; +</pre> + +<p id="PEFixup">A class to work with a PE architecture fixup (relocation):</p> +<pre class="code"> +class PEFixup { +public: + uint64 address(); // returns the address of the element +}; +</pre> + +<h3>Mach-O files</h3> + +<p id="MacFormat">Constants to work with the Mach-O format:</p> +<pre class="code"> +enum MacFormat { + // Load Command Types + LC_SEGMENT, + LC_SYMTAB, + LC_SYMSEG, + LC_THREAD, + LC_UNIXTHREAD, + LC_LOADFVMLIB, + LC_IDFVMLIB, + LC_IDENT, + LC_FVMFILE, + LC_PREPAGE, + LC_DYSYMTAB, + LC_LOAD_DYLIB, + LC_ID_DYLIB, + LC_LOAD_DYLINKER, + LC_PREBOUND_DYLIB, + LC_ROUTINES, + LC_SUB_FRAMEWORK, + LC_SUB_UMBRELLA, + LC_SUB_CLIENT, + LC_SUB_LIBRARY, + LC_TWOLEVEL_HINTS, + LC_PREBIND_CKSUM, + LC_LOAD_WEAK_DYLIB, + LC_SEGMENT_64, + LC_ROUTINES_64, + LC_UUID, + LC_RPATH, + LC_CODE_SIGNATURE, + LC_SEGMENT_SPLIT_INFO, + LC_REEXPORT_DYLIB, + LC_LAZY_LOAD_DYLIB, + LC_ENCRYPTION_INFO, + LC_DYLD_INFO, + LC_DYLD_INFO_ONLY, + LC_LOAD_UPWARD_DYLIB, + LC_VERSION_MIN_MACOSX, + // Section Types + SECTION_TYPE, + SECTION_ATTRIBUTES, + S_REGULAR, + S_ZEROFILL, + S_CSTRING_LITERALS, + S_4BYTE_LITERALS, + S_8BYTE_LITERALS, + S_LITERAL_POINTERS, + S_NON_LAZY_SYMBOL_POINTERS, + S_LAZY_SYMBOL_POINTERS, + S_SYMBOL_STUBS, + S_MOD_INIT_FUNC_POINTERS, + S_MOD_TERM_FUNC_POINTERS, + S_COALESCED, + S_GB_ZEROFILL, + S_INTERPOSING, + S_16BYTE_LITERALS, + S_DTRACE_DOF, + S_LAZY_DYLIB_SYMBOL_POINTERS, + SECTION_ATTRIBUTES_USR, + S_ATTR_PURE_INSTRUCTIONS, + S_ATTR_NO_TOC, + S_ATTR_STRIP_STATIC_SYMS, + S_ATTR_NO_DEAD_STRIP, + S_ATTR_LIVE_SUPPORT, + S_ATTR_SELF_MODIFYING_CODE, + S_ATTR_DEBUG, + SECTION_ATTRIBUTES_SYS, + S_ATTR_SOME_INSTRUCTIONS, + S_ATTR_EXT_RELOC, + S_ATTR_LOC_RELOC +}; +</pre> + +<p id="MacFile">A class to work with a Mach-O file:</p> +<pre class="code"> +class MacFile { +public: + string name(); // returns the name of the file + string format(); // returns the name of the "Mach-O" format + uint64 size(); // returns the size of the file + int count(); // returns the number of architectures in the list + <a href="#MacArchitecture">MacArchitecture</a> item(int index); // returns an architecture with the given index + uint64 seek(uint64 offset); // sets the file position + uint64 tell(); // returns the file position + int write(string buffer); // writes a buffer to the file +}; +</pre> + +<p id="MacArchitecture">A class to work with the Mach-O architecture:</p> +<pre class="code"> +class MacArchitecture { +public: + string name(); // returns the name of the architecture + <a href="#MacFile">MacFile</a> file(); // returns the parent file + uint64 entryPoint(); // returns the starting address + <a href="#OperandSize">OperandSize</a> cpuAddressSize(); // returns bit count of the architecture + uint64 size(); // returns the size of the architecture + <a href="#MacSegments">MacSegments</a> segments(); // returns the list of segments + <a href="#MacSections">MacSections</a> sections(); // returns the list of sections + <a href="#MacCommands">MacCommands</a> commands(); // returns the list of load commands + <a href="#MacSymbols">MacSymbols</a> symbols(); // returns the list of symbols + <a href="#MacImports">MacImports</a> imports(); // returns the list of imported libraries + <a href="#MacExports">MacExports</a> exports(); // returns the list of exported functions + <a href="#MacFixups">MacFixups</a> fixups(); // returns the list of fixups (relocations) + <a href="#MapFunctions">MapFunctions</a> mapFunctions(); // returns the list of functions available for protection + <a href="#IntelFunctions">IntelFunctions</a> functions(); // returns the list of protected functions + bool addressSeek(uint64 address); // sets the file position + uint64 seek(uint64 offset); // sets the file position + uint64 tell(); // returns the file position + int write(string buffer); // writes a buffer to the file +}; +</pre> + +<p id="MacSegments">A class to work with the list of Mach-O architecture segments:</p> +<pre class="code"> +class MacSegments { +public: + <a href="#MacSegment">MacSegment</a> item(int index); // returns a segment with the given index + int count(); // returns the number of segments in the list + <a href="#MacSegment">MacSegment</a> itemByAddress(); // returns a segment at the given address +}; +</pre> + +<p id="MacSegment">A class to work with a Mach-O architecture segment:</p> +<pre class="code" id="MacSegment"> +class MacSegment { +public: + uint64 address(); // returns the address of the segment + string name(); // returns the name of the segment + uint64 size(); // returns the size of the segment + int physicalOffset(); // returns the file position of the segment + int physicalSize(); // returns the file size of the segment + int flags(); // returns flags of the segment + bool excludedFromPacking(); // returns the "Excluded from packing" property +}; +</pre> + +<p id="MacSections">A class to work with the list of Mach-O architecture sections:</p> +<pre class="code"> +class MacSections { +public: + <a href="#MacSection">MacSection</a> item(int index); // returns a section with the given index + int count(); // returns the number of sections in the list + <a href="#MacSection">MacSection</a> itemByAddress(uint64 address); // returns a section at the given address +}; +</pre> + +<p id="MacSection">A class to work with a Mach-O architecture section:</p> +<pre class="code"> +class MacSection { +public: + uint64 address(); // returns the address of the section + string name(); // returns the name of the section + uint64 size(); // returns the size of the section + int offset(); // returns the file position of the section + <a href="#MacSegment">MacSegment</a> segment(); // returns the parent segment +}; +</pre> + +<p id="MacCommands">A class to work with the list of Mach-O architecture load commands:</p> +<pre class="code"> +class MacCommands { +public: + <a href="#MacCommand">MacCommand</a> item(int index); // returns a command with the given index + int count(); // returns the number of command in the list + <a href="#MacCommand">MacCommand</a> itemByType(int type); // returns a command of the given type +}; +</pre> + +<p id="MacCommand">A class to work with a Mach-O architecture load command:</p> +<pre class="code"> +class MacCommand { +public: + uint64 address(); // returns the address of the command + int type(); // returns the type of the command + string name(); // returns the name of the command + int size(); // returns the size of the command +}; +</pre> + +<p id="MacSymbols">A class to work with the list of Mach-O architecture symbols:</p> +<pre class="code"> +class MacSymbols { +public: + <a href="#MacSymbol">MacSymbol</a> item(int index); // returns a symbol with the given index + int count(); // returns the number of symbols in the list +}; +</pre> + +<p id="MacSymbol">A class to work with a Mach-O architecture symbol:</p> +<pre class="code"> +class MacSymbol { +public: + uint64 value(); // returns the value of the symbol + string name(); // returns the name of the symbol +}; +</pre> + +<p id="MacImports">A class to work with the list of imported libraries for the Mach-O architecture:</p> +<pre class="code"> +class MacImports { +public: + <a href="#MacImport">MacImport</a> item(int index); // returns an imported library with the given index + int count(); // returns the number of imported libraries in the list + <a href="#MacImport">MacImport</a> itemByName(string name); // returns an imported library with the given name +}; +</pre> + +<p id="MacImport">A class to work with a Mach-O architecture imported library:</p> +<pre class="code"> +class MacImport { +public: + string name(); // returns the name of the imported library + <a href="#MacImportFunction">MacImportFunction</a> item(int index); // returns an imported function with the given index + int count(); // returns the number of imported functions in the list + void setName(string name); // sets the name of the imported library +}; +</pre> + +<p id="MacImportFunction">A class to work with a Mach-O architecture imported function:</p> +<pre class="code"> +class MacImportFunction { +public: + uint64 address(); // returns the memory address where the address of the imported function is stored + string name(); // returns the name of the imported function +}; +</pre> + +<p id="MacExports">A class to work with the list of exported functions for the Mach-O architecture:</p> +<pre class="code"> +class MacExports { +public: + string name(); // returns the name of the library + <a href="#MacExport">MacExport</a> item(); // returns an exported function with the given index + int count(); // returns the number of exported functions in the list + void clear(); // clears the list + <a href="#MacExport">MacExport</a> itemByAddress(uint64 address); // returns an exported function at the given address + <a href="#MacExport">MacExport</a> itemByName(string name); // returns an exported function with the given name +}; +</pre> + +<p id="MacExport">A class to work with a Mach-O architecture exported function:</p> +<pre class="code"> +class MacExport { +public: + uint64 address(); // returns the address of the exported function + string name(); // returns the name of the exported function + string forwardedName(); // returns the name of the function the exported function is forwarded to + void destroy(); // destroys the exported function +}; +</pre> + +<p id="MacFixups">A class to work with the list of fixups (relocations) for the Mach-O architecture:</p> +<pre class="code"> +class MacFixups { +public: + <a href="#MacFixup">MacFixup</a> item(int index); // returns an element with the given index + int count(); // returns the number of elements in the list + <a href="#MacFixup">MacFixup</a> itemByAddress(uint64 address); // returns an element at the given address +}; +</pre> + +<p id="MacFixup">A class to work with a Mach-O architecture fixup:</p> +<pre class="code"> +class MacFixup { +public: + uint64 address(); // returns the address of the element +}; +</pre> + +<h3>Functions</h3> + +<p id="MapFunctions">A class to work with the list of functions:</p> +<pre class="code"> +class MapFunctions { +public: + <a href="#MapFunction">MapFunction</a> item(int index); // returns a function with the given index + int count(); // returns the number of functions in the list + <a href="#MapFunction">MapFunction</a> itemByAddress(uint64 address); // returns a function at the given address + <a href="#MapFunction">MapFunction</a> itemByName(string name); // returns a function with the given name +}; +</pre> + +<p id="ObjectType">Types of functions:</p> +<pre class="code"> +enum ObjectType { + Unknown, + Code, + Data, + Export, + Marker, + APIMarker, + Import, + String +}; +</pre> + +<p id="MapFunction">A class to work with a function:</p> +<pre class="code"> +class MapFunction { +public: + uint64 address(); // returns the address of the function + string name(); // returns the name of the function + <a href="#ObjectType">ObjectType</a> type(); // returns the type of the function + <a href="#References">References</a> references(); // returns the list of references +}; +</pre> + +<p id="References">A class to work with the list of references:</p> +<pre class="code"> +class References { +public: + <a href="#Reference">Reference</a> item(int index); // returns a reference with the given index + int count(); // returns the number of references in the list +}; +</pre> + +<p id="Reference">A class to work with a reference:</p> +<pre class="code"> +class Reference { +public: + uint64 address(); // returns the address of the command + uint64 operandAddress(); // returns the address of the references +}; +</pre> + +<h3>Intel functions</h3> + +<p id="IntelFunctions">A class to work with the list of Intel functions:</p> +<pre class="code"> +class IntelFunctions { +public: + <a href="#IntelFunction">IntelFunction</a> item(int index); // returns a function with the given index + int count(); // returns the number of functions in the list + void clear(); // clears the list + <a href="#IntelFunction">IntelFunction</a> itemByAddress(uint64 address); // returns a function at the given address + <a href="#IntelFunction">IntelFunction</a> itemByName(string name); // returns a function with the given name + <a href="#IntelFunction">IntelFunction</a> addByAddress(uint64 address, <a href="#CompilationType">CompilationType</a> type = ctVirtualization); + // Adds a new function with the given address and compilation type +}; +</pre> + +<p id="CompilationType">Compilation types:</p> +<pre class="code"> +enum CompilationType { + None, + Virtualization, + Mutation, + Ultra +}; +</pre> + +<p id="IntelFunction">A class to work with an Intel function:</p> +<pre class="code"> +class IntelFunction { +public: + uint64 address(); // returns the address of the function + string name(); // returns the name of the function + <a href="#ObjectType">ObjectType</a> type(); // returns the type of the function + <a href="#IntelCommand">IntelCommand</a> item(int index); // returns a command with the given index + int count(); // returns the number of commands in the list + <a href="#CompilationType">CompilationType</a> compilationType(); // returns the compilation type + void setCompilationType(<a href="#CompilationType">CompilationType</a> value); // sets the compilation type + <a href="#CommandLinks">CommandLinks</a> links(); // returns the list of links + <a href="#IntelCommand">IntelCommand</a> itemByAddress(uint64 address); // returns a command at the given address + void destroy(); // destroys the function + <a href="#Folder">Folder</a> folder(); // returns the custom folder + void setFolder(<a href="#Folder">Folder</a> folder); // sets the custom folder +}; +</pre> + +<p id="IntelCommandType">Types of Intel commands:</p> +<pre class="code"> +enum IntelCommandType { + Unknown, Push, Pop, Mov, Add, Xor, Test, Lea, Ud0, Ret, Ssh, Crc, Call, Jmp, + Fstsw, Fsqrt, Fchs, Fstcw, Fldcw, Fild, Fist, Fistp, Fld, Fstp, Fst, Fadd, + Fsub, Fsubr, Fisub, Fisubr, Fdiv, Fcomp, Fmul, Repe, Repne, Rep, DB, DW, DD, DQ, + Movs, Cmps, Scas, Movzx, Movsx, Inc, Dec, Les, Lds, Lfs, Lgs, Lss, Xadd, Bswap, + Jxx, And, Sub, Stos, Lods, Nop, Xchg, Pushf, Popf, Sahf, Lahf, Shl, Shr, Sal, + Sar, Rcl, Rcr, Rol, Ror, Shld, Shrd, Loope, Loopne, Loop, Jcxz, In, Ins, Out, + Outs, Wait, Cbw, Cwde, Cdqe, Cwd, Cdq, Cqo, Clc, Stc, Cli, Sti, Cld, Std, Not, + Neg, Div, Imul, Idiv, Mul, Or, Adc, Cmp, Sbb, Pusha, Popa, Clflush, Pause, + Bound, Arpl, Daa, Das, Aaa, Aam, Aad, Aas, Enter, Leave, Int, Into, Iret, Set, + Cmov, Addpd, Addps, Addsd, Addss, Andpd, Andps, Andnpd, Andnps, Cmppd, Cmpps, + Cmpsd, Cmpss, Comisd, Comiss, Cvtdq2ps, Cvtpd2dq, Cvtdq2pd, Cvtpd2pi, Cvtps2pi, + Cvtpd2ps, Cvtps2pd, Cvtpi2pd, Cvtpi2ps, Cvtps2dq, Cvtsd2si, Cvtss2si, Cvtsd2ss, + Cvtss2sd, Cvttpd2pi, Cvttps2pi, Cvttpd2dq, Cvttps2dq, Cvttsd2si, Cvttss2si, + Divpd, Divps, Divsd, Divss, Maxpd, Maxps, Maxsd, Maxss, Minpd, Minps, Minsd, + Minss, Mulpd, Mulps, Mulsd, Mulss, Orpd, Orps, Movd, Movq, Movntq, Movapd, Movaps, + Movdqa, Movdqu, Movdq2q, Movq2dq, Movhlps, Movhpd, Movhps, Movlhps, Movlpd, + Movlps, Movmskpd, Movmskps, Movnti, Movntpd, Movntps, Movsd, Movss, Movupd, + Movups, Pmovmskb, Psadbw, Pshufw, Pshufd, Pshuflw, Pshufhw, Psubb, Psubw, Psubd, + Psubq, Psubsb, Psubsw, Psubusb, Psubusw, Paddb, Paddw, Paddd, Paddq, Paddsb, + Paddsw, Paddusb, Paddusw, Pavgb, Pavgw, Pinsrw, Pextrw, Pmaxsw, Pmaxub, Pminsw, + Pminub, Pmulhuw, Pmulhw, Pmullw, Pmuludq, Psllw, Pslld, Psllq, Pslldq, Psraw, + Psrad, Psrlw, Psrld, Psrlq, Psrldq, Punpcklbw, Punpcklwd, Punpckldq, Punpcklqdq, + Punpckhqdq, Packusdw, Pcmpgtb, Pcmpgtw, Pcmpgtd, Pcmpeqb, Pcmpeqw, Pcmpeqd, + Emms, Packsswb, Packuswb, Punpckhbw, Punpckhwd, Punpckhdq, Packssdw, Pand, + Pandn, Por, Pxor, Pmaddwd, Rcpps, Rcpss, Rsqrtss, Movsxd, Shufps, Shufpd, Sqrtpd, + Sqrtps, Sqrtsd, Sqrtss, Subpd, Subps, Subsd, Subss, Ucomisd, Ucomiss, Unpckhpd, + Unpckhps, Unpcklpd, Unpcklps, Xorpd, Xorps, Bt, Bts, Btr, Btc, Xlat, Cpuid, + Rsm, Bsf, Bsr, Cmpxchg, Cmpxchg8b, Hlt, Cmc, Lgdt, Sgdt, Lidt, Sidt, Smsw, Lmsw, + Invlpg, Lar, Lsl, Clts, Invd, Wbinvd, Ud2, Wrmsr, Rdtsc, Rdmsr, Rdpmc, Fcom, + Fdivr, Fiadd, Fimul, Ficom, Ficomp, Fidiv, Fidivr, Faddp, Fmulp, Fsubp, Fsubrp, + Fdivp, Fdivrp, Fbld, Fbstp, Ffree, Frstor, Fsave, Fucom, Fucomp, Fldenv, Fstenvm, + Fxch, Fabs, Fxam, Fld1, Fldl2t, Fldl2e, Fldpi, Fldlg2, Fldln2, Fldz, Fyl2x, + Fptan, Fpatan, Fxtract, Fprem1, Fdecstp, Fincstp, Fprem, Fyl2xp1, Fsincos, Frndint, + Fscale, Fsin, Fcos, Ftst, Fstenv, F2xm1, Fnop, Finit, Fclex, Fcompp, Sysenter, + Sysexit, Sldt, Str, Lldt, Ltr, Verr, Verw, Sfence, Lfence, Mfence, Prefetchnta, + Prefetcht0, Prefetcht1, Prefetcht2, Prefetch, Prefetchw, Fxrstor, Fxsave, Ldmxcsr, + Stmxcsr, Fcmovb, Fcmove, Fcmovbe, Fcmovu, Fcmovnb, Fcmovne, Fcmovnbe, Fcmovnu, + Fucomi, Fcomi, Fucomip, Fcomip, Fucompp, Vmcall, Vmlaunch, Vmresume, Vmxoff, + Monitor, Mwait, Xgetbv, Xsetbv, Vmrun, Vmmcall, Vmload, Vmsave, Stgi, Clgi, + Skinit, Invlpga, Swapgs, Rdtscp, Syscall, Sysret, Femms, Getsec, Pshufb, Phaddw, + Phaddd, Phaddsw, Pmaddubsw, Phsubw, Phsubd, Phsubsw, Psignb, Psignw, Psignd, + Pmulhrsw, Pabsb, Pabsw, Pabsd, Movbe, Palignr, Rsqrtps, Vmread, Vmwrite, Svldt, + Rsldt, Svts, Rsts, Xsave, Xrstor, Vmptrld, Vmptrst, Maskmovq, Fnstenv, Fnstcw, + Fstp1, Fneni, Fndisi, Fnclex, Fninit, Fsetpm, Fisttp, Fnsave, Fnstsw, Fxch4, + Fcomp5, Ffreep, Fxch7, Fstp8, Fstp9, Haddpd, Hsubpd, Addsubpd, Addsubps, Movntdq, + Fcom2, Fcomp3, Haddps, Hsubps, Movddup, Movsldup, Cvtsi2sd, Cvtsi2ss, Movntsd, + Movntss, Lddqu, Movshdup, Popcnt, Tzcnt, Lzcnt, Pblendvb, Pblendps, Pblendpd, + Ptest, Movsxbw, Movsxbd, Movsxbq, Movsxwd, Movsxwq, Movsxdq, Muldq, Pcmpeqq, + Movntdqa, Xsaveopt, Maskmovdqu, Ud1, Pcmpgtq, Movzxbw, Movzxbd, Movzxbq, Movzxwd, + Movzxwq, Movzxdq +}; +</pre> + +<p id="IntelSegment">Intel segments:</p> +<pre class="code"> +enum IntelSegment { + None, + es, + cs, + ss, + ds, + fs, + gs +}; +</pre> + +<p id="IntelFlag">Intel flags:</p> +<pre class="code"> +enum IntelFlag { + C, + P, + A, + Z, + S, + T, + I, + D, + O +}; +</pre> + +<p id="IntelRegistr">Intel registers:</p> +<pre class="code"> +enum IntelRegistr { + eax, + ecx, + edx, + ebx, + esp, + ebp, + esi, + edi, + r8, + r9, + r10, + r11, + r12, + r13, + r14, + r15 +}; +</pre> + +<p id="IntelCommand">A class to work with an Intel command:</p> +<pre class="code"> +class IntelCommand { +public: + uint64 address(); // returns the address of the command + <a href="#IntelCommandType">IntelCommandType</a> type(); // returns the type of the command + string text(); // returns the text representation + int size(); // returns the size of the command + int dump(int index); // returns data of the command with the given index + <a href="#CommandLink">CommandLink</a> link(); // returns the command link + int flags(); // returns command flags + <a href="#IntelSegment">IntelSegment</a> baseSegment(); // returns the base segment + <a href="#IntelCommandType">IntelCommandType</a> preffix(); // returns the type of the prefix command + <a href="#IntelOperand">IntelOperand</a> operand(int index); // returns an operand with the given index +}; +</pre> + +<p id="OperandType">Operand types:</p> +<pre class="code"> +enum OperandType { + None, + Value, + Registr, + Memory, + SegmentRegistr, + ControlRegistr, + DebugRegistr, + FPURegistr, + HiPartRegistr, + BaseRegistr, + MMXRegistr, + XMMRegistr +}; +</pre> + +<p id="OperandSize">Operand sizes:</p> +<pre class="code"> +enum OperandSize { + Byte, + Word, + DWord, + QWord, + TByte, + OWord, + FWord +}; +</pre> + +<p id="IntelOperand">A class to work with an operand of the Intel command:</p> +<pre class="code"> +class IntelOperand { +public: + int type(); // returns the type of the operand + <a href="#OperandSize">OperandSize</a> size(); // returns the size of the operand + int registr(); // returns the register + int baseRegistr(); // returns the base register + int scale(); // returns the scale + uint64 value(); // returns the value +}; +</pre> + +<p id="CommandLinks">A class to work with the list of command links:</p> +<pre class="code" id="CommandLinks"> +class CommandLinks { +public: + <a href="#CommandLink">CommandLink</a> item(int index); // returns a link with the given index + int count(); // returns the number of links in the list +}; +</pre> + +<p id="LinkType">Link types:</p> +<pre class="code"> +enum LinkType { + None, + SEHBlock, + FinallyBlock, + DualSEHBlock, + FilterSEHBlock, + Jmp, + JmpWithFlag, + JmpWithFlagNSFS, + JmpWithFlagNSNA, + JmpWithFlagNSNS, + Call, + Case, + Switch, + Native, + Offset, + GateOffset, + ExtSEHBlock, + MemSEHBlock, + ExtSEHHandler, + VBMemSEHBlock +}; +</pre> + +<p id="CommandLink">A class to work with a command link:</p> +<pre class="code"> +class CommandLink { +public: + uint64 toAddress(); // returns the address the link refers + <a href="#LinkType">LinkType</a> type(); // returns the type of the link + <a href="#IntelCommand">IntelCommand</a> from(); // returns the parent command +}; +</pre> + +<p id="FFILibrary">A class to work with a library:</p> +<pre class="code"> +enum ParamType { + "void", + "byte", + "char", + "short", + "ushort", + "int", + "uint", + "long", + "ulong", + "size_t", + "float", + "double", + "string", + "pointer" +}; + +enum CallType { + "default", + "cdecl", + "stdcall" +}; + +class FFILibrary { +public: + string name(); // returns the name + uint64 address(); // returns the address in the memory + void close(); + FFIFunction getFunction(string name, ParamType ret, ParamType param1, ...); // returns a function + FFIFunction getFunction(string name, table (ParamType ret, CallType abi, ParamType, ...)); // returns a function +}; +</pre> + +<p id="FFIFunction">A class to work with a foreign function:</p> +<pre class="code"> +class FFIFunction { + string name(); // returns the name + uint64 address(); // returns the address in the memory +}; +</pre> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html>
\ No newline at end of file diff --git a/help/en/script_events.htm b/help/en/script_events.htm new file mode 100644 index 0000000..cd94d7d --- /dev/null +++ b/help/en/script_events.htm @@ -0,0 +1,61 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Events</title> +</head> + +<body> + <h1>Events</h1> + + <p>The built in script language is an efficient way to automate creation of protected applications with VMProtect. Procedures and functions required at various stages of building the protected file are invoked in certain events processed by the VMProtect core. You can set your own handlers for 5 events that are called by the VMProtect core in the following order:</p> + + <ul> + <li><a href="#OnBeforeCompilation">OnBeforeCompilation</a></li> + <li><a href="#OnBeforeSaveFile">OnBeforeSaveFile</a></li> + <li><a href="#OnBeforePackFile">OnBeforePackFile</a></li> + <li><a href="#OnAfterSaveFile">OnAfterSaveFile</a></li> + <li><a href="#OnAfterCompilation">OnAfterCompilation</a></li> + </ul> + <a name="OnBeforeCompilation" /><pre class="code">function OnBeforeCompilation() + +end</pre> + + <p>This event is invoked when the list of protection objects is created. In the OnBeforeCompilation handler, you can add new procedures to the project, or modify or delete already existing ones.</p> + <a name="OnBeforeSaveFile" /><pre class="code">function OnBeforeSaveFile() + +end</pre> + + <p>The event is invoked before all objects created during compilation are written to the output file. In the OnBeforeSaveFile event handler you can change the file and its properties (such as the list of resources, the list of exported function, section names etc.) that are automatically written to the output file.</p> + <a name="OnBeforePackFile" /><pre class="code">function OnBeforePackFile() + +end</pre> + + <p>The event is invoked before packing the protected file of the application. With OnBeforePackFile you can modify a file that is to be packed. This event is only invoked is the "Pack output file" option is enabled.</p> + <a name="OnAfterSaveFile" /><pre class="code">function OnAfterSaveFile() + +end</pre> + + <p>This event is invoked after writing all objects created during compilation to the output file. The event handler can add new data to the output file or change previously written ones.</p> + <a name="OnAfterCompilation" /><pre class="code">function OnAfterCompilation() + +end</pre> + + <p>The even is invoked after compiling all objects of the project. At this stage a user has access to the compiled project, and can perform any actions with it, like adding a digital sign (certificate).</p><br/> + <p>When writing even handlers you can create your own procedures and functions. Event names are displayed with a bold font in the script editor.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html>
\ No newline at end of file diff --git a/help/en/script_functions.htm b/help/en/script_functions.htm new file mode 100644 index 0000000..3d75a65 --- /dev/null +++ b/help/en/script_functions.htm @@ -0,0 +1,46 @@ +<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>Built-in functions</title> +</head> + +<body> + <h1>Built-in functions</h1> + + <p>Aside from class methods and properties of the script language, VMProtect offers to a user various functions to perform basic operations. There are general system functions to work with strings, dates and numbers, process the command line of an application and display messages; and specialized functions to work with the VMProtect core and watermarks:</p> + + <ul> + <li><a href="http://www.lua.org/manual/5.2/manual.html#6.4">string</a></li> + <li><a href="http://www.lua.org/manual/5.2/manual.html#6.5">table</a></li> + <li><a href="http://www.lua.org/manual/5.2/manual.html#6.6">math</a></li> + <li><a href="http://www.lua.org/manual/5.2/manual.html#6.7">bit32</a></li> + <li><a href="http://www.lua.org/manual/5.2/manual.html#6.8">io</a></li> + <li><a href="http://www.lua.org/manual/5.2/manual.html#6.9">os</a></li> + <li><a href="#VMProtect">vmprotect</a></li> + </ul> + <a name="VMProtect"></a> + <pre class="code"> +namespace vmprotect { + <a href="script_classes.htm#Core">Core</a> core(); // returns the VMProtect core + string extractFilePath(string name); // extracts the path of a file + string extractFileName(string name); // extracts the name of a file + string extractFileExt(string name); // extracts the extension of a file + table commandLine(); // returns the command line + <a href="script_classes.htm#FFILibrary">FFILibrary</a> openLib(string name); // opens a library +}; +</pre> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/sdk_functions.htm b/help/en/sdk_functions.htm new file mode 100644 index 0000000..2c7857e --- /dev/null +++ b/help/en/sdk_functions.htm @@ -0,0 +1,161 @@ +<!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>SDK functions</title> +</head> + +<body> + <h1>SDK functions</h1> + + <p>SDK functions can be integrated to the source code of the protected application to set boundaries of the protected areas, to detect debuggers or virtualization tools.</p> + + <p><strong>Code markers</strong></p> + + <ul> + <li><a href="#VMProtectBegin">VMProtectBegin</a></li> + <li><a href="#VMProtectBeginVirtualization">VMProtectBeginVirtualization</a></li> + <li><a href="#VMProtectBeginMutation">VMProtectBeginMutation</a></li> + <li><a href="#VMProtectBeginUltra">VMProtectBeginUltra</a></li> + <li><a href="#VMProtectBeginVirtualizationLockByKey">VMProtectBeginVirtualizationLockByKey</a></li> + <li><a href="#VMProtectBeginUltraLockByKey">VMProtectBeginUltraLockByKey</a></li> + <li><a href="#VMProtectEnd">VMProtectEnd</a></li> + </ul> + + <p><strong>Service functions</strong></p> + + <ul> + <li><a href="#VMProtectIsProtected">VMProtectIsProtected</a></li> + <li><a href="#VMProtectIsDebuggerPresent">VMProtectIsDebuggerPresent</a></li> + <li><a href="#VMProtectIsVirtualMachinePresent">VMProtectIsVirtualMachinePresent</a></li> + <li><a href="#VMProtectIsValidImageCRC">VMProtectIsValidImageCRC</a></li> + <li><a href="#VMProtectDecryptStringA">VMProtectDecryptStringA</a></li> + <li><a href="#VMProtectDecryptStringW">VMProtectDecryptStringW</a></li> + <li><a href="#VMProtectFreeString">VMProtectFreeString</a></li> + </ul> + + <p><strong>Licensing functions</strong></p> + + <ul> + <li><a href="manager/usage/api.htm">VMProtectSetSerialNumber</a></li> + <li><a href="manager/usage/api.htm">VMProtectGetSerialNumberState</a></li> + <li><a href="manager/usage/api.htm">VMProtectGetSerialNumberData</a></li> + <li><a href= "manager/usage/api.htm">VMProtectGetCurrentHWID</a></li> + </ul> + + <p id="VMProtectBegin"><strong>VMProtectBegin</strong></p> + <pre class="code">void VMProtectBegin(const char *MarkerName); +</pre> + + <p>The <a href="use_markers.htm">marker</a> identifying the beginning of the protected area of the code. A call to VMProtectBegin must be placed before the first command (or procedure or function call) of the protected code block. + MarkerName defines the name of the marker that looks like "VMProtectMarker"+MarkerNamе in VMProtect. For example, a marker + VMProtectBegin('CheckRegistration') will look as + VMProtectMarker "CheckRegistration". If the name of the marker is not set, it is given a unique name in the form of "VMProtectMarker"+marker_serial_number. You can set the <a href= + "project_functions.htm#CompilationTypes">compilation type</a> of the given protected block in VMProtect.</p> + + <p id="VMProtectBeginVirtualization"><strong>VMProtectBeginVirtualization</strong></p> + <pre class="code">void VMProtectBeginVirtualization(const char *MarkerName); +</pre> + + <p>The marker identifying the beginning of the protected area of the code with the predefined "virtualization" compilation type. + MarkerName defines the <a href="#VMProtectBegin">name of the marker</a>. + The compilation type of this marker cannot be changed during further work with VMProtect.</p> + + <p id="VMProtectBeginMutation"><strong>VMProtectBeginMutation</strong></p> + <pre class="code">void VMProtectBeginMutation(const char *MarkerName); +</pre> + + <p>The marker identifying the beginning of the protected area of the code with the predefined "mutation" compilation type. MarkerName defines the <a href="#VMProtectBegin">name of the marker</a>. + The compilation type of this marker cannot be changed during further work with VMProtect.</p> + + <p id="VMProtectBeginUltra"><strong>VMProtectBeginUltra</strong></p> + <pre class="code">void VMProtectBeginUltra(const char *MarkerName); +</pre> + + <p>The marker identifying the beginning of the protected area of the code with the predefined "ultra (virtualization+mutation)" compilation type. MarkerName defines the <a href="#VMProtectBegin">name of the marker</a>. The compilation type of this marker cannot be changed during further work with VMProtect.</p> + + <p id="VMProtectBeginVirtualizationLockByKey"><strong>VMProtectBeginVirtualizationByKey</strong></p> + <pre class="code">void VMProtectBeginVirtualizationLockByKey(const char *MarkerName); +</pre> + + <p>The marker identifying the beginning of the protected area of the code with the predefined "virtualization" compilation type and the enabled <a href= + "project_functions.htm#LockToKey">"Lock to key"</a> option. + MarkerName defines the <a href="#VMProtectBegin">name of the marker</a>. The compilation type of this marker cannot be changed during further work with VMProtect.</p> + + <p id="VMProtectBeginUltraLockByKey"><strong>VMProtectBeginUltraLockByKey</strong></p> + <pre class="code">void VMProtectBeginUltraLockByKey(const char *MarkerName); +</pre> + + <p>The marker identifying the beginning of the protected area of the code with the predefined "ultra (virtualization+mutation)" compilation type and the enabled <a href= + "project_functions.htm#LockToKey">"Lock to key"</a> option. MarkerName defines the <a href="#VMProtectBegin">name of the marker</a>. The compilation type of this marker cannot be changed during further work with VMProtect.</p> + + <p id="VMProtectEnd"><strong>VMProtectEnd</strong></p> + <pre class="code">void VMProtectEnd(void); +</pre> + + <p>The marker identifying the end of the protected area of the code. The call to VMProtectEnd must be placed after the last command (procedure or function call) of the protected code block.</p> + + <p id="VMProtectIsProtected"><strong>VMProtectIsProtected</strong></p> + <pre class="code">bool VMProtectIsProtected(void); +</pre> + + <p>The VMProtectIsProtected function returns True if the file is processed by VMProtect.</p> + + <p id="VMProtectIsDebuggerPresent"><strong>VMProtectIsDebuggerPresent</strong></p> + <pre class="code">bool VMProtectIsDebuggerPresent(bool CheckKernelMode); +</pre> + + <p>The VMProtectIsDebuggerPresent function allows to detect the launch of the application under a debugger. The result + (True/False) can be processed with in-app protection mechanisms. If CheckKernelMode=False the function checks for User-mode debuggers (OllyDBG, WinDBG etc.). If CheckKernelMode=True, both User-mode and Kernel-mode debuggers (SoftICE, + Syser etc.). When protecting drivers, the value of CheckKernelMode does not make sense, because drivers always work in the kernel mode, so presence of kernel-mode debugger is always checked.</p> + + <p id="VMProtectIsVirtualMachinePresent"><strong>VMProtectIsVirtualMachinePresent</strong></p> + <pre class="code">bool VMProtectIsVirtualMachinePresent(void); +</pre> + + <p>The VMProtectIsVirtualMachinePresent function allows to detect the launch of the application under a virtual machine tool: VMware, Virtual PC, + VirtualBox, Sandboxie. The result + (True/False) can be processed with in-app protection mechanisms.</p> + + <p id="VMProtectIsValidImageCRC"><strong>VMProtectIsValidImageCRC</strong></p> + <pre class="code">bool VMProtectIsValidImageCRC(void); +</pre> + + <p>The VMProtectIsValidImageCRC function detects the fact that the executable module has been changed in the memory of the process (only unchangeable segments of code and data are checked). The result + (True/False) can be processed with in-app protection mechanisms.</p> + + <p id="VMProtectDecryptStringA"><strong>VMProtectDecryptStringA</strong></p> + <pre class="code">const char * VMProtectDecryptStringA(const char *Value); +</pre> + + <p>The VMProtectDecryptStringA function decrypts the ANSI string constant - Value. To decrypt the constant, you must <a href="project_functions.htm#AddFunction">include it to the list of protected objects + </a>.</p> + + <p id="VMProtectDecryptStringW"><strong>VMProtectDecryptStringW</strong></p> + <pre class="code">const wchar_t * VMProtectDecryptStringW(const wchar_t *Value); +</pre> + + <p>The VMProtectDecryptStringW function decrypts the Unicode string constant - Value. To decrypt the constant, you must <a href="project_functions.htm#AddFunction">include it to the list of protected objects</a>.</p> + + <p id="VMProtectFreeString"><strong>VMProtectFreeString</strong></p> + <pre class="code">bool VMProtectFreeString(const void *Value); +</pre> + + <p>The VMProtectFreeString function frees dynamic memory allocated for the decrypted string. It is not necessary to free up memory, but if you do this - you must use this function. + If VMProtectDecryptStringA/VMProtectDecryptStringW are used with the same parameters for the second time without destroying previously decrypted string, additional memory is not allocated.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/software_protection.htm b/help/en/software_protection.htm new file mode 100644 index 0000000..20a5640 --- /dev/null +++ b/help/en/software_protection.htm @@ -0,0 +1,52 @@ +<!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>Analysis, cracking and protection of software</title> +</head> + +<body> + <h1>Analysis, cracking and protection of software</h1> + + <p>A software product can be analyzed by means of static or dynamic analysis. Static analysis means protection cracking algorithm is based on disassembly results analysis or on decompiling of the protected application. Dynamic analysis is required to crack encrypted or dynamically changing executables, because static analysis of such programs proved to be difficult.</p> + + <p>For dynamic analysis, the program being cracked is executed in a debugger framework. This way, everything that happens during operation of the program can be controlled by the debugger. During dynamic analysis, a cracker uses the debug mode to bypass all protection algorithms of the program one by one, in particular registration key generation and check procedures. Another tool dynamic analysis often use is tracking of files, system services, ports and external devices the cracked program queries.</p> + + <p>The main instruments to protect applications from cracking attempts are <a href= + "dictionary.htm#Protector">software protectors</a>. Protection most of protectors provide is based on + <a href="dictionary.htm#Pack">packing</a> and/or <a href= + "dictionary.htm#Crypt">encryption</a> of the original executable with great focus put on protecting unpacking/decryption procedures.</p> + + <p>Such an algorithm is often insufficient to provide reliable protection. If an application is protected by packing, a hacker can easily obtain the original unpacked file as soon as he makes the memory dump right after the unpacker finishes its work. Moreover, there are multiple automated tools to crack the most popular protectors. The same is true for encryption: after obtaining a proper license key (often purchased legally), a cracker can decrypt protected parts of the code.</p> + + <p>Some software protectors use a number of anti-debug techniques. However, each one of them significantly influences the performance of the protected program. Also, anti-debug methods are only effective against dynamic analysis and are completely inefficient against static analysis. Even more, all anti-debug methods modern protectors use are well-known and studied, and crackers have programmed many utilities to avoid or bypass them. Activity monitors are not affected by the built-in anti-debug protection at all.</p> + + <p>More efficient ways to protect an application are + <a href="dictionary.htm#Obfuscation">obfuscation</a> and <a href= + "dictionary.htm#Virtualization">virtualization</a> that complicate analysis of the protected application's code. Generally, high efficiency of these protection method is based on the human factor: the more complex the code is and the more resources the application uses, the harder it is for a cracker to understand program logic and, consequently, to crack protection.</p> + + <p>Obfuscation "entangles" the code of an application by adding excessive instructions to it. Virtualization transforms the source code to the <a href= + "dictionary.htm#ByteCode">bytecode</a> executed by a special interpreter that imitates a virtual machine with a specific set of commands. + Therefore, virtualization leads to high and irreducible level of complexity of the resulting code, and if applied properly, the code protected with such a method does not contain methods to restore the original code explicitly. + So, the main advantage of virtualization is that a virtualized fragment of the code doesn't transform to machine language commands during execution, and this in turn prevents obtaining of the original code of the application by a cracker.</p> + + <p>Reverse engineering of virtualized fragments is reduced to analysis of the architecture of a <a href= + "dictionary.htm#VirtualMachine">virtual machine</a>, building a disassembler for the corresponding architecture of a processor imitated by the virtual machine, and analysis of the disassembled code. A properly implemented virtual machine makes creating a disassembler for it quite a difficult task. The only disadvantage of virtualization is relatively low execution speed, so this method should only be applied to parts of the code that are non-critical to execution speed.</p> + + <p>Most of today's protectors do not put much attention to obfuscation and virtualization, or their implementation is poor. This allows crackers to remove such protection in automatic or semi-automatic mode. Another bottleneck of modern protectors is use of undocumented Windows functions, which leads to limited operation of the protected application in newer versions of the OS, or if DEP is enabled.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/terms.htm b/help/en/terms.htm new file mode 100644 index 0000000..4f039c2 --- /dev/null +++ b/help/en/terms.htm @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" + "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + <meta name="AppleIcon" content="VMProtect.help/logo.png" /> + <meta name="AppleTitle" content="VMProtect 3.0 Help" /> + + <title>Introduction</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {align:center} + hr.c1 {height:1px;border-width:0;color:gray;background-color:gray} + /*]]>*/ + </style> +</head> + +<body> + <h1>Introduction</h1> + + <p>There is no an ideal way to protect software from unauthorized use and distribution. No existing systems can provide absolute security and prevent a potential hacker from neutralizing it. However, using quality and efficient protection can make cracking of software extremely difficult up to complete inadvisability in terms of time and efforts put into breaking the protection. While software protection can pursue different goals, the basis of any protection system is securing the application from analysis, because it is resistance to reverse engineering that shapes overall efficiency of the protection system.</p> + + <ul> + <li><a href="dictionary.htm">Glossary</a></li> + + <li><a href="software_protection.htm">Analysis, cracking and protection of software</a></li> + + <li><a href="about_vmprotect.htm">What is + VMProtect?</a></li> + + <li><a href="recommendations.htm">Recommendations on protecting your application</a></li> + </ul> + + <div class=unhide_if_no_site style="visibility:hidden"> + <h2>See also</h2> + + <ul> + <li><a href="http://vmpsoft.com/support/user-manual-v3/">The latest version of this manual on our website</a></li> + </ul> + </div> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/toolbar.htm b/help/en/toolbar.htm new file mode 100644 index 0000000..863c236 --- /dev/null +++ b/help/en/toolbar.htm @@ -0,0 +1,39 @@ +<!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>Toolbar</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Toolbar</h1> + + <p>The toolbar consists of the following elements:</p> + + <ul> + <li>Open a project or a protected file: <img src="images/button_open.png" /></li> + <li>Save the project: <img src="images/button_save.png" /></li> + <li>Name of the protected file: <br /> <img src="images/button_project.png" /></li> + <li>Compile the project: <img src="images/button_compilation.png" /></li> + <li>Execute the original/protected file (pressing the down arrow allows to specify command line parameters): <img src="images/button_execute.png" /></li> + <li>Default action (depends on the selected section): <br /><img src="images/button_action.png" /></li> + <li>Quick search box: <br /><img src="images/button_search.png" /></li> + </ul> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/use_map_file.htm b/help/en/use_map_file.htm new file mode 100644 index 0000000..cb9e1dd --- /dev/null +++ b/help/en/use_map_file.htm @@ -0,0 +1,45 @@ +<!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>Using a MAP-file</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Using a MAP-file</h1> + + <p>To create a MAP-file you should enable the corresponding option in the compiler settings.</p> + + <h3>Visual Studio</h3> + + <p>If you develop your application in Visual Studio, this can be done as follows: in the main menu of the IDE, open the project properties (Project - Properties), then on the "Linker - Debugging" tab set the + "Generate MAP File" option to "Yes (/MAP)":</p> + <p><img src="images/visual_studio_map.png" /></p> + + <h3>Borland Delphi</h3> + + <p>If you develop the application using Borland Delphi, + the same can be done as follows: in the main menu of the Delphi IDE open the project options(Project - Options) and on the "Linker" tab set the "MAP file" section option to "Detailed":</p> + <p><img src="images/delphi_map.png" /></p> + + <p>After you enabled MAP-file generation, the project must be rebuilt.</p> + + <p>Upon loading of a MAP-file VMProtect compares modification date and time of the MAP-file and those of the protected file. If they are different, the MAP-file is not loaded.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/use_markers.htm b/help/en/use_markers.htm new file mode 100644 index 0000000..cacca98 --- /dev/null +++ b/help/en/use_markers.htm @@ -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>Using markers</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + /*]]>*/ + </style> +</head> + +<body> + <h1>Using markers</h1> + + <p>To protect individual fragments of the code and to protect string constants, you can insert special markers to the source code of your application. Markers are calls to functions imported from the external library (32-bit applications use + VMProtectSDK32.dll, and 64-bit applications use VMProtectSDK64.dll; drivers use VMProtectDDK32.sys and + VMProtectDDK64.sys respectively) - further referred to as + VMProtectSDK. Procedures and functions in VMProtectSDK do not perform any actions and are merely labels VMProtect uses to determine boundaries of the protected code. The beginning and the end of the protected block are marked as follows:</p> + + <ul> + <li><strong>Delphi</strong> + <pre class="code">uses VMProtectSDK; + +VMProtectBegin(MARKER_TITLE); +... +VMProtectEnd; +</pre> + </li> + + <li><strong>C/C++</strong> + <pre class="code">#include "VMProtectSDK.h" + +VMProtectBegin(MARKER_TITLE); +... +VMProtectEnd(); +</pre> + </li> + + <li><strong>MASM</strong> + <pre class="code">include VMProtectSDK.inc + +invoke VMProtectBegin,SADD(MARKER_TITLE) +... +invoke VMProtectEnd +</pre> + </li> + + <li><strong>Visual Basic</strong> + <pre class="code">VMProtectBegin (StrPtr(MARKER_TITLE)) +... +VMProtectEnd +</pre> + </li> + </ul> + + <p>Also, instead of VMProtectBegin you can use markers with the predefined <a href= + "project_functions.htm#CompilationTypes">compilation types</a>:</p> + + <ul> + <li>VMProtectBeginVirtualization - the marker uses the "Virtualization" compilation type.</li> + + <li>VMProtectBeginMutation - the marker uses the "Mutation" compilation type.</li> + + <li>VMProtectBeginUltra - the marker uses the "Ultra" compilation type.</li> + </ul> + + <p>Markers are processed as follows: when VMProtect analyzes the code of the protected application, it locates all calls to + VMProtectSDK procedures and functions. Boundaries of blocks to protect are defined by marker pairs + VMProtectBegin/VMProtectBeginVirtualization/VMProtectBeginMutation/VMProtectBeginUltra + and VMProtectEnd. Then, when VMProtect processes the code of the protected application, it removes both the markers and any mentions of the VMProtectSDK, so there is no need to include these libraries to your setup package. Markers are removed regardless of whether they are included to compilation or not. When named markers are used, their names are also removed.</p> + + <p>If a title for the marker is specified, it is assigned with the name like + "VMProtectMarker MARKER_TITLE". If a title of the marker is not specified, it is assigned with a unique name: + "VMProtectMarker"+marker serial number. However, using non-named markers has a significant disadvantage: if a new marker will be inserted to the code of the program, numeration of all non-named markers will change. So we recommend to always use named markers.</p> + + <p>A particularly important thing to consider when working with markers is that you shouldn't allow jumps from non-protected areas inside the marker. This can happen, for example, if you enclose a part of a cycle in markers. If the application that uses markers becomes non-functional after protection, you can detect jumps from non-protected areas and addresses by enabling the "Debug mode" option. In this mode, when the protected application works under the debugger, the latter will interrupt execution of the program if a jump from a non-protected area into the protected debugger is detected. When all such jumps are found, you should either change placement of the markers, or if this is impossible, mark those addresses as external using the GUI version of VMProtect.</p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/watermarks.htm b/help/en/watermarks.htm new file mode 100644 index 0000000..df7d2bf --- /dev/null +++ b/help/en/watermarks.htm @@ -0,0 +1,38 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Watermarks</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Watermarks</h1> + + <p>VMProtect offers a unique ability to add hidden information about the owner of the protected file to this file. A watermark is an array of bytes that should be unique to each user. If watermarks are incorporated to the protected file, you can always determine the owner of the leaked copy (for instance, if the cracked program is distributed) and act accordingly. The watermark database file is stored in "%ApplicationData%/VMProtect Software/VMProtect.dat" + for Windows and in "/Users/Shared/VMProtect Software/VMProtect.dat" + for Mac OS X.</p> + + <p>The "Watermarks" dialog window contains two tabs:</p> + + <ul> + <li><a href="watermarks_setup.htm">Setup</a></li> + <li><a href="watermarks_search.htm">Search</a></li> + </ul><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/watermarks_search.htm b/help/en/watermarks_search.htm new file mode 100644 index 0000000..494ec8b --- /dev/null +++ b/help/en/watermarks_search.htm @@ -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>Searching for watermarks</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Searching for watermarks</h1> + + <p>The "Search" tab of the watermark dialog allows you to locate watermarks in an executable or a specified process of the protected application:</p> + <p><img src="images/watermarks_search.png" /></p> + + <ul> + <li><strong>Search in file</strong> - look for watermarks in the application executable. Select a file in the "File Name" field where you want to look for watermarks in;</li> + + <li><strong>Search in module</strong> - search in a module of the selected process. Select a running process in the drop-down list, then select a module of this process to search watermarks in.</li> + </ul> + + <p>Results of the search are displayed in the list below:</p> + + <ul> + <li><strong>Name</strong> - the name of the found watermark;</li> + + <li><strong>Count</strong> - the number of copies of the found watermark.</li> + </ul> + + <p><strong>Important:</strong><br /> + When you search for watermarks in an unpacked executable, any of this modes will do. However, if an executable is <a href="dictionary.htm#Pack">packed</a>, you should search for watermarks in the running application only (the "Search in module" mode). Searching in the executable in this case is useless as watermarks (as well as the code and data) are packed and are only unpacked when the application is running.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/en/watermarks_setup.htm b/help/en/watermarks_setup.htm new file mode 100644 index 0000000..44b609a --- /dev/null +++ b/help/en/watermarks_setup.htm @@ -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>Watermark setup</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Watermark setup</h1> + + <p>The "Setup" tab of the "Watermarks" dialog is for managing watermarks:</p> + <p><img src="images/watermarks_setup.png" alt="Configuring watermarks" /></p> + + <p>To add a new watermark, click the corresponding button. The following dialog will open:</p> + <p><img src="images/watermarks_add.png" alt="Add a watermark" /></p> + + <ul> + <li><strong>Name</strong> - the name of the watermark;</li> + + <li><strong>Value</strong> - the value of the watermark. You can generate a random value for the watermark by clicking the "Generate" button. The "Value" field consists of two columns: the left column allows entering a Hex value, the right column - a symbolic value. When the watermark is inserted to the protected file, each "?" symbol is replaced with a random value.</li> + </ul> + <p>To remove or rename a watermark, use the right-click menu:</p> + <p><img src="images/watermarks_menu.png" alt="Watermark menu" /></p> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html>
\ No newline at end of file diff --git a/help/en/work.htm b/help/en/work.htm new file mode 100644 index 0000000..53bbe25 --- /dev/null +++ b/help/en/work.htm @@ -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>Working with VMProtect</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Working with VMProtect</h1> + + <p>Before you start working with VMProtect, please take a look at the following sections of the manual:</p> + + <ul> + <li><a href="create_project.htm">Project setup</a></li> + <li><a href="main_window.htm">Main window</a></li> + <li><a href="mode_console.htm">Console version</a></li> + </ul><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/pyblog.py b/help/pyblog.py new file mode 100644 index 0000000..cf5a089 --- /dev/null +++ b/help/pyblog.py @@ -0,0 +1,352 @@ +#!/usr/bin/python + + +"""" + Copyright 2008 Ritesh Nadhani. All Rights Reserved. + + For license information please check the LICENSE page of the package. + +""" + +''' A library that provides python interface to ''' + +from xmlrpc import client +import urllib.request + +# Helper function to check if URL exists + +def checkURL(url): + try: urllib.request.urlopen(url) + except IOError: return 0 + return 1 + +class BlogError(Exception): + + '''Base class for Blog errors''' + METHOD_NOT_SUPPORTED = 'Method not (yet) supported' + + def __init__(self, msg): + self.msg = msg + + def __repr__(self): + return self.msg + + __str__ = __repr__ + +class Blog(object): + """ + Base class for all blog object. Python interface to various blogging API + + This and extending class are just simple encapsulators over XML-RPC. It does nothing but call the corresponding XMLRPC functions and check for error. + + Rightnow, it returns Python based dictionary as it is returned by the server but later on we maybe encapsulate the data using simplified custon object. + """ + def __init__(self, serverapi, username, password, appkey): + """ + Args: + serverapi = URL to the XML-RPC API. + username = Username for the Blog account. + password = Password for the Blog account. + """ + self.username = username + self.password = password + self.appkey = appkey + self.methods = [] + + # Check if URL exists + if not checkURL(serverapi): + raise BlogError('XML-RPC API URL not found.') + + # Connect to the api. Call listMethods to keep a dictionary of available methods + self.server = client.ServerProxy(serverapi) + self.list_methods() + + def list_methods(self): + """Call systen.listMethods on server. + + Returns: + List of XML-RPC methods implemented by the server. + """ + if not len(self.methods): + try: + self.methods = self.server.system.listMethods() + except client.Fault as fault: + raise BlogError(fault.faultString) + + return self.methods.sort() + + def execute(self, methodname, *args): + + """ + Callback function to call the XML-RPC method + + Args: + methodname = XML-RPC methodname. + args = Arguments to the call. + """ + if not methodname in self.methods: + raise BlogError(BlogError.METHOD_NOT_SUPPORTED) + + try: + r = getattr(self.server, methodname)(args) + except client.Fault as fault: + raise BlogError(fault.faultString) + + return r + + def is_method_available(self, methodname): + """Returns if a method is supported by the XML-RPC server""" + if methodname in self.methods: + return True + else: + return False + +class Blogger(Blog): + """ + A Python interface to the blogger API. + """ + + def __init__(self, serverapi, username, password): + raise BlogError("This class has not yet been implemented") + +class MetaWeblog(Blog): + """ + Python interface to Metaweblog API + This class extends Blog to implement metaWeblog API + """ + + def __init__(self, serverapi, username, password, appkey='0x001'): + Blog.__init__(self, serverapi, username, password, appkey) + + def get_recent_posts(self, numposts=10, blogid=1): + """ + Returns 'numposts' number of recent post for the blog identified by 'blogid' + + Args: + numposts = Number of posts to be returned [optional] + blogid = id of thr blog + """ + return self.execute('metaWeblog.getRecentPosts', blogid, self.username, self.password, numposts) + + def get_post(self, postid): + """ + Returns dictionary based post content corresponding to postid. + + Args: + postid = Unique identifier for the post + """ + return self.execute('metaWeblog.getPost', postid, self.username, self.password) + + def new_post(self, content, publish=True, blogid=1): + """ + New post + + Args: + content = Dictionary containing post dat. + Publish = Publish status. + blogid = Blog ID + + """ + return self.execute('metaWeblog.newPost', blogid, self.username, self.password, content, publish) + + def edit_post(self, postid, newpost, publish=True): + """ + Edits a post identified by postid with content passed in newpost + + Args: + postid = post identified by postid. + newpost = dictionary with content details about the new post. + Publish = Publish status. + """ + return self.execute('metaWeblog.editPost', postid, self.username, self.password, newpost, publish) + + def delete_post(self, postid, publish=True): + """ + Deletes a post identified by postid + + Args: + postid = post identified by postid. + Publish = Publish status. + + """ + return self.execute('metaWeblog.deletePost', self.appkey, postid, self.username, self.password, publish) + + def get_categories(self, blogid=1): + """ + Returns a list of categories. + + Args: + blogid = Blog ID + """ + return self.execute('metaWeblog.getCategories', blogid, self.username, self.password) + + def get_users_blogs(self): + """ + Returns a list of blogs associated by the user. + + """ + return self.execute('metaWeblog.getUsersBlogs', self.appkey, self.username, self.password) + + def new_media_object(self, new_object, blogid=1): + """ + Args: + new_object = Structure containing information about new media object to be uploaded + blogid = Blog ID + + Returns: + URL to the uploaded file + + """ + return self.execute('metaWeblog.newMediaObject', blogid, self.username, self.password, new_object) + + def get_template(self, templateType, blogid=1): + """Returns the template type identifed by templateType""" + return self.execute("metaWeblog.getTemplate", self.appkey, blogid, self.username, self.password, templateType) + + def set_template(self, template, templateType, blogid=1): + + """Sets the new template value for templateType""" + return self.execute("metaWeblog.setTemplate", self.appkey, blogid, self.username, self.password, template, templateType) + +class WordPress(MetaWeblog): + """ + Python interface to Wordpress API + Wordpress basically implements all MetaWebLog and extends it by providing it with its methods. + """ + + def __init__(self, serverapi, username, password): + MetaWeblog.__init__(self, serverapi, username, password) + + def get_post_status_list(self, blogid=1): + """ + ( Draft, Pending Review, Private, Published ).Returns a dict of all the valid post statuses ( draft, pending, private, publish ) and their descriptions + ( Draft, Pending Review, Private, Published ). + """ + return self.execute('wp.getPostStatusList', blogid, self.username, self.password) + + def get_authors(self, blogid=1): + """ + Get a list of users for the blog. + """ + return self.execute('wp.getAuthors', blogid, self.username, self.password) + + def new_page(self, content, publish=True, blogid=1): + """ + Args: + content - Dictionary of new content + """ + return self.execute('wp.newPage', blogid, self.username, self.password, content, publish) + + def edit_page(self, pageid, content, publish=True, blogid=1): + """ + Args: + pageid = Page to edit + content - Dictionary of new content + """ + return self.execute('wp.editPage', blogid, pageid, self.username, self.password, content, publish) + + def delete_page(self, pageid, blogid=1): + """ + Args: + pageid = Page to delete + """ + return self.execute('wp.deletePage', blogid, self.username, self.password, pageid) + + def get_pages(self, blogid=1): + """ + Returns a list of the most recent pages in the system. + """ + return self.execute('wp.getPages', blogid, self.username, self.password) + + def get_page(self, pageid, blogid=1): + """ + Returns the content of page identified by pageid + """ + return self.execute('wp.getPage', blogid, pageid, self.username, self.password) + + def get_page_list(self, blogid=1): + """ + Get an list of all the pages on a blog. Just the minimum details, lighter than wp.getPages. + """ + return self.execute('wp.getPageList', blogid, self.username, self.password) + + def get_page_status_list(self, blogid=1): + """Returns a dict of all the valid page statuses ( draft, private, publish ) and their descriptions ( Draft, Private, Published)""" + + return self.execute('wp.getPageStatusList', blogid, self.username, self.password) + + def new_category(self, content, blogid=1): + """ + Args: + content = Dictionary content having data for new category. + + Returns id of new value + """ + return self.execute('wp.newCategory', blogid, self.username, self.password, content) + + def delete_category(self, catid, blogid=1): + """ + Args: + catid = Category ID + blogid = Blog ID + + """ + return self.execute('wp.deleteCategory', blogid, self.username, self.password, catid) + + def get_comment_count(self, postid=0, blogid=1): + """ + Provides a struct of all the comment counts ( approved, awaiting_moderation, spam, total_comments ) for a given postid. + The postid parameter is optional (or can be set to zero), if it is not provided then the same struct is returned, but for the + entire blog instead of just one post + """ + + return self.execute('wp.getCommentCount', blogid, self.username, self.password, postid) + + def get_users_blogs(self): + """ + Returns a list of blogs associated by the user. + """ + return self.execute('wp.getUsersBlogs', self.username, self.password) + + def get_options(self, options=[], blogid=1): + """ + Return option details. + + The parameter options, list, is optional. If it is not included then it will return all of the option info that we have. + With a populated list, each field is an option name and only those options asked for will be returned. + """ + return self.execute('wp.getOptions', blogid, self.username, self.password, options) + + def set_options(self, option, blogid=1): + """ + That option parameter is option name/value pairs. The return value is same as if you called wp.getOptions asking for the those option names, + only they'll include the new value. If you try to set a new value for an option that is read-only, it will silently fail and you'll get the original + value back instead of the new value you attempted to set. + """ + return self.execute('wp.setOptions', blogid, self.username, self.password, option) + + def suggest_categories(self, category, max_results=10, blogid=1): + """Returns a list of dictionaries of categories that start with a given string.""" + return self.execute('wp.suggestCategories', blogid, self.username, self.password, category, max_results) + + def upload_file(self, data, blogid=1): + """ + Upload a file. + + Data contains values as documented at http://codex.wordpress.org/XML-RPC_wp#wp.getCategories + """ + return self.execute('wp.uploadFile', blogid, self.username, self.password, data) + +class MovableType(MetaWeblog): + """ + A Python interface to the MovableType API. + """ + + def __init__(self, serverapi, username, password): + raise BlogError("This class has not yet been implemented") + +def main(): + pass + +if __name__ == '__main__': + main() diff --git a/help/pyblog.pyc b/help/pyblog.pyc Binary files differnew file mode 100644 index 0000000..8a6a03e --- /dev/null +++ b/help/pyblog.pyc diff --git a/help/ru/about_vmprotect.htm b/help/ru/about_vmprotect.htm new file mode 100644 index 0000000..e0718fc --- /dev/null +++ b/help/ru/about_vmprotect.htm @@ -0,0 +1,234 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Что такое VMProtect?</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Что такое VMProtect?</h1> + + <p>Программа VMProtect относится к новому поколению средств + защиты программного обеспечения. VMProtect поддерживает + компиляторы Delphi, Borland C Builder, Visual C/C++, Visual Basic + (native), Virtual Pascal, XCode, при этом VMProtect содержит встроенный + дизассемблер, позволяющий работать с исполняемыми файлами для операционных систем Windows и Mac OS X, + а также подключать MAP-файл, создаваемый компилятором, + для быстрого выбора участков кода, которые следует защитить. Для + автоматизации операций по защите приложения в VMProtect + реализован встроенный скриптовый язык. VMProtect обладает полной + поддержкой 32/64-разрядных операционных систем семейства Windows + (начиная с версии Win2k) и Mac OS X (начиная с версии 10.6), + при этом независимо от платформы VMProtect поддерживает весь спектр + исполняемых файлов (Windows версия может работать с файлами от Mac OS X и наоборот).</p> + + <p>Базовым принципом, на основе которого построен VMProtect, + является обеспечение эффективной защиты кода приложения от + изучения, так как именно максимальное усложнение понимания логики + работы внутренних механизмов защиты приложения создает + максимальные трудности при взломе программы. Основными методами + защиты программного кода, применяемыми VMProtect, являются + виртуализация, мутация и смешанный метод защиты, сочетающий + мутацию кода приложения с его последующей виртуализацией.</p> + + <p>Одним из достоинств реализации метода виртуализации в + программе VMProtect является то, что виртуальная машина, на + которой выполняются виртуализированные фрагменты кода, + встраивается в результирующий код защищаемого приложения. + Следовательно, для функционирования приложения, защищенного с + помощью VMProtect, нет необходимости использовать какие-либо + дополнительные библиотеки или модули. VMProtect позволяет + использовать несколько отличных друг от друга виртуальных машин + для защиты разных участков кода одного приложения, что еще больше + усложняет процесс взлома защиты, так как взломщику будет + необходимо анализировать архитектуру уже нескольких виртуальных + машин.</p> + + <p>Метод мутации кода приложения, реализованный в VMProtect, + основан на обфускации, в процессе которой в код приложения + добавляются "мусорные" команды, "мертвый" код, случайные условные + переходы, выполняется мутация оригинальных команд, а также + переносится в стек выполнение ряда операций.</p> + + <p>Ключевым отличием программы VMProtect от других протекторов + является то, что с ее помощью можно защитить различные участки + кода разными методами: часть кода виртуализировать, часть + обфусцировать, а для самых критичных участков применить смешанный + метод защиты.</p> + + <p>Для предотвращения ложных срабатываний со стороны антивирусов зарегистрированная + версия VMProtect использует библиотеку <a href="http://standards.ieee.org/develop/indconn/icsg/taggant.pdf">Taggant</a>, которая подписывает + защищаемый файл сертификатом владельца лицензии.</p> + + <p>Еще одной уникальной возможностью программы VMProtect является + включение в код приложения <a href= + "dictionary.htm#Watermarks">водяных знаков</a>, позволяющих + однозначно идентифицировать официального владельца взломанного + экземпляра программы, а следовательно, принять к нему + соответствующие меры.</p> + + <p>Программа VMProtect доступна в 3-х версиях:</p> + + <ul> + <li>Lite (облегченная версия);</li> + <li>Professional (базовая версия);</li> + <li>Ultimate (максимальная версия);</li> + </ul> + + <p>Отличия функциональных возможностей разных версий VMProtect + приведены в таблице:</p> + + <table border="1" cellspacing="0" cellpadding="2"> + <tr align="center"> + <td rowspan="2" align="center"> + <strong>Возможности</strong></td> + + <td colspan="3" align="center"><strong>Версия + VMProtect</strong></td> + </tr> + + <tr align="center"> + <td width="12%" align="center">Lite</td> + <td width="12%" align="center">Professional</td> + <td width="12%" align="center">Ultimate</td> + </tr> + + <tr bgcolor="#E0E0E0"> + <td align="left" colspan="4" class="c1"><strong>Методы + защиты</strong></td> + </tr> + + <tr> + <td>Мутация</td> + <td align="center">+</td> + <td align="center">+</td> + <td align="center">+</td> + </tr> + + <tr> + <td>Виртуализация</td> + <td align="center">+</td> + <td align="center">+</td> + <td align="center">+</td> + </tr> + + <tr> + <td>Ультра (мутация+виртуализация)</td> + <td align="center">+</td> + <td align="center">+</td> + <td align="center">+</td> + </tr> + + <tr> + <td>Консольная версия</td> + <td align="center">-</td> + <td align="center">+</td> + <td align="center">+</td> + </tr> + + <tr bgcolor="#E0E0E0"> + <td align="left" colspan="4"><strong>Опции + защиты</strong></td> + </tr> + + <tr> + <td>Защита памяти</td> + <td align="center">+</td> + <td align="center">+</td> + <td align="center">+</td> + </tr> + + <tr> + <td>Защита импорта</td> + <td align="center">+</td> + <td align="center">+</td> + <td align="center">+</td> + </tr> + + <tr> + <td>Защита ресурсов</td> + <td align="center">+</td> + <td align="center">+</td> + <td align="center">+</td> + </tr> + + <tr> + <td>Упаковка</td> + <td align="center">+</td> + <td align="center">+</td> + <td align="center">+</td> + </tr> + + <tr> + <td>Определение отладчика</td> + <td align="center">+</td> + <td align="center">+</td> + <td align="center">+</td> + </tr> + + <tr> + <td>Определение средств виртуализации</td> + <td align="center">+</td> + <td align="center">+</td> + <td align="center">+</td> + </tr> + + <tr bgcolor="#E0E0E0"> + <td align="left" colspan="4"><strong>Сервисные + функции</strong></td> + </tr> + + <tr> + <td>Водяные знаки</td> + <td align="center">-</td> + <td align="center">+</td> + <td align="center">+</td> + </tr> + + <tr> + <td>Скриптовый язык</td> + <td align="center">-</td> + <td align="center">+</td> + <td align="center">+</td> + </tr> + + <tr> + <td>Система лицензирования</td> + <td align="center">-</td> + <td align="center">-</td> + <td align="center">+</td> + </tr> + + <tr> + <td>Менеджер лицензий</td> + <td align="center">-</td> + <td align="center">-</td> + <td align="center">+</td> + </tr> + + <tr> + <td>Защита файлов</td> + <td align="center">-</td> + <td align="center">-</td> + <td align="center">+</td> + </tr> + </table> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/contacts.htm b/help/ru/contacts.htm new file mode 100644 index 0000000..59de03f --- /dev/null +++ b/help/ru/contacts.htm @@ -0,0 +1,41 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Контактная информация</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Контактная информация</h1> + + <p>По всем вопросам, связанным с работой программы или её + приобретением, обращайтесь к нам по адресу:<br /> + www: <a href= + "http://www.vmpsoft.com">http://www.vmpsoft.com</a><br /> + e-mail: <a href= + "mailto:info@vmpsoft.com">info@vmpsoft.com</a><br /> + icq uin: <a href= + "http://wwp.icq.com/scripts/search.dll?to=65107137">65107137</a><br /> + </p><a href="http://www.vmpsoft.com/news.php" target= + "_blank">Новости</a> | <a href="http://www.vmpsoft.com/buy.php" + target="_blank">Купить</a> | <a href= + "http://www.vmpsoft.com/forum/index.php" target= + "_blank">Форум</a><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/create_project.htm b/help/ru/create_project.htm new file mode 100644 index 0000000..02cf380 --- /dev/null +++ b/help/ru/create_project.htm @@ -0,0 +1,137 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Подготовка проекта</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Подготовка проекта</h1> + + <p>Для примера рассмотрим простейшее приложение, состоящее из + одной формы (Form1), элемента ввода текста (Edit1) и кнопки + (Button1). Работа приложения заключается в следующем: при нажатии + на кнопку Button1 проверяется корректность введенного пароля и + при этом выдается соответствующее сообщение.</p><br /> + <img src="images/delphi_project.png" /> + + <p>Пароль проверяется по простейшему алгоритму: сначала он + преобразуется в число, после чего определяется остаток от деления + данного числа на 17. Пароль считается правильным, если остаток от + деления числового представления пароля на 17 равен 13. Процедура + проверки пароля на языке программирования Delphi реализуется + следующим образом:</p> + <pre class="code">function TForm1.CheckPassword: Boolean; +begin + Result:=(StrToIntDef(Edit1.Text, 0) mod 17=13); +end; + +procedure TForm1.Button1Click(Sender: TObject); +begin + if CheckPassword then + MessageDlg('Correct password', mtInformation, [mbOK], 0) + else + begin + MessageDlg('Incorrect password', mtError, [mbOK], 0); + Edit1.SetFocus; + end; +end; +</pre> + + <p>Выбор защищаемых процедур и функций может осуществляться тремя + способами:</p> + + <ul> + <li>С <a href="use_map_file.htm">использованием MAP-файла</a>, + который формируется компилятором при создании исполняемого + модуля программы. В MAP-файле содержится вся необходимая + информация об именах и адресах всех процедур и функций + приложения. В случае использования MAP-файла при работе с + VMProtect выбор защищаемых процедур и функций может + осуществляться по имени. Используя МАР-файл, после + перекомпиляции проекта VMProtect автоматически определит новые + адреса процедур и функций.</li> + + <li>С <a href="use_markers.htm">использованием маркеров</a>, + которые вставляются в исходный код приложения. Маркеры + представляют собой специальные метки, по которым VMProtect + определяет границы защищаемого блока. Также VMProtect + поддерживает маркеры с предустановленным типом компиляции. + Использование маркеров целесообразно, если следует защитить + только часть процедуры или функции. При использовании маркеров + можно указать части кода, в которых в дальнейшем можно будет + защитить строковые константы.</li> + + <li>По адресам защищаемых процедур в исполняемом файле. По + сравнению с предыдущими данный способ менее удобен в + использовании, так как при любой доработке программы и, + соответственно, ее перекомпиляции будет необходимо определять + все адреса повторно. Данный способ рекомендуется лишь для + защиты программных продуктов, для которых отсутствуют исходные + тексты.</li> + </ul> + + <p>Использование MAP-файла для определения границ защищаемого + кода имеет еще один важный плюс, который требует отдельного + рассмотрения. Почти любая процедура или функция, обладающая + локальными переменными или использующая стек для хранения + регистров и/или промежуточных результатов вычислений, имеет так + называемые пролог и эпилог, находящиеся соответственно в начале и + в конце скомпилированной процедуры или функции:</p> + <pre class="code">push ebp \ +mov ebp, esp \ пролог +push 00 / +push ebx / + +... + +pop ebx \ +pop ecx \ эпилог +pop ebp / +ret / +</pre> + + <p>Из-за особенностей реализации современных компиляторов маркеры + кода никогда не охватывают пролог и эпилог (даже если маркерами + будет охвачен весь текст функции CheckPassword, находящийся между + begin и end). Для взлома будет достаточно откорректировать пролог + функции таким образом, чтобы виртуалированный код не был + выполнен. Для функции CheckPassword это можно сделать следующим + образом:</p> + <pre class="code">mov eax, 1 +ret +</pre> + + <p><strong>Важно:</strong><br /> + Если для выбора виртуализированных участков кода используется + MAP-файл, то пролог и эпилог будут тоже завиртуализированы, что + повысит защищенность программы. Более того, если одна + виртуализированная функция вызывается из другой + виртуализированной функции, то передача управления между ними + будет осуществлена без перехода на адрес вызываемой функции + (вызов будет представлять собой простой переход на другой адрес + байт-кода внутри исполнителя виртуальной машины), что также + повысит степень защищенности программы, так как внесенные + взломщиком в точку входа корректировки окажутся бесполезными. При + работе с виртуализированными функциями передача управления точке + входа в завиртуализированную функцию будет осуществлена лишь в + случае вызова защищенной функции из незащищенного или + промутированного участка кода.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/default.css b/help/ru/default.css new file mode 100644 index 0000000..2aed7c2 --- /dev/null +++ b/help/ru/default.css @@ -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; +} diff --git a/help/ru/dictionary.htm b/help/ru/dictionary.htm new file mode 100644 index 0000000..3914277 --- /dev/null +++ b/help/ru/dictionary.htm @@ -0,0 +1,107 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Словарь терминов</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Словарь терминов</h1> + + <p>Эффективное использование любого инструмента невозможно без + понимания терминологии, специфичной для соответствующей + предметной области. В данном глоссарии дана расшифровка + терминологии, применяемой в разрезе использования программы + VMProtect. Глоссарий не претендует на универсальность и + всеохватность, предложенное в нем толкование терминов может + отличаться от классического.</p> + + <p><a name="ByteCode" id="ByteCode"><strong>Байт-код</strong></a> - код, полученный после + преобразования машинных команд реального процессора в команды + виртуальной машины.</p> + + <p><a name="Virtualization" id="Virtualization"><strong>Виртуализация</strong></a> - процесс преобразования части + исполняемого кода приложения в команды виртуальной машины, + обладающей неизвестной потенциальному взломщику системой команд, + архитектурой и логикой работы. Виртуализированные участки кода + выполняются интерпретатором (исполнителем виртуальной машины) без + предварительного преобразования в машинные коды процессора. В + общем случае задача реинжиниринга виртуализированных фрагментов + сводится к изучению архитектуры виртуальной машины, созданию + дизассемблера, соответствующего архитектуре имитируемого + виртуальной машиной процессора, и анализу дизассемблированного + кода.</p> + + <p><a name="VirtualMachine" id="VirtualMachine"><strong>Виртуальная машина</strong></a> - программный код, + непосредственно выполняющий байт-код в защищенной программе.</p> + + <p><a name="Watermarks" id="Watermarks"><strong>Водяные + знаки</strong></a> - уникальный для каждого пользователя массив + байт, позволяющий однозначно идентифицировать легального + владельца взломанной копии программы.</p> + + <p><a name="Mutation" id="Mutation"><strong>Мутация</strong></a> - замена исходной команды аналогом + или определенной последовательностью команд, обеспечивающей тот + же результат, что и исходная команда.</p> + + <p><a name="Obfuscation" id="Obfuscation"><strong>Обфускация</strong></a> - совокупность методик и средств, + направленных на затруднение анализа программного кода. В + зависимости от языка программирования, на котором написана + защищаемая программа, используются различные типы + программ-обфускаторов. При обфускации приложений, написанных на + интерпретируемых языках (Perl, PHP и др.), изменения вносятся в + исходные тексты: удаляются комментарии, переменным присваиваются + бессмысленные имена, выполняется шифрация строковых констант и + т.д. При обфускации программ, написанных на Java / .NET, + выполняют преобразования байт-кода, обрабатываемого виртуальной + машиной. При обфускации скомпилированных программ модифицируют + машинный код: в него вносятся "мусорные" команды, "мертвый код", + случайные переходы, выполняется мутация исходных команд, часть + операций переносится в стек, а также выполняются различные + структурные (реже математические) преобразования. При + реинжиниринге обфусцированых участков кода их пытаются привести в + исходный вид, что при определенном подходе к обфускации + становится очень трудоемкой задачей.</p> + + <p><a name="Protector" id="Protector"><strong>Программа-протектор</strong></a> - программа, + предназначенная для защиты других программных продуктов от + взлома. Подавляющее большинство современных протекторов не + модифицируют исходный код приложения, а выполняют его + упаковку/шифрацию, при этом основной упор сделан на защиту + программы (процедуры) распаковки/расшифровки.</p> + + <p><a name="EntryPoint" id="EntryPoint"><strong>Точка входа в + программу (EntryPoint)</strong></a> - представляет собой + начальный адрес, с которого начинается исполнение загруженной в память программы.</p> + + <p><a name="Pack" id="Pack"><strong>Упаковка</strong></a> - метод + защиты кода приложения, при котором производится сжатие + исполняемого файла программы и/или используемых библиотек с + помощью нестандартных алгоритмов. При использовании упаковки + защищаемый программный код сжимается упаковщиком, а при запуске + приложения у конечного пользователя производится его полная или + частичная распаковка.</p> + + <p><a name="Crypt" id="Crypt"><strong>Шифрация</strong></a> - защита части кода приложения с + помощью криптостойких алгоритмов. Программное обеспечение, + защищенное с помощью шифрации, требует от конечного пользователя + ввода кода активации, который снимает установленные разработчиком + ограничения незарегистрированной версии.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/faq.htm b/help/ru/faq.htm new file mode 100644 index 0000000..21af990 --- /dev/null +++ b/help/ru/faq.htm @@ -0,0 +1,139 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Ответы на вопросы</title> +</head> + +<body> + <h1>Ответы на вопросы</h1> + + <h3>Приобретение VMProtect</h3> + + <p><strong>Приобретая VMProtect, смогу ли я использовать его на + разных компьютерах?</strong><br /> + Вы можете установить и использовать VMProtect на любом количестве + компьютеров, которые необходимы вам для работы.</p> + + <p><strong>В чем заключается разница между Personal и Company + лицензиями и какую лицензию мне нужно выбрать при + покупке?</strong><br /> + Эти лицензии отличаются только типом владельца. Если Вы являетесь + частным разработчиком, то выберите Personal лицензию. Если Вы + являетесь руководителем организации или планируете использовать + продукт в своей организации, то выберите Company лицензию.</p> + + <p><strong>Каким образом осуществляется доставка полной версии + VMProtect после покупки?</strong><br /> + Доставка полной версии (и всех последующих обновлений VMProtect, + входящих в ежегодную подписку) осуществляется с помощью + электронной почты. В письме отправляется ссылка на архив, содержащий установочный файл с полной версией VMProtect. + Поэтому перед покупкой VMProtect рекомендуется отключить все спам фильтры в настройках своего почтового + ящика.</p> + + <p><strong>После покупки VMProtect смогу ли я бесплатно получать + новые версии или нужно будет их оплачивать + дополнительно?</strong><br /> + После покупки Вы будете бесплатно получать новые версии в течение + года. По истечении этого срока Вы можете <a href= + "http://www.vmpsoft.com/buy.php">продлить ежегодную подписку</a> + либо использовать текущую версию VMProtect без ограничений по + времени.</p> + + <p><strong>Возможно ли приобрести VMProtect с помощью кредитной + карты или PayPal?</strong><br /> + Вы можете приобрести VMProtect с помощью кредитной карты или + PayPal. Для этого необходимо на <a href= + "http://www.vmpsoft.com/buy.php">странице покупки</a> выбрать необходимую версию VMProtect + и на следующей странице в качестве метода оплаты выбрать кредитную карту или PayPal.</p> + + <h3>Общие вопросы</h3> + + <p><strong>Есть ли возможность автоматически зашифровать строки и + массивы данных?</strong><br /> + В VMProtect существует возможность скрывать <a href= + "sdk_functions.htm#VMProtectDecryptStringA">ANSI константы</a> и + <a href="sdk_functions.htm#VMProtectDecryptStringW">Unicode + константы</a>. Все остальные данные, с которыми работает + обрабатываемый код, остаются в оригинальном виде. Рекомендуется + всю конфиденциальную информацию хранить в зашифрованном виде и + расшифровывать непосредственно перед использованием. Сам + расшифровщик можно <a href= + "project_functions.htm#CompilationTypes">завиртуализировать</a>.</p> + + <p><strong>Есть ли возможность защищать процедуры, которые + вызываются из разных потоков моего приложения?</strong><br /> + VMProtect полностью поддерживает многопоточные приложения и для + защиты этих процедур не существует никаких дополнительных + ограничений.</p> + + <p><strong>Возможно ли совместное использование VMProtect с + другим протектором (упаковщиком)?</strong><br /> + Использование каких-либо упаковщиков (протекторов) после защиты + файла с помощью VMProtect может привести к неработоспособности + защищенного приложения.</p> + + <p><strong>Необходимо ли включать + VMProtectSDK32.dll/VMProtectSDK64.dll в дистрибутив + программы?</strong><br /> + Данные библиотеки используются только на этапе отладки программы + (до её защиты). После защиты программы с помощью VMProtect вся + информация об использовании этих DLL полностью удаляется и + поэтому нет необходимости включать данные библиотеки в + дистрибутив программы.</p> + + <h3>Сообщения компилятора</h3> + + <p><strong>Что означает данная ошибка: VMProtectMarker + "ToolButton1Click.1".0044327D: Адрес используется процедурой + "TForm1.ToolButton1Click"?</strong><br /> + Данная ошибка означает, что одна и таже команда с адресом + 0044327D используется в двух процедурах, которые в данный момент + включены в список защищаемых объектов. Для решения этой проблемы + необходимо исключить одну из процедур (в данном случае это + VMProtectMarker "ToolButton1Click.1" и TForm1.ToolButton1Click) + из списка защищаемых объектов.</p> + + <p><strong>Что означает данная ошибка: [Ошибка] + TForm1.Test.004433F4: Минимальный размер процедуры для компиляции + 5 байт?</strong><br /> + Данная ошибка означает, что процедура TForm1.Test слишком мала и + не может быть защищена. Для решения этой проблемы необходимо + исключить эту процедуру из списка защищаемых объектов.</p> + + <p><strong>Что означает данное предупреждение: + TForm1.ToolButton1Click.00443368: Переход на внутренний адрес: + 00443337?</strong><br /> + Данное предупреждение означает, что возможен переход из + незащищенного кода внутрь защищенного (этот переход может + привести к неработоспособности защищенной программы). Для решения + этой проблемы необходимо пометить адрес 00443337 как <a href= + "project_functions.htm#ExtAddress">внешний</a>.</p> + + <p><strong>Что означает данная ошибка: Секция ".text" находится в + области создания новой секции?</strong><br /> + Данная ошибка обычно возникает при защите драйверов и означает, + что свободное место между первой секций файла и служебной + информацией, расположенной в заголовке файла, слишком мало для + создания новой секции. Для решения этой проблемы необходимо + увеличить величину выравнивания для секций в исходных текстах + драйвера и полностью его пересобрать (например: если драйвер + собирается с помощью WDK/DDK, то необходимо добавить строку + DRIVER_ALIGNMENT=0x200 в файл SOURCES).</p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/functions.htm b/help/ru/functions.htm new file mode 100644 index 0000000..9f28fc8 --- /dev/null +++ b/help/ru/functions.htm @@ -0,0 +1,31 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Раздел "Функции"</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Раздел "Функции"</h1> + + <p>Раздел "Функции" отображает список всех доступных для защиты функций:</p> + <p><img src="images/functions.png" /></p> + <p>При выборе функции, ее свойства и опции защиты отображаются в основной панели. Для каждой функции можно выбрать <a href="project_functions.htm#CompilationTypes">тип компиляции</a> и установить <a href="manager/features.htm#lock">привязку к серийному номеру</a>.</p> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/history.htm b/help/ru/history.htm new file mode 100644 index 0000000..d8340b5 --- /dev/null +++ b/help/ru/history.htm @@ -0,0 +1,1021 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>История изменений</title> +</head> + +<body> + <h1>История изменений</h1> + + <h3>Версия 3.5</h3> + <p>[!] .NET: Исправлено множество ошибок<br /> + [!] ELF: Исправлена ошибка, возникающая в VMProtectGetCurrentHWID при получении информацуии о HDD<br /> + [+] .NET: Добавлена поддержка .NET Core (3.0+) и .NET Standard (2.1+)<br /> + [+] .NET: Добавлена защита импорта<br /> + [+] .NET: Добавлена защита ресурсов<br /> + [+] .NET: Добавлена поддержка mixed assemblies<br /> + [*] Mach-O: Улучшена поддержка секций с типом S_THREAD_LOCAL_VARIABLES и S_THREAD_LOCAL_REGULAR<br /> + [*] Mach-O: Улучшена поддержка Objective-C<br /> + [*] ELF: Улучшена поддержка релокейшенов с типом R_386_PC32<br /> + [*] PE: Улучшена антиотладка<br /> + </p> + + <h3>Версия 3.4</h3> + <p>[!] Исправлена ошибка возникающая при виртуализации команд BT [m16], POP [m64]<br /> + [+] Добавлена поддержка .NET приложений<br /> + [+] Добавлено дизассемблирование команды PMULLD<br /> + [+] PE: Добавлена поддержка COFF символом<br /> + [*] ELF: Улучшено дизассемблирование of SWITCH<br /> + [*] ELF: Улучшена поддержка настраиваемых элементов с типом R_386_PC32<br /> + [*] PE: Улучшена обработка исключений<br /> + [*] PE: Улучшена поддержка Windows Server 2016 Datacenter<br /> + </p> + + <h3>Версия 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>Версия 3.2</h3> + <p>[!] PE: Исправлена ошибка возникающая при вызове VMProtectIsValidImageCRC внутри защищенного драйвера<br /> + [!] Исправлена ошибка возникающая при виртуализации команд XOR, имеющей настраиваемые элементы<br /> + [*] PE: Добавлена упаковка секций, содержащих TLS директорию<br /> + [*] PE: Улучшено обнаружение отладчиков<br /> + [*] PE: Taggant System больше не поддерживается<br /> + [*] Значительно ускорена распаковка при использовании опции "<a href= + "project_options.htm#PackOutputFile">Упаковать файл</a>"<br /> + [+] Добавлена поддержка ELF формата<br /> + [+] Добавлено дизассемблирование AVX команд<br /> + </p> + + <h3>Версия 3.1</h3> + + <p>[!] Исправлена ошибка возникающая при дизассемлировании команды MOVUPS с REX префиксом 0x41<br /> + [!] Исправлена ошибка возникающая при виртуализации команд XLAT, FSIN и POPAD<br /> + [*] Улучшена поддержка исключений<br /> + [*] Улучшена архитектура ВМ<br /> + [*] Улучшена проверка целостности файла на диске при использовании опции "<a href= + "project_options.htm#MemoryProtection">Защита памяти</a>"<br /> + [*] Улучшена виртуализация команд FSTENV, FSTCW, FSAVE и FSTSW<br /> + [*] PE: VMProtectActivateLicense теперь работает через WinHTTP и использует настройки прокси из IE<br /> + [*] PE: Улучшена работа VMProtectGetCurrentHWID для драйверов<br /> + [*] PE: Улучшена поддержка Delphi 6 при использовании опции "<a href= + "project_options.htm#ImportProtection">Защита импорта</a>"<br /> + [*] PE: Улучшено обнаружение отладчиков<br /> + [+] Добавлена виртуализация команд ADD, AND, SUB, XOR, OR с префиксом LOCK<br /> + [+] Добавлена виртуализация команды CQO<br /> + [+] Добавлено дизассемблирование команд PINSRB, PINSRD, PINSRQ, PMINSD, PMINUW, PMINUD, PMAXSB, PMAXSD, PMAXUW и PMAXUD<br /> + [+] Mach-O: Добавлена поддержка секции "__unwind_info"<br /> + [+] Mach-O: Добавлена поддержка LC_LOAD_WEAK_DYLIB<br /> + [+] Mach-O: Добавлена поддержка Delphi Berlin<br /> + [+] PE: Для драйверов добавлена поддержка Windows 10<br /> + [+] PE: При использовании опции "<a href= + "project_options.htm#Additional">Удалять отладочную информацию</a>" теперь затирается "Rich Header"<br /> + [+] Ultimate: В секции "<a href="project_files.htm">Файлы</a>" теперь можно создавать папки и использовать символы ".." для перехода в вышестоящий каталог<br /> + [+] GUI: При отображении защищаемых ANSI строк теперь используется кодовая страница из настроек Windows<br /> + [+] LUA: Добавлена возможность вызова функций из DLL<br /> + </p> + + <h3>Версия 3.0</h3> + + <p>[*] PE: Добавлена поддержка исключений в x64 коде<br /> + [*] Mach-O: Добавлена поддержка <a href="sdk_functions.htm">функций SDK</a><br /> + [*] Ultimate: Добавлена поддержка <a href="manager/usage/api.htm">функции лицензирования</a> для драйверов и приложений на VB6<br /> + [*] Ultimate: Улучшена функциональность <a href="project_files.htm">DLL Box</a> - теперь в защищаемое приложение можно включать любые файлы, в том числе и ActiveX серверы с опцией их автоматической регистрации в виртуальном реестре<br /> + [*] Улучшено обнаружение Virtual Box<br /> + [*] Скриптовый движок заменен на LUA<br /> + [*] Новая архитектура ВМ<br /> + [+] В SDK добавлена новая функция <a href="sdk_functions.htm#VMProtectIsProtected">VMProtectIsProtected</a><br /> + </p> + + <h3>Версия 2.13</h3> + + <p>[!] PE: Добавлена поддержка Delay Import<br /> + [!] PE: Улучшена совместимость с VS2012<br /> + [!] PE: Улучшена совместимость с Embarcadero RAD Studio XE3<br /> + [!] PE: Улучшена совместимость с MinGW<br /> + [!] Ultimate: Улучшена совместимость DLL Box с Windows 8<br /> + [+] WebLM: Добавлена поддержка mbstring.func_overload = 2<br /> + [+] WebLM: В коде активации добавлено поле "Дата окончания" + (VMProtectActivateLicense теперь может возвращать + ACTIVATION_EXPIRED если текущая дата больше даты окончания)<br /> + [+] WebLM: В моде для полей "Дата окончания" и "Максимальная дата + сборки" добавлено значение "дней с даты покупки"<br /></p> + + <h3>Версия 2.12</h3> + + <p>[!] PE: Исправлены ошибки, возникающие в x64 приложениях<br /> + [!] PE: Исправлена ошибка, возникающая при наличии у приложения + флага IMAGE_DLLCHARACTERISTICS_NX_COMPAT<br /> + [+] PE: Добавлена поддержка Windows 8<br /> + [+] WebLM: Добавлен русский и китайский язык<br /></p> + + <h3>Версия 2.11</h3> + + <p>[!] Исправлена ошибка, возникающая при использовании <a href= + "project_options.htm#PackOutputFile">упаковки</a> в х64 + приложениях<br /> + [!] PE: Исправлена ошибка, возникающая при использовании опции + "<a href="project_options.htm#ImportProtection">Защита + импорта</a>"<br /> + [!] PE: Исправлена ошибка, возникающая при обработке TLS секции, + имеющей релоки<br /> + [+] Ultimate: Добавлена <a href= + "manager/activation.htm">активация/деактивация</a><br /> + [+] Mach-O: Добавлена <a href= + "project_options.htm#PackOutputFile">упаковка</a><br /> + [*] PE: Поддержка DriverVerifier<br /> + [*] PE: Улучшена поддержка SEH для MSVC<br /> + [*] Mach-O: Улучшена поддержка IndirectSymbols<br /></p> + + <h3>Версия 2.10</h3> + + <p>[!] Исправлена ошибка, возникающая при использовании опции + "<a href="project_options.htm#ResourceProtection">Защита + ресурсов</a>"<br /> + [!] Исправлена ошибка, возникающая при использовании опции + "<a href="project_options.htm#ImportProtection">Защита + импорта</a>"<br /> + [!] Исправлена ошибка, возникающая при защите x64 драйверов, не + имеющих релоков<br /> + [+] Добавлена поддержка исполняемых файлов от Mac OS X (Mach-O + формат)<br /> + [+] Добавлена поддержка команды HLT<br /> + [+] В SDK добавлено новое API - <a href= + "sdk_functions.htm#VMProtectFreeString">VMProtectFreeString</a><br /> + [*] Улучшено опеределение имен маркеров и строк, помеченных с + помощью <a href= + "sdk_functions.htm#VMProtectDecryptStringA">VMProtectDecryptStringA</a>/<a href="sdk_functions.htm#VMProtectDecryptStringW">VMProtectDecryptStringW</a><br /> + [*] В имени выходного файла и параметрах лицензирования теперь + можно использовать относительные пути<br /> + [*] Улучшена поддержка SEH для Delphi<br /> + [*] SenseLock Edition: Добавлена опция "<a href= + "project_options.htm#ResourceProtection">Защита + ресурсов</a>"<br /> + [*] SenseLock Edition: В GUI версии добавлен <a href= + "manager/licenses.htm">менеджер лицензий</a><br /> + [*] SenseLock Edition: В GUI версии добавлено программирование ключей<br /> + [*] Лицензии в менеджере лицензий теперь можно копировать и + вставлять из буфера обмена<br /></p> + + <h3>Версия 2.09</h3> + + <p>[!] Исправлена ошибка, возникающая при <a href= + "project_options.htm#DebuggerDetection">обнаружении отладчика</a> + под Windows 2000<br /> + [!] Исправлена ошибка, возникающая при дизассемблировании команд + PMULHUW и LDMXCSR<br /> + [!] Исправлена ошибка, возникающая при использовании <a href= + "project_options.htm#MemoryProtection">защиты памяти</a> (не + проверялась целостность файла на диске)<br /> + [!] Ultimate: Исправлена ошибка, возникающая при запуске + защищенных файлов под Windows 2000 (требовалось наличие + EncodePointer/DecodePointer из kernel32.dll)<br /> + [*] Улучшена виртуализация обработчиков исключений для Visual + C<br /> + [*] <a href="project_options.htm#ResourceProtection">Защита + ресурсов</a> теперь доступна в Lite и Professional версиях<br /> + [*] При использовании <a href= + "project_options.htm#ResourceProtection">защиты ресурсов</a> + добавлена поддержка EnumResourceTypes, EnumResourceNames и + EnumResourceLanguages (доступно только при вызове из главного + модуля)<br /> + [+] Добавлена поддержка исключений для Borland C Builder<br /> + [+] Ultimate: Ускорена работа <a href= + "manager/usage/api.htm#VMProtectGetSerialNumberState">VMProtectGetSerialNumberState</a> + и <a href= + "manager/usage/api.htm#VMProtectGetSerialNumberData">VMProtectGetSerialNumberData</a><br /> + + [+] В скрипт для <a href= + "script_classes.htm#TLicenseManager">TLicenseManager</a> добавлен + метод <a href= + "script_classes.htm#TLicenseManager.Save">Save</a><br /> + [-] Убрана опция "Перемещать ресурсы в конец файла" - теперь + секция ресурсов всегда размещается последней<br /></p> + + <h3>Версия 2.08</h3> + + <p>[!] Исправлена ошибка, возникающая при ассемблировании команды + TEST [XXXX], REG<br /> + [!] Исправлена ошибка, возникающая при диассемблировании х64 + команд с префиксом 0x67<br /> + [*] Улучшена поддержка файлов, имеющих небольшие занчения для + SectionAlignment<br /> + [*] Улучшено опеределение имен маркеров и строк для Intel + Compiler 12 и Lazarus<br /> + [*] Улучшена <a href="project_options.htm#ImportProtection">защита + импорта</a><br /> + [*] Ultimate: Теперь можно загружать файлы проекта с параметрами + лицензирования<br /> + [+] Ultimate: Добавлена <a href= + "project_options.htm#ResourceProtection">защита ресурсов</a><br /> + [+] Ultimate: В скрипт добавлены классы <a href= + "script_classes.htm#TLicense">TLicense</a> и <a href= + "script_classes.htm#TLicenseManager">TLicenseManager</a><br /></p> + + <h3>Версия 2.07</h3> + + <p>[!] Исправлена ошибка, возникающая при работе с <a href= + "manager/licenses.htm">менеджером лицензий</a> если в настройках + Windows установлен язык отличный от английского<br /> + [+] В режиме эксперта в опциях теперь можно изменять стандартные + сообщения "Обнаружен отладчик", "Обнаружены инструменты + виртуализации", "Файл поврежден" и "Необходим серийный + номер"<br /> + [+] В скрипт для <a href= + "script_classes.htm#TVMProtector">TVMProtector</a> добавлено + свойство <a href= + "script_classes.htm#TVMProtector.Messages">Messages</a><br /> + [*] Улучшена совместимость <a href= + "project_options.htm#MemoryProtection">защиты памяти</a> с + некоторыми антивирусами<br /></p> + + <h3>Версия 2.06</h3> + + <p>[!] Исправлена ошибка с определением имен маркеров для + MinGW<br /> + [!] Исправлена ошибка, возникающая при <a href= + "project_options.htm#ImportProtection">защите импорта</a> в х64 + файлах<br /> + [!] Исправлена ошибка, возникающая при виртуализации FILD WORD + PTR [XXXX]<br /> + [!] Исправлена ошибка, возникающая при дизассемблировании + PSRLW<br /> + [!] Исправлена ошибка, возникающая в <a href= + "project_files.htm">DLL Box</a> при активном антивирусе<br /> + [*] Файл проекта теперь сохраняется в XML формате<br /> + [*] Скрипт теперь хранится в файле проекта<br /> + [*] Ultimate: <a href="manager/licenses.htm">Менеджер + лицензий</a> теперь находится в GUI версии<br /> + [*] Ultimate: Значительно ускорено выполнение кода, <a href= + "project_functions.htm#LockToKey">привязанного к серийному + номеру</a><br /> + [+] Добавлена поддержка МАР файлов для MinGW<br /> + [+] Добавлена поддержка JCLDEBUG<br /> + [+] В скрипт для <a href= + "script_classes.htm#TPEDirectory">TPEDirectory</a> добавлен метод + Clear<br /> + [+] В скрипт для <a href= + "script_classes.htm#TVMProcedure">TVMProcedure</a> добавлены + свойства <a href= + "script_classes.htm#TVMProcedure.InputSize">InputSize</a> и + <a href= + "script_classes.htm#TVMProcedure.OutputSize">OutputSize</a><br /> + [+] Ultimate: В SDK добавлены новые API - <a href= + "sdk_functions.htm#VMProtectBeginVirtualizationLockByKey">VMProtectBeginVirtualizationLockByKey</a> + и <a href= + "sdk_functions.htm#VMProtectBeginUltraLockByKey">VMProtectBeginUltraLockByKey</a><br /> + </p> + + <h3>Версия 2.05</h3> + + <p>[!] Исправлены ошибки с определением строк для программ на + MinGW<br /> + [!] Исправлены ошибка "Out of system resources", возникающая при + добавлении большого количества процедур в проект<br /> + [!] Исправлены ошибка, возникающая при выводе строк в консольной + версии<br /> + [*] Дата MAP файла теперь берется из содержимого файла<br /> + [+] Ultimate: Добавлены примеры по работе с <a href= + "manager/index.htm">системой лицензирования</a> (на MSVC и + Delphi)<br /> + [+] Ultimate: Добавлены исходные коды <a href= + "manager/keygen/keygen_dll.htm">генератора серийных номеров</a> + на MSVC<br /> + [+] Ultimate: Добавлен <a href="project_files.htm">DLL Box</a> + (доступен только для EXE файлов)<br /> + [+] Ultimate: В скрипт добавлен класс <a href= + "script_classes.htm#TInternalDLLs">TInternalDLLs</a><br /> + [+] Ultimate: В скрипт для класса <a href= + "script_classes.htm#TVMProtector">TVMProtector</a> добавлено + свойство <a href= + "script_classes.htm#TVMProtector.InternalDlls">InternalDlls</a><br /> + + [+] В скрипт для класса <a href= + "script_classes.htm#TMapRecord">TMapRecord</a> добавлено свойство + <a href= + "script_classes.htm#TMapRecord.SegmentName">SegmentName</a><br /> + [+] В скрипт для класса <a href= + "script_classes.htm#TIntelRecord">TIntelRecord</a> добавлено + свойство <a href= + "script_classes.htm#TIntelRecord.Operands">Operands</a><br /> + [+] Добавлен чешский язык<br /></p> + + <h3>Версия 2.04</h3> + + <p>[!] Исправлена ошибка, возникающая при обфускации FDIVR + [ESP+XXXX]<br /> + [!] Исправлена ошибка, возникающая при обфускации SWITCH в x64 + приложениях<br /> + [*] При использовании опции "<a href= + "project_options.htm#MemoryProtection">Защита памяти</a>" теперь + проверяется целостность файла на диске<br /> + [*] Ultimate: Улучшена интеграция модуля лицензирования с + защищаемой программой<br /> + [+] Добавлена поддержка файлов, имеющих оверлей<br /> + [+] Ultimate: Добавлен <a href= + "manager/keygen/keygen_net.htm">пример генератора серийных + номеров на C#</a><br /> + [+] Ultimate: В <a href="manager/licenses.htm">менеджере + лицензий</a> добавлен экспорт параметров продукта для генератора + на C#<br /> + [+] Ultimate: В <a href="mode_console.htm">консольную версию</a> + добавлен параметр "-lf", с помощью которого можно указать имя + файла с параметрами лицензирования<br /> + [+] Добавлен французский файл помощи<br /></p> + + <h3>Версия 2.03</h3> + + <p>[!] Исправлена ошибка, возникающая при использовании <a href= + "project_options.htm#ImportProtection">защиты импорта</a> в SYS + файлах (под Windows 7 не определялся базовый адрес hal.dll)<br /> + [!] Исправлена ошибка, возникающая при обфускации команд с + использованием CRx регистров в SYS файлах<br /> + [!] Исправлены мелкие ошибки<br /> + [*] Улучшения в <a href="manager/index.htm">системе + лицензирования</a> Ultimate версии<br /> + [+] Добавлен французский язык<br /></p> + + <h3>Версия 2.02</h3> + + <p>[!] В SenseLock Edition исправлена ошибка, возникающая при + одновременной работе нескольких программ, которые используют + разные лицензии в ключе (пользователям SenseLock Edition + необходимо обновить прошивку в мастер ключе)<br /> + [!] Исправлена ошибка при дизассемблировани EntryPoint у программ + на Delphi<br /> + [!] Исправлены мелкие ошибки<br /> + [*] Важные улучшения в <a href="manager/index.htm">системе + лицензирования</a> Ultimate версии<br /> + [*] SenseLock Edition теперь использует систему лицензирования + Ultimate версии (пользователям SenseLock Edition необходимо + обновить лицензию в мастер ключе)<br /> + [*] Улучшено определение строк, помеченных с помощью <a href= + "sdk_functions.htm#VMProtectDecryptStringA">VMProtectDecryptStringA</a>/<a href="sdk_functions.htm#VMProtectDecryptStringW">VMProtectDecryptStringW</a><br /> + + [+] В GUI добавлена поддержка Unicode<br /> + [+] Добавлен традиционный китайский язык<br /></p> + + <h3>Версия 2.01</h3> + + <p>[!] Исправлены мелкие ошибки в инсталляторе, <a href= + "manager/licenses.htm">менеджере лицензий</a> и <a href= + "sdk_functions.htm">SDK</a><br /> + [*] Для регистрации VMProtect сейчас используется собственная + <a href="manager/index.htm">система лицензирования</a><br /> + [+] Добавлен упрощенный китайский язык<br /></p> + + <h3>Версия 2.0</h3> + + <p>[!] Исправлены ошибки при дизассемблировании и виртуализации + команд CALL FWORD PTR [XXXX] и JMP FWORD PTR [XXXX]<br /> + [!] В версии SenseLock Edition исправлена ошибка, возникающая при + запрое серийного номер ключа после смены стандартного PIN + пользователя<br /> + [!] Исправлена ошибка, возникающая при виртуализации SWITCH в х64 + приложениях<br /> + [!] Исправлена ошибка, возникающая при дизассемблировании команд + ROL, ROR, RCL, RCR, SHL, SHR, SAL и SAR, имеющих REX преффикс в + х64 приложениях<br /> + [!] Исправлена ошибка, возникающая при виртуализации команды + CMOVxx<br /> + [!] Исправлены мелкие ошибки<br /> + [*] Обновлен файл помощи на русском<br /> + [*] Обновлен файл помощи на английском<br /> + [+] Добавлена <a href="manager/index.htm">система + лицензирования</a> (доступна только в Ultimate версии)<br /> + [+] В SDK добавлены новые API - <a href= + "sdk_functions.htm#VMProtectDecryptStringA">VMProtectDecryptStringA</a> + и <a href= + "sdk_functions.htm#VMProtectDecryptStringW">VMProtectDecryptStringW</a><br /> + + [+] В скрипт для класса <a href= + "script_classes.htm#TVMProcedure">TVMProcedure</a> добавлено + свойство <a href= + "script_classes.htm#TVMProcedure.CompilationOptions">CompilationOptions</a><br /> + + [+] В скрипт для класса <a href= + "script_classes.htm#TVMProcedure">TVMProcedure</a> добавлены + свойства <a href= + "script_classes.htm#TVMProcedure.SELicense">SELicense</a> и + <a href="script_classes.htm#TVMProcedure.SEVersion">SEVersion</a> + (доступны только в SenseLock Edition)<br /> + [+] В скрипт для класса <a href= + "script_classes.htm#TVMProtector">TVMProtector</a> добавлены + свойства <a href= + "script_classes.htm#TVMProtector.VMSectionName">VMSectionName</a> + и <a href= + "script_classes.htm#TVMProtector.VMExecutorCount">VMExecutorCount</a><br /> + + [+] В скрипт для класса <a href= + "script_classes.htm#TVMProtector">TVMProtector</a> добавлены + свойства <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> + и <a href= + "script_classes.htm#TVMProtector.SEVersion">SEVersion</a> + (доступны только в SenseLock Edition)<br /> + [-] Убрана опция "Динамическое создание онлайн команд"<br /></p> + + <h3>Версия 1.81</h3> + + <p>[!] Исправлена ошибка, возникающая при исполнении + промутированного кода на процессорах Pentium 4<br /> + [!] Исправлена ошибка, возникающая при исполнении + завиртуализированного кода на некоторых процессорах Athlon<br /> + [!] Исправлены ошибки, возникающие при дизассемблировании и + виртуализации структур, описывающих обработчики исключений с + фильтром на класс исключения (для программ на Delphi и Borland + C++ Builder)<br /> + [!] Исправленa ошибкa, возникающая при использовании <a href= + "project_options.htm#VirtualMachines">нескольких ВМ</a> в + 64-битных файлах<br /> + [!] Исправлены мелкие ошибки<br /> + [*] Улучшено определение имен <a href= + "use_markers.htm">маркеров</a> (для программ на Visual C)<br /> + [*] Значительно снижено потребление памяти в процессе + компиляции<br /> + [*] Ресурс "HTML" теперь не упаковывается<br /> + [*] Обновлен файл помощи на русском<br /> + [+] В режиме "Мастер" добавлен + поиск процедур по маске<br /> + [+] Добавлен <a href="project_options.htm#PackOutputFile">новый + режим упаковки</a> с более высокой степенью сжатия<br /> + [+] Добавлена поддержка файлов, имеющих TLS-калбеки<br /> + [+] В SDK добавлено новое API - <a href= + "sdk_functions.htm#VMProtectIsValidImageCRC">VMProtectIsValidImageCRC</a><br /> + </p> + + <h3>Версия 1.8</h3> + + <p>[!] Исправлены ошибки, возникающие при <a href= + "project_options.htm#ImportProtection">защите импорта</a> в + SYS-файлах<br /> + [!] Исправлены ошибки, возникающие при <a href= + "project_options.htm#MemoryProtection">защите памяти</a> в + DLL/SYS-файлах<br /> + [!] Исправлены ошибки, возникающие при использовании <a href= + "project_options.htm#VirtualMachines">нескольких ВМ</a> в + DLL/SYS-файлах<br /> + [!] Исправлена ошибка, возникающая при мутации кода, имеющего + обработчики исключений<br /> + [!] Исправлена ошибка, возникающая при одновременном + использовании <a href= + "project_options.htm#MemoryProtection">защиты памяти</a> и + <a href="project_options.htm#Watermarks">водяных знаков</a><br /> + [!] Исправлены мелкие ошибки<br /> + [*] Улучшено определение ссылок на строки, помеченных <a href= + "use_markers.htm">маркерами</a> (теперь не нужно помечать + маркерами все ссылки на защищаемую строку)<br /> + [*] Улучшена <a href="project_options.htm#ImportProtection">защита + импорта</a><br /> + [*] Улучшено <a href= + "project_options.htm#DebuggerDetection">определение + отладчика</a><br /> + [*] Обновлен файл помощи на русском<br /> + [+] В GUI-версии теперь можно сохранять файлы проекта под + разными именами<br /> + [+] Теперь можно открывать файлы + проекта<br /> + [+] Добавлено <a href= + "project_options.htm#VirtualizationToolsDetection">обнаружение + Sandboxie</a><br /> + [+] Добавлена поддержка файлов, скомпилированных с ключем + /SAFESEH<br /> + [+] Добавлена поддержка CodeGear 2009<br /> + [+] Теперь можно задавать имена маркерам (при использовании + <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> + из VMProtectSDKxx.dll/VMProtectDDKxx.sys)<br /> + [+] В SDK добавлены новые API (<a href= + "sdk_functions.htm#VMProtectIsDebuggerPresent">VMProtectIsDebuggerPresent</a> + и <a href= + "sdk_functions.htm#VMProtectIsVirtualMachinePresent">VMProtectIsVirtualMachinePresent</a>)<br /> + + [+] Для версии SenseLock Edition добавлена утилита "Система + удаленного обновления и лицензирования"<br /> + [+] Для версии SenseLock Edition добавлена привязка к + идентификатору ключа<br /></p> + + <h3>Версия 1.7</h3> + + <p>[!] Секции, имеющие флаги SHAREABLE+WRITABLE, теперь не + упаковываются<br /> + [!] Исправлены мелкие ошибки<br /> + [*] Улучшена <a href="project_options.htm#ImportProtection">защита + импорта</a> для SYS-файлов<br /> + [*] Улучшена <a href= + "project_options.htm#PackOutputFile">упаковка</a> SYS-файлов + (упакованным секциям больше не устанавливается флаг + WRITABLE)<br /> + [*] Улучшено <a href= + "project_options.htm#DebuggerDetection">определение + отладчика</a><br /> + [+] Добавлена опция "<a href= + "project_options.htm#MemoryProtection">Защита памяти</a>" (данная + опция защищает память от изменений во время работы + приложения)<br /> + [+] Добавлена опция "<a href= + "project_options.htm#VirtualizationToolsDetection">Определение + инструментов виртуализации (VMware/Virtual PC)</a>"<br /> + [+] В скрипт для класса <a href= + "script_classes.htm#TPEFile">TPEFile</a> добавлено свойство + <a href= + "script_classes.htm#TPEFile.EntryPoint">EntryPoint</a><br /></p> + + <h3>Версия 1.65</h3> + + <p>[!] Исправлены мелкие ошибки<br /> + [*] Улучшена <a href="project_options.htm#ImportProtection">защита + импорта</a><br /> + [*] Улучшено <a href= + "project_options.htm#DebuggerDetection">определение + отладчика</a><br /> + [+] Добавлено определение непарных <a href= + "use_markers.htm">маркеров</a> (непарные маркеры доступны в общем + списке объектов)<br /> + [+] Добавлены маркеры с предустановленным типом компиляции: + VMProtectBeginVirtualization, VMProtectBeginMutation и + VMProtectBeginUltra<br /> + [+] Добавлен традиционный китайский язык<br /></p> + + <h3>Версия 1.64</h3> + + <p>[!] Исправлена ошибка, возникающая при работе <a href= + "project_options.htm#PackOutputFile">упакованного файла</a>, + имеющего ресурсы "TYPELIB", "REGISTRY" и "MUI"<br /> + [!] Исправлена ошибка R6002, возникающая при работе упакованного + файла (для программ на Visual C)<br /> + [!] Исправлены ошибка, возникающая при использовании опции + "<a href="project_options.htm#ImportProtection">Защита + импорта</a>" в 64-битных SYS-файлах<br /> + [!] Исправлены мелкие ошибки<br /> + [*] Файл настроек теперь сохраняется в каталог + %APPDATA%/PolyTech/VMProtect<br /> + [*] Улучшена <a href="project_options.htm#ImportProtection">защита + импорта</a><br /> + [+] Добавлена опция "<a href= + "project_options.htm#VirtualMachines">Виртуальные Машины</a>" + (разные завиртуализированные участки кода будут выполняться на + разных виртуальных машинах с разной архитектурой)<br /> + [+] Добавлена опция "<a href= + "project_options.htm#DebuggerDetection">Определение отладчика</a>" + (при обнаружении отладчика защищенное приложение будет показывать + соответствующее сообщение и закрываться)<br /> + [+] В скрипт для класса <a href= + "script_classes.htm#TPESection">TPESection</a> добавлено свойство + <a href= + "script_classes.htm#TPESection.IncludedInPacking">IncludedInPacking</a><br /> + + [+] Добавлена поддержка команды IRETD<br /> + [+] Добавлен пример c использованием маркеров в Lazarus<br /></p> + + <h3>Версия 1.63</h3> + + <p>[!] Исправлены ошибки, возникающие при использовании опции + "<a href="project_options.htm#ImportProtection">Защита + импорта</a>"<br /> + [!] Исправлены мелкие ошибки<br /> + [+] В скрипт добавлено событие <a href= + "script_events.htm#OnBeforePackFile">OnBeforePackFile</a><br /> + [+] В скрипт для класса <a href= + "script_classes.htm#TPEFile">TPEFile</a> добавлено свойство + <a href="script_classes.htm#TPEFile.Handle">Handle</a><br /> + [+] Добавлен пример c использованием <a href= + "use_markers.htm">маркеров</a> в Free Pascal<br /> + [*] Улучшен контроль целостности ВМ объектов<br /></p> + + <h3>Версия 1.62</h3> + + <p>[!] Исправлены ошибки, возникающие при использовании опции + "<a href="project_options.htm#ImportProtection">Защита + импорта</a>"<br /> + [!] Исправлена ошибка, возникающая при обработке исключения в + TRY/EXCEPT/END блоке в режиме "Ультра" (для программ на Delphi и + Borland C++ Builder)<br /> + [*] Улучшена <a href="project_options.htm#ImportProtection">защита + импорта</a> для SYS-файлов<br /> + [+] Каждый объект из проекта теперь может иметь свои опции + компиляции для более тонкой настройки быстродействия + (индивидуальные опции настраиваются в дереве проекта)<br /> + [+] Добавлена опция "Перемещать ресурсы в конец файла"<br /> + [+] Добавлен пример использования расширенных маркеров (папка + Examples\Scripts\UseExtMarkers)<br /></p> + + <h3>Версия 1.61</h3> + + <p>[!] Исправлена ошибка, возникающая при запуске упакованных + файлов под управлением Windows 95/98<br /> + [!] Исправлены мелкие ошибки<br /> + [+] В Lite-версии добавлена возможность передачи имени файла + через командную строку<br /> + [+] В режиме "Мастер" добавлена + история<br /> + [+] В режиме "Мастер" добавлен + выбор языка<br /> + [+] Добавлена опция "<a href= + "project_options.htm#ImportProtection">Защита импорта</a>" + (рекомендуется использовать совместно с упаковкой выходного + файла)<br /> + [+] В <a href="mode_console.htm">консольной версии</a> добавлен + параметр "-we" (при использовании этого параметра все + предупреждения будут отображаться как ошибки)<br /> + [+] В скрипт добавлен класс <a href= + "script_classes.htm#TPEResourceRecords">TPEResourceRecords</a><br /> + + [+] В скрипт для класса <a href= + "script_classes.htm#TPEFile">TPEFile</a> добавлено свойство + <a href= + "script_classes.htm#TPEFile.ResourceRecords">ResourceRecords</a><br /> + </p> + + <h3>Версия 1.6</h3> + + <p>[!] Исправлены мелкие ошибки<br /> + [*] Улучшена работа с одинаковыми строками (теперь одинаковые + строки отображаются как один объект, содержащий несколько + записей)<br /> + [+] Добавлена возможность упаковки выходного файла<br /> + [+] В скрипт добавлен класс <a href= + "script_classes.htm#TPEExportRecords">TPEExportRecords</a><br /> + [+] В скрипт для класса <a href= + "script_classes.htm#TPEFile">TPEFile</a> добавлено свойство + <a href= + "script_classes.htm#TPEFile.ExportRecords">ExportRecords</a><br /> + + [+] В скрипт добавлено событие <a href= + "script_events.htm#OnBeforeSaveFile">OnBeforeSaveFile</a><br /> + [+] Добавлен файл помощи на китайском языке (перевод Wang + Xiaopeng)<br /> + [+] При загрузке MAP-файла добавлена проверка даты и времени + модификации (если дата и время модификации MAP-файла отличается + от даты и времени модификации защищаемого файла, то MAP-файл не + будет загружен)<br /></p> + + <h3>Версия 1.56</h3> + + <p>[!] Исправлена ошибка, возникающая при виртуализации команд + BT, BTC, BTR и BTS<br /> + [!] Исправлены мелкие ошибки<br /> + [*] Список опций защиты отсортирован в порядке убывания + приоритета<br /> + [*] Улучшена поддержка SEH для VC8<br /> + [*] Улучшено динамическое создание онлайн-команд<br /> + [*] Улучшен контроль целостности объектов ВМ<br /> + [+] Добавлена поддержка команд PREFETCH и PREFETCHW<br /> + [+] В скрипт добавлены функции CompareText и + AnsiCompareText<br /> + [+] В скрипт для класса <a href= + "script_classes.htm#TPEFile">TPEFile</a> добавлено свойство + <a href="script_classes.htm#TPEFile.Size">Size</a><br /> + [+] Добавлен пример c использованием <a href= + "use_markers.htm">маркеров</a> в MinGW<br /> + [+] Добавлен китайский язык (перевод Wang Xiaopeng)<br /> + [+] В окне добавления процедуры добавлен <a href= + "project_functions.htm#Search">поиск по маске</a> с + использованием символов "*" и "?"<br /> + [+] В сообщения компилятора теперь выводится информация о размере + выходного файла<br /></p> + + <h3>Версия 1.55</h3> + + <p>[!] Исправлена ошибка, возникающая при работе с файлом, + имеющим "невыровненное" значение ImageSize<br /> + [!] Исправлена ошибка, возникающая при определении начала блока + TRY для программ на Delphi<br /> + [!] Исправлена ошибка, возникающая при обработке "смешанного" + кода из Discardable и NonDiscardable секций в SYS-файлах<br /> + [!] Исправлена ошибка, возникающая при виртуализации 64-битных + DLL/SYS-файлов<br /> + [*] Восстановлена опция "Шифрация регистров при выходе из + ВМ"<br /> + [+] В скрипт добавлен класс <a href= + "script_classes.htm#TIniFile">TIniFile</a><br /> + [+] В скрипт для класса <a href= + "script_classes.htm#TPEFile">TPEFile</a> добавлены дополнительные + свойства и методы<br /> + [+] В GUI-версию добавлен калькулятор для расчета смещений в + файле по адресам<br /> + [+] Добавлен итальянский язык (перевод Gabriele Lanza)<br /></p> + + <h3>Версия 1.54</h3> + + <p>[!] Исправлена ошибка, возникающая при мутации команды PUSH + ESP<br /> + [!] Исправлена ошибка, возникающая при виртуализации команды + FLDCW [ESP+xxxx]<br /> + [!] Исправлена ошибка, возникающая при обфускации байт-кода<br /> + [*] Улучшения в GUI<br /> + [+] Добавлены немецкий и испанский языки<br /> + [+] Добавлена поддержка <a href="script.htm">скриптов</a><br /> + [+] В <a href="mode_console.htm">консольной версии</a> добавлен + параметр, с помощью которого можно указать имя файла со + скриптом<br /></p> + + <h3>Версия 1.53</h3> + + <p>[!] Исправлены ошибки, возникающие при виртуализации кода в + DLL/SYS-файлах<br /> + [*] Улучшения в виртуализации кода<br /> + [*] В <a href="mode_console.htm">консольной версии</a> при + перенаправлении вывода текста в файл убраны бегущие + проценты<br /> + [+] Добавлена возможность вставки маркеров для x86-64<br /> + [+] Добавлена возможность создавать папки в проекте<br /> + [+] В <a href="mode_console.htm">консольной версии</a> добавлен + параметр, с помощью которого можно указать имя файла + проекта<br /></p> + + <h3>Версия 1.52</h3> + + <p>[!] Исправлена ошибка, возникающая при мутации команд CMOVxx, + CMPXCHG и CMPXCHG8B<br /> + [!] Исправлена ошибка, возникающая при мутации команды LEA + ESP,[ESP+xxxx]<br /> + [*] Команды RCL и RCR добавлены в базовую логику ВМ<br /> + [+] Добавлена поддержка x86-64<br /> + [+] В GUI-версии на закладке "<a href= + "project_options.htm">Опции</a>" теперь можно указать имя + выходного файла<br /> + [+] Добавлена справка на русском и английском языках<br /></p> + + <h3>Версия 1.51</h3> + + <p>[!] Исправлена ошибка, возникающая при создании "Relocation + Table" нулевой длины<br /> + [!] Исправлена ошибка, возникающая при мутации команды CALL + [xxxx] в режиме "Мутация" в DLL/SYS-файлах<br /> + [!] В примере на Delphi в определение VMProtectBegin добавлена + команда, препятствующая оптимизации VMProtectBegin (оптимизация + VMProtectBegin могла приводить к неработоспособности защищенного + файла)<br /> + [+] Добавлена опция "Автосохранение проекта после + компиляции"<br /></p> + + <h3>Версия 1.5</h3> + + <p>[!] Исправлена ошибка, возникающая при перетаскивании файлов в + главное окно<br /> + [!] Исправлена ошибка, возникающая при работе с файлами, имеющими + атрибут "Read only"<br /> + [!] Исправлены мелкие недочеты при компиляции в режиме + "Ультра"<br /> + [*] Защищенный файл теперь имеет точно такие же атрибуты как + оригинальный файл<br /> + [+] В список защищаемых процедур теперь можно включать строки + (присвоение строк необходимо отмечать маркерами)<br /> + [+] В дистрибутив добавлены примеры c использованием маркеров в + Borland C++ Builder, Delphi, MASM, Visual Basic и Visual + C++<br /> + [+] Добавлена опция "Интегрировать в оболочку"<br /></p> + + <h3>Версия 1.4</h3> + + <p>[!] Исправлена ошибка, возникающая при мутации команд IMUL, + MUL, IDIV, DIV<br /> + [!] Исправлена ошибка, возникающая при виртуализации нескольких + CASE таблиц, идущих друг за другом<br /> + [!] Исправлена ошибка, возникающая при виртуализации команд POP + word/dword ptr [esp+xxxx] и IMUL reg8<br /> + [!] Исправлена ошибка, возникающая при дизассемблировании команд + MOVNTPS и MOVNTPD<br /> + [+] Добавлен новый тип компиляции "Ультра (мутация + + виртуализация)"<br /> + [+] Добавлен выбор типа компиляции в окне добавления/изменения + процедуры<br /> + [+] Добавлен поиск водяных знаков в процессах (используется для + поиска водяных знаков в упакованных файлах)<br /> + [*] Улучшена совместимость с ASM компиляторами (TASM, MASM и + т.п.)<br /></p> + + <h3>Версия 1.3</h3> + + <p>[!] Исправлена ошибка, возникающая при эмуляции команды FILD + word ptr [xxxx]<br /> + [+] Для каждой процедуры можно указать тип компиляции ("Мутация" + или "Виртуализация")<br /></p> + + <h3>Версия 1.25</h3> + + <p>[+] Добавлена поддержка SEH для VC7-8<br /> + [+] Добавлена поддержка маркеров в Visual Basic (начало и конец + участка маркируются вставками на бейсике - Call VarPtr("VMProtect + begin") и Call VarPtr("VMProtect end"))<br /> + [*] В зарегистрированной версии программы исполнитель ВМ теперь + полностью видоизменяется (препятствует автоматическому + определению защиты сигнатурными сканерами PEiD, RDG Packer + Detector и т.п.)<br /></p> + + <h3>Версия 1.24</h3> + + <p>[+] Добавлена возможность вставлять в защищаемый файл водяные + знаки<br /> + [*] Исполнитель ВМ теперь полностью поддерживает многопоточные + приложения (теперь нет необходимости создавать процедуру + выделения памяти для нужд исполнителя)<br /> + [-] Убрана опция с выбором функции выделения памяти для нужд + исполнителя<br /></p> + + <h3>Версия 1.23</h3> + + <p>[!] Исправлены мелкие недочеты [+] Добавлен режим работы + "Мастер" [+] В дереве процедур добавлен показ ссылок [*] Опции + "Скрывать константы", "Динамическое создание онлайн-команд", + "Шифрация регистров при переходах", "Контроль целостности + объектов ВМ" и многое другое теперь доступны только для + зарегистрированных пользователей</p> + + <h3>Версия 1.22.2</h3> + + <p>[!] Исправлена ошибка, возникающая при компиляции проектов с + включенной опцией "Выделение памяти в исполнителе"<br /></p> + + <h3>Версия 1.22</h3> + + <p>[!] Исправлены мелкие ошибки<br /> + [+] Добавлена возможность контроля целостности байт-кода (при + включенной опции "Контроль целостности объектов ВМ")<br /></p> + + <h3>Версия 1.21</h3> + + <p>[!] Исправлена ошибка, возникающая при эмуляции CMPXCHG8b, + если в операндах участвуют регистры EAX и EDX<br /> + [+] В исполнителе присутствуют только те команды, которые будут + участвовать при исполнении байт-кода<br /> + [-] Из базовой логики ВМ убраны некоторые команды (затрудняет + анализ и декомпиляцию байт-кода)<br /></p> + + <h3>Версия 1.2</h3> + + <p>[!] Исправлена ошибка, возникающая при перемещении директории + Bound Import<br /> + [+] Добавлена возможность включения в проект участков кода, + помеченных маркерами (начало и конец участка маркируются + вставками на ассемблере - "db $EB,$10,'VMProtect begin',0" и "db + $EB,$0E,'VMProtect end',0")<br /> + [+] Добавлена возможность включать в проект экспортируемые + функции<br /> + [-] Убрана опция "Шифрация байт-кода" (шифрация байт-кода теперь + всегда включена)<br /></p> + + <h3>Версия 1.1</h3> + + <p>[!] Исправлены ошибки, возникающие при: эмуляции SBB + (неправильное состояние некоторых флагов); эмуляции CMOVxx, + CMPXCHG и CMPXCHG8b (в случаях, когда в качестве второго + аргумента использовалась адресация с применением регистра ESP или + DWORD значения)<br /> + [+] Добавлена поддержка SEH в VB6 (native)<br /> + [+] Добавлена поддержка MAP-файлов, генерируемых IDA<br /> + [+] Добавлена возможность пакетного добавления процедур<br /> + [+] Добавлен показ ссылок на команды прямо в листинге + процедур<br /> + [+] Добавлена новая опция "Шифрация регистров при + переходах"<br /></p> + + <h3>Версия 1.09</h3> + + <p>[*] Доработан процесс определения конца процедуры при + дизассемблировании циклов<br /> + [+] Для совместимости с UPX добавлена очистка флага Sharable у + Writable-секций (в случаях, когда старая таблица релоков + используется для нужд ВМ)<br /></p> + + <h3>Версия 1.08</h3> + + <p>[*] Ускорен процесс дизассемблирования больших участков + кода<br /> + [*] Доработан механизм метаморфизма исполнителя + байт-кода<br /></p> + + <h3>Версия 1.07</h3> + + <p>[!] Исправлены ошибки, возникающие при работе с PE файлами (в + случаях, когда виртуальный размер секций кода равен нулю); + обфускации FPU команд (ошибки приводили к неправильному + результату); дизассемблировании (вместо CWDE распознавалась + команда CWD); эмуляции команд ROL и ROR (если аргумент имел + размер в 1 байт)<br /> + [+] Добавлена поддержка группы команд SSE2<br /></p> + + <h3>Версия 1.06</h3> + + <p>[!] Исправлены ошибки, приводящие к неправильному состоянию A + флага после эмуляции команд SUB, CMP, DEC, NEG, CMPXCHG, SCAS и + CMPS.<br /> + [!] Исправлена ошибка, возникающая при работе с "невыровненным" + файлом<br /> + [+] Добавлена поддержка инструкций BSF, BSR и CMPXCHG8b<br /> + [+] Для многопоточных приложений теперь можно указать процедуру + выделения памяти для исполнителя ВМ (процедура выделения памяти + должна быть определена как fastcall)<br /></p> + + <h3>Версия 1.05</h3> + + <p>[+] Добавлена поддержка инструкций FUCOMPP и FCMOVxx<br /> + [+] При просмотре участков кода добавлен показ типов строк + (ANSI/Unicode/Pascal) и комментарии для полей структур, + создаваемых компиляторами<br /> + [+] Добавлена процедура метаморфизма исполнителя байт-кода<br /> + [+] Добавлены новые опции компиляции: "Шифрация байт-кода" и + "Удаление настраиваемых элементов (только для EXE файлов)"<br /> + [-] Убрана опция "Обфускация байт-кода" (обфускация байт-кода + теперь всегда включена)<br /></p> + + <h3>Версия 1.04</h3> + + <p>[!] Исправлена ошибка при определении обработчиков SEH для + С++<br /> + [*] Полностью переработан обфускатор байт-кода<br /> + [+] Добавлена подцветка настраиваемых элементов при просмотре + участков кода<br /></p> + + <h3>Версия 1.03</h3> + + <p>[+] Использование "свободного места" из-под оригинальных + участков кода для хранения байт-кода<br /> + [+] Добавлено распознавание "коротких" строк в pascal-формате + (первый байт - длина строки)<br /></p> + + <h3>Версия 1.02</h3> + + <p>[!] Исправлены ошибки с выполнением онлайн-команд в + DLL/SYS<br /> + [*] Изменён алгоритм подсчёта контрольной суммы байт-кода<br /> + [+] Добавлена опция "Контроль целостности исполнителя ВМ" (также + работает как противоотладочный приём при отладке исполнителя если + отладчик использует в качестве точек остановки INT 03).<br /> + [+] Использование "старой" таблицы настраиваемых элементов для + хранения байт-кода<br /></p> + + <h3>Версия 1.01</h3> + + <p>[!] Исправлена ошибка при создании файлов с настраиваемыми + элементами (ошибка возникала при работе DLL/SYS-файлов в + операционных системах Windows 95/98/Me)<br /> + [!] Исправлены мелкие ошибки в дизассемблере<br /> + [+] Добавлена поддержка инструкций F2XM1, FABS, FCLEX, FCOS, + FDECSTP, FINCSTP, FINIT, FLDCW, FLDLN2, FLDLG2, FPREM, FREM1, + FPTAN, FRNDINT, FSIN, FSTCW, FTST, FYL2X, FPATAN, FLDZ, + FISTP<br /> + [+] Добавлена поддержка MAP-файлов от Borland C Builder<br /> + [+] В настройках программы теперь можно выбирать язык интерфейса + и сообщений (доступны русский и английский языки)<br /></p> + + <h3>Версия 1.0</h3> + + <p>[!] Исправлены мелкие ошибки, связанные с интерфейсом<br /> + [+] Добавлена поддержка инструкций CMOV и CMPXCHG<br /></p> + + <h3>Версия 0.97</h3> + + <p>[!] Исправлены мелкие ошибки, связанные с интерфейсом<br /> + [+] Добавлена поддержка Virtual Pascal<br /></p> + + <h3>Версия 0.96</h3> + + <p>[!] Исправлены ошибки в компиляторе (некорректная работа с C + флагом при компиляции инструкций NEG и SBB; более корректная + обработка POPF; неправильная проверка CRC байт-кода при обработке + внешних условных переходов)<br /> + [!] Исправлены ошибки в исполнителе ВМ, связанные с обфускацией + байт-кода<br /> + [+] Улучшена обработка MAP-файла, генерируемого C/C++ + компиляторами (имена процедур содержат информацию об + аргументах)<br /></p> + + <h3>Версия 0.94</h3> + + <p>[!] Исправлено множество ошибок<br /></p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/images/activation_setup.png b/help/ru/images/activation_setup.png Binary files differnew file mode 100644 index 0000000..4ca4618 --- /dev/null +++ b/help/ru/images/activation_setup.png diff --git a/help/ru/images/button_action.png b/help/ru/images/button_action.png Binary files differnew file mode 100644 index 0000000..8309595 --- /dev/null +++ b/help/ru/images/button_action.png diff --git a/help/ru/images/button_compilation.png b/help/ru/images/button_compilation.png Binary files differnew file mode 100644 index 0000000..bd2cc6e --- /dev/null +++ b/help/ru/images/button_compilation.png diff --git a/help/ru/images/button_execute.png b/help/ru/images/button_execute.png Binary files differnew file mode 100644 index 0000000..82f3c9f --- /dev/null +++ b/help/ru/images/button_execute.png diff --git a/help/ru/images/button_open.png b/help/ru/images/button_open.png Binary files differnew file mode 100644 index 0000000..b6b5bcb --- /dev/null +++ b/help/ru/images/button_open.png diff --git a/help/ru/images/button_project.png b/help/ru/images/button_project.png Binary files differnew file mode 100644 index 0000000..19a37af --- /dev/null +++ b/help/ru/images/button_project.png diff --git a/help/ru/images/button_save.png b/help/ru/images/button_save.png Binary files differnew file mode 100644 index 0000000..5df92e5 --- /dev/null +++ b/help/ru/images/button_save.png diff --git a/help/ru/images/button_search.png b/help/ru/images/button_search.png Binary files differnew file mode 100644 index 0000000..c660ad6 --- /dev/null +++ b/help/ru/images/button_search.png diff --git a/help/ru/images/codelock_error.png b/help/ru/images/codelock_error.png Binary files differnew file mode 100644 index 0000000..cc89c01 --- /dev/null +++ b/help/ru/images/codelock_error.png diff --git a/help/ru/images/delphi_map.png b/help/ru/images/delphi_map.png Binary files differnew file mode 100644 index 0000000..c50db71 --- /dev/null +++ b/help/ru/images/delphi_map.png diff --git a/help/ru/images/delphi_project.png b/help/ru/images/delphi_project.png Binary files differnew file mode 100644 index 0000000..f208ba5 --- /dev/null +++ b/help/ru/images/delphi_project.png diff --git a/help/ru/images/depends.png b/help/ru/images/depends.png Binary files differnew file mode 100644 index 0000000..b9dd025 --- /dev/null +++ b/help/ru/images/depends.png diff --git a/help/ru/images/expert_find.png b/help/ru/images/expert_find.png Binary files differnew file mode 100644 index 0000000..9941871 --- /dev/null +++ b/help/ru/images/expert_find.png diff --git a/help/ru/images/export_keys.png b/help/ru/images/export_keys.png Binary files differnew file mode 100644 index 0000000..780c5ed --- /dev/null +++ b/help/ru/images/export_keys.png diff --git a/help/ru/images/functions.png b/help/ru/images/functions.png Binary files differnew file mode 100644 index 0000000..2d2d234 --- /dev/null +++ b/help/ru/images/functions.png diff --git a/help/ru/images/import_key.png b/help/ru/images/import_key.png Binary files differnew file mode 100644 index 0000000..8753423 --- /dev/null +++ b/help/ru/images/import_key.png diff --git a/help/ru/images/licenses1.png b/help/ru/images/licenses1.png Binary files differnew file mode 100644 index 0000000..6b13b78 --- /dev/null +++ b/help/ru/images/licenses1.png diff --git a/help/ru/images/lock_to_serial.png b/help/ru/images/lock_to_serial.png Binary files differnew file mode 100644 index 0000000..80d1cad --- /dev/null +++ b/help/ru/images/lock_to_serial.png diff --git a/help/ru/images/main_window.png b/help/ru/images/main_window.png Binary files differnew file mode 100644 index 0000000..af06caa --- /dev/null +++ b/help/ru/images/main_window.png diff --git a/help/ru/images/menu_edit.png b/help/ru/images/menu_edit.png Binary files differnew file mode 100644 index 0000000..93435aa --- /dev/null +++ b/help/ru/images/menu_edit.png diff --git a/help/ru/images/menu_file.png b/help/ru/images/menu_file.png Binary files differnew file mode 100644 index 0000000..464b177 --- /dev/null +++ b/help/ru/images/menu_file.png diff --git a/help/ru/images/menu_help.png b/help/ru/images/menu_help.png Binary files differnew file mode 100644 index 0000000..b15596d --- /dev/null +++ b/help/ru/images/menu_help.png diff --git a/help/ru/images/menu_project.png b/help/ru/images/menu_project.png Binary files differnew file mode 100644 index 0000000..5277978 --- /dev/null +++ b/help/ru/images/menu_project.png diff --git a/help/ru/images/menu_project_import.png b/help/ru/images/menu_project_import.png Binary files differnew file mode 100644 index 0000000..1c3991f --- /dev/null +++ b/help/ru/images/menu_project_import.png diff --git a/help/ru/images/menu_tools.png b/help/ru/images/menu_tools.png Binary files differnew file mode 100644 index 0000000..66dd6ba --- /dev/null +++ b/help/ru/images/menu_tools.png diff --git a/help/ru/images/preferences.png b/help/ru/images/preferences.png Binary files differnew file mode 100644 index 0000000..e4505de --- /dev/null +++ b/help/ru/images/preferences.png diff --git a/help/ru/images/project_add_folder.png b/help/ru/images/project_add_folder.png Binary files differnew file mode 100644 index 0000000..7cb1844 --- /dev/null +++ b/help/ru/images/project_add_folder.png diff --git a/help/ru/images/project_add_function.png b/help/ru/images/project_add_function.png Binary files differnew file mode 100644 index 0000000..a8ffe5b --- /dev/null +++ b/help/ru/images/project_add_function.png diff --git a/help/ru/images/project_add_license.png b/help/ru/images/project_add_license.png Binary files differnew file mode 100644 index 0000000..52a9153 --- /dev/null +++ b/help/ru/images/project_add_license.png diff --git a/help/ru/images/project_file_delete.png b/help/ru/images/project_file_delete.png Binary files differnew file mode 100644 index 0000000..90dae90 --- /dev/null +++ b/help/ru/images/project_file_delete.png diff --git a/help/ru/images/project_file_menu.png b/help/ru/images/project_file_menu.png Binary files differnew file mode 100644 index 0000000..de181ae --- /dev/null +++ b/help/ru/images/project_file_menu.png diff --git a/help/ru/images/project_file_protection.png b/help/ru/images/project_file_protection.png Binary files differnew file mode 100644 index 0000000..340a2f4 --- /dev/null +++ b/help/ru/images/project_file_protection.png diff --git a/help/ru/images/project_file_settings.png b/help/ru/images/project_file_settings.png Binary files differnew file mode 100644 index 0000000..df1ef35 --- /dev/null +++ b/help/ru/images/project_file_settings.png diff --git a/help/ru/images/project_functions.png b/help/ru/images/project_functions.png Binary files differnew file mode 100644 index 0000000..c25b336 --- /dev/null +++ b/help/ru/images/project_functions.png diff --git a/help/ru/images/project_functions_content.png b/help/ru/images/project_functions_content.png Binary files differnew file mode 100644 index 0000000..799e9d9 --- /dev/null +++ b/help/ru/images/project_functions_content.png diff --git a/help/ru/images/project_functions_content2.png b/help/ru/images/project_functions_content2.png Binary files differnew file mode 100644 index 0000000..ac06908 --- /dev/null +++ b/help/ru/images/project_functions_content2.png diff --git a/help/ru/images/project_functions_menu.png b/help/ru/images/project_functions_menu.png Binary files differnew file mode 100644 index 0000000..e5f8217 --- /dev/null +++ b/help/ru/images/project_functions_menu.png diff --git a/help/ru/images/project_functions_menu2.png b/help/ru/images/project_functions_menu2.png Binary files differnew file mode 100644 index 0000000..55c9d5a --- /dev/null +++ b/help/ru/images/project_functions_menu2.png diff --git a/help/ru/images/project_functions_menu3.png b/help/ru/images/project_functions_menu3.png Binary files differnew file mode 100644 index 0000000..ec1a35b --- /dev/null +++ b/help/ru/images/project_functions_menu3.png diff --git a/help/ru/images/project_functions_search.png b/help/ru/images/project_functions_search.png Binary files differnew file mode 100644 index 0000000..2d87f3f --- /dev/null +++ b/help/ru/images/project_functions_search.png diff --git a/help/ru/images/project_generate_keys.png b/help/ru/images/project_generate_keys.png Binary files differnew file mode 100644 index 0000000..fd7d3cc --- /dev/null +++ b/help/ru/images/project_generate_keys.png diff --git a/help/ru/images/project_options.png b/help/ru/images/project_options.png Binary files differnew file mode 100644 index 0000000..8cd9ba5 --- /dev/null +++ b/help/ru/images/project_options.png diff --git a/help/ru/images/project_script.png b/help/ru/images/project_script.png Binary files differnew file mode 100644 index 0000000..4f875b2 --- /dev/null +++ b/help/ru/images/project_script.png diff --git a/help/ru/images/properties_calc.png b/help/ru/images/properties_calc.png Binary files differnew file mode 100644 index 0000000..dba30ea --- /dev/null +++ b/help/ru/images/properties_calc.png diff --git a/help/ru/images/properties_directory.png b/help/ru/images/properties_directory.png Binary files differnew file mode 100644 index 0000000..3dbcbf2 --- /dev/null +++ b/help/ru/images/properties_directory.png diff --git a/help/ru/images/properties_dump.png b/help/ru/images/properties_dump.png Binary files differnew file mode 100644 index 0000000..0344e9c --- /dev/null +++ b/help/ru/images/properties_dump.png diff --git a/help/ru/images/properties_dump_goto.png b/help/ru/images/properties_dump_goto.png Binary files differnew file mode 100644 index 0000000..febef55 --- /dev/null +++ b/help/ru/images/properties_dump_goto.png diff --git a/help/ru/images/properties_export.png b/help/ru/images/properties_export.png Binary files differnew file mode 100644 index 0000000..feb4b92 --- /dev/null +++ b/help/ru/images/properties_export.png diff --git a/help/ru/images/properties_import.png b/help/ru/images/properties_import.png Binary files differnew file mode 100644 index 0000000..aca775c --- /dev/null +++ b/help/ru/images/properties_import.png diff --git a/help/ru/images/properties_resources.png b/help/ru/images/properties_resources.png Binary files differnew file mode 100644 index 0000000..a8fa472 --- /dev/null +++ b/help/ru/images/properties_resources.png diff --git a/help/ru/images/properties_segments.png b/help/ru/images/properties_segments.png Binary files differnew file mode 100644 index 0000000..e705ded --- /dev/null +++ b/help/ru/images/properties_segments.png diff --git a/help/ru/images/visual_studio_map.png b/help/ru/images/visual_studio_map.png Binary files differnew file mode 100644 index 0000000..b04bd53 --- /dev/null +++ b/help/ru/images/visual_studio_map.png diff --git a/help/ru/images/watermarks_add.png b/help/ru/images/watermarks_add.png Binary files differnew file mode 100644 index 0000000..7211f06 --- /dev/null +++ b/help/ru/images/watermarks_add.png diff --git a/help/ru/images/watermarks_menu.png b/help/ru/images/watermarks_menu.png Binary files differnew file mode 100644 index 0000000..5c20745 --- /dev/null +++ b/help/ru/images/watermarks_menu.png diff --git a/help/ru/images/watermarks_search.png b/help/ru/images/watermarks_search.png Binary files differnew file mode 100644 index 0000000..2e48de3 --- /dev/null +++ b/help/ru/images/watermarks_search.png diff --git a/help/ru/images/watermarks_setup.png b/help/ru/images/watermarks_setup.png Binary files differnew file mode 100644 index 0000000..9f04d8e --- /dev/null +++ b/help/ru/images/watermarks_setup.png diff --git a/help/ru/images/weblm_1.png b/help/ru/images/weblm_1.png Binary files differnew file mode 100644 index 0000000..26bdaee --- /dev/null +++ b/help/ru/images/weblm_1.png diff --git a/help/ru/images/weblm_2.png b/help/ru/images/weblm_2.png Binary files differnew file mode 100644 index 0000000..6791edc --- /dev/null +++ b/help/ru/images/weblm_2.png diff --git a/help/ru/info.htm b/help/ru/info.htm new file mode 100644 index 0000000..6219ddb --- /dev/null +++ b/help/ru/info.htm @@ -0,0 +1,38 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Раздел "Свойства"</title> +</head> + +<body> + <h1>Раздел "Свойства"</h1> + <p>Раздел "Свойства" отображает различную информацию о защищаемом приложении, а также позволяет исключить из упаковки те или иные сегменты данных и ресурсов. + Изменения, произведенные в этой секции, сохраняются в файл проекта.</p> + <p><img src="images/properties_directory.png" /></p> + <p>Раздел "Свойства" содержит следующие секции:</p> + <ul> + <li><a href="info_directories.htm">Директории</a></li> + <li><a href="info_segments.htm">Сегменты</a></li> + <li><a href="info_imports.htm">Импорты</a></li> + <li><a href="info_exports.htm">Экспорты</a></li> + <li><a href="info_resources.htm">Ресурсы</a></li> + <li><a href="info_calc.htm">Калькулятор</a></li> + <li><a href="info_dump.htm">Дамп</a></li> + </ul> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/info_calc.htm b/help/ru/info_calc.htm new file mode 100644 index 0000000..66a835e --- /dev/null +++ b/help/ru/info_calc.htm @@ -0,0 +1,31 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Секция "Калькулятор"</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Секция "Калькулятор"</h1> + + <p>Позволяет определить файловое смещение по виртуальному адресу и наоборот:</p> + <p><img src="images/properties_calc.png" /></p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/info_directories.htm b/help/ru/info_directories.htm new file mode 100644 index 0000000..79d1401 --- /dev/null +++ b/help/ru/info_directories.htm @@ -0,0 +1,30 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Секция "Директории"</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Секция "Директории"</h1> + + <p>Отображает информацию о директориях файла:</p> + <p><img src="images/properties_directory.png" /></p> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/info_dump.htm b/help/ru/info_dump.htm new file mode 100644 index 0000000..2fe28e8 --- /dev/null +++ b/help/ru/info_dump.htm @@ -0,0 +1,35 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Секция "Дамп"</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Секция "Дамп"</h1> + + <p>Отображает дамп памяти защищаемого приложения в виде машинных кодов и ассемблерных команд:</p> + <p><img src="images/properties_dump.png" /></p> + + <p>Кнопка "Перейти на адрес" на панели инструментов позволяет перейти на заданный адрес защищаемого приложения:</p> + <p><img src="images/properties_dump_goto.png" /></p> + <p>Для быстрого перехода к нужной функции начните вводить ее имя в строке быстрого поиска. Также можно ввести точный адрес.</p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/info_exports.htm b/help/ru/info_exports.htm new file mode 100644 index 0000000..d081124 --- /dev/null +++ b/help/ru/info_exports.htm @@ -0,0 +1,28 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Секция "Экспорты"</title> +</head> + +<body> + <h1>Секция "Экспорты"</h1> + + <p>Отображает информацию об экспортах файла:</p> + <p><img src="images/properties_export.png" /></p> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/info_imports.htm b/help/ru/info_imports.htm new file mode 100644 index 0000000..2cea11d --- /dev/null +++ b/help/ru/info_imports.htm @@ -0,0 +1,28 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Секция "Импорты"</title> +</head> + +<body> + <h1>Секция "Импорты"</h1> + + <p>Отображает информацию об импортируемых функциях и библиотеках:</p> + <p><img src="images/properties_import.png" /></p> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/info_resources.htm b/help/ru/info_resources.htm new file mode 100644 index 0000000..503460a --- /dev/null +++ b/help/ru/info_resources.htm @@ -0,0 +1,31 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Секция "Ресурсы"</title> +</head> + +<body> + <h1>Секция "Ресурсы"</h1> + + <p>Отображает информацию о ресурсах:</p> + <p><img src="images/properties_resources.png" /></p> + <ul> + <li><strong> Исключить из упаковки</strong> - Ресурс можно исключить из <a href="project_options.htm#PackOutputFile">упаковки</a>.</li> + </ul> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/info_segments.htm b/help/ru/info_segments.htm new file mode 100644 index 0000000..e2a4494 --- /dev/null +++ b/help/ru/info_segments.htm @@ -0,0 +1,32 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Раздел "Свойства"</title> +</head> + +<body> + <h1>Секция "Сегменты"</h1> + + <p>Отображает информацию о сегментах:<p></p> + <p><img src="images/properties_segments.png" /></p> + <ul> + <li><strong>Исключить из защиты памяти</strong> - Сегмент можно исключить из <a href="project_options.htm#MemoryProtection">защиты памяти</a>.</li> + <li><strong> Исключить из упаковки</strong> - Сегмент можно исключить из <a href="project_options.htm#PackOutputFile">упаковки</a>.</li> + </ul> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html>
\ No newline at end of file diff --git a/help/ru/main_menu.htm b/help/ru/main_menu.htm new file mode 100644 index 0000000..36b181d --- /dev/null +++ b/help/ru/main_menu.htm @@ -0,0 +1,41 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Главное меню</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + /*]]>*/ + </style> +</head> + +<body> + <h1>Главное меню</h1> + + <p>Главное меню состоит из следующих пунктов:</p> + + <ul> + <li><a href="menu_file.htm">Файл</a></li> + <li><a href="menu_edit.htm">Правка</a></li> + <li><a href="menu_project.htm">Проект</a></li> + <li><a href="menu_tools.htm">Инструменты</a></li> + <li><a href="menu_help.htm">Справка</a></li> + </ul> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/main_window.htm b/help/ru/main_window.htm new file mode 100644 index 0000000..76f2e15 --- /dev/null +++ b/help/ru/main_window.htm @@ -0,0 +1,42 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Главное окно</title> +</head> + +<body> + <h1>Главное окно</h1> + + <p>Главное окно состоит из следующих элементов:</p> + + <ul> + <li><a href="main_menu.htm">Главное меню</a></li> + <li><a href="toolbar.htm">Панель инструментов</a></li> + <li>Панель управления, состоящая из трех разделов: + <ul> + <li><a href="project.htm">Раздел "Проект"</a></li> + <li><a href="functions.htm">Раздел "Функции"</a></li> + <li><a href="info.htm">Раздел "Свойства"</a></li> + </ul> + </li> + <li>Лог компиляции</li> + </ul> + <p><img src="images/main_window.png" /></p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/activation.htm b/help/ru/manager/activation.htm new file mode 100644 index 0000000..302a559 --- /dev/null +++ b/help/ru/manager/activation.htm @@ -0,0 +1,89 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Система Активации</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Система Активации</h1> + + <h3>Что Это?</h3> + + <p>Активация - это двухэтапный процесс регистрации приложения. На + первом этапе (обычно после покупки) покупатель получает код + активации (выглядит как XXXX-YYYY-ZZZZ). На втором этапе + покупатель вводит этот код в приложение, приложение соединяется + через Интернет с сервером производителя ПО, сервер проверяет код + активации и выдает приложению серийный номер, связанный с этим + кодом активации и обычно привязанный к оборудованию + пользователя.</p> + + <p>Такой подход позволяет контролировать использование лицензий + покупателями, предотвращать утечки лицензий, а также многое + другое, например демо-лицензии или надежные триальные + периоды.</p> + + <h3>Зачем Она Мне Нужна?</h3> + + <p>Система активации дает производителю ПО достаточно широкие + возможности, например:</p> + + <ul> + <li><strong>Короткие серийные номера</strong> - длинные + серийные номера хороши всем, кроме длины. Пользователи могут + ошибиться при вводе, почтовые программы иногда портят некоторые + символы, однако только длинные серийные номера позволяют хранить + достаточный объем дополнительной информации. Коды активации + позволяют решить все проблемы длинных серийных номеров, не + влияя на их положительные стороны.</li> + + <li><strong>Контроль количества инсталляций</strong> - все + активации доступны производителю онлайн в реальном времени. Их + можно отслеживать, анализировать, блокировать, оказывать + поддержку пользователям и т.д.</li> + + <li><strong>Триалы</strong> - можно создавать серийные номера, + ограниченные по времени, используя "режимы" продуктов - + "modes".</li> + + <li><strong>Подписки</strong> - подписки похожи на триалы, + однако стоят денег. Вы можете продавать пользователю право + работать с программой в течение определенного времени, как это + делают производители антивирусов - просто продавайте коды + активации на очередной год обслуживания.</li> + </ul> + + <p>Более подробная информация о системе активации доступна в + соответствующем <a href= + "http://vmpsoft.com/products/web-license-manager/" target= + "_blank">разделе</a> нашего сайта.</p> + + <h3>Что Потребуется Сделать?</h3> + + <p>VMProtect Ultimate дополнен несколькими <a href= + "activation/api.htm">функциями</a>, которые позволяют + сравнительно легко реализовать как онлайн, так и оффлайн + активацию. Вам также потребуется установленный на сервере + <a href="activation/weblm.htm">Web License Manager</a>. Наконец, + потребуется <a href="activation/vmprotect.htm">настроить</a> + проект защиты в VMProtect, чтобы модуль активации знал адрес + сервера WebLM.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/activation/api.htm b/help/ru/manager/activation/api.htm new file mode 100644 index 0000000..8a22254 --- /dev/null +++ b/help/ru/manager/activation/api.htm @@ -0,0 +1,223 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>API Активации</title> + <style type="text/css"> +/*<![CDATA[*/ + th {text-align:left;} + table {border-collapse:collapse; margin-top: 4px;} + td,th {border: 1px solid #B0B0B0; padding-left:10;padding-right:10;} + /*]]>*/ + </style> +</head> + +<body> + <h1>API Активации</h1> + + <p>API Активации содержит всего 4 функции. Две предназначены для + онлайн-активации и две для оффлайн, когда на компьютере + отсутствует доступ в Интернет. API Активации предназначено для + взаимодействия с Web License Manager, так что разработчику все + равно необходимо вызывать API системы лицензирования, чтобы + использовать серийные номера, полученные от WebLM.</p><strong id= + "VMProtectActivateLicense">VMProtectActivateLicense</strong> + + <p>Функция передает код активации на сервер и возвращает серийный + номер, подходящий для этого конкретного компьютера. В противном + случае возвращается <a href="#codes">код ошибки</a>.</p> + <pre class="code">int VMProtectActivateLicense(const char *code, char *serial, int size); +</pre> + + <p>Параметр <strong>code</strong> содержит код активации, который + получен от Web License Manager в процессе покупки лицензии. + Параметр <strong>serial</strong> указывает на блок памяти размера + <strong>size</strong>, в который будет помещен сгенерированный + WebLM серийный номер.</p><strong id= + "VMProtectDeactivateLicense">VMProtectDeactivateLicense</strong> + + <p>Функция передает серийный номер на сервер для деактивации. + Возможные коды возврата перечислены <a href= + "#codes">ниже</a>.</p> + <pre class="code">int VMProtectDeactivateLicense(const char *serial); +</pre> + + <p>Параметр <strong>serial</strong> содержит серийный номер (не + код активации), полученный ранее от WebLM в процессе + активации.</p><strong id= + "VMProtectGetOfflineActivationString">VMProtectGetOfflineActivationString</strong><br /> + + <strong id= + "VMProtectGetOfflineDeactivationString">VMProtectGetOfflineDeactivationString</strong> + + <p>Эти две функции работают практически аналогично двум + предыдущим с той лишь разницей, что они не пытаются подключиться + к серверу WebLM. Вместо этого они возвращают блок текста, который + необходимо скопировать на компьютер где есть доступ в Интернет, + открыть там форму оффлайн-активации WebLM и вставить туда этот + текст.</p> + <pre class="code">int VMProtectGetOfflineActivationString(const char *code, char *buf, int size); +int VMProtectGetOfflineDeactivationString(const char *serial, char *buf, int size); +</pre> + + <p>Параметры <strong>code</strong> и <strong>serial</strong> + аналогичны параметрам онлайн-версий функций, параметр + <strong>buf</strong> должен указывать на буфер размером 1000 байт + или больше, туда будет скопирован текстовый блок для формы + оффлайн-активации. Возможные коды ошибок перечислены <a href= + "#codes">ниже</a>.</p> + + <h3 id="codes">Возможные Коды Ошибок</h3> + + <table border="1" cellspacing="0" cellpadding="2"> + <tr> + <th>Код</th> + + <th>Значение</th> + + <th>Описание</th> + </tr> + + <tr> + <td>ACTIVATION_OK</td> + + <td>0</td> + + <td>Активация прошла успешно, переменная + <strong>serial</strong> содержит серийный номер.</td> + </tr> + + <tr> + <td>ACTIVATION_SMALL_BUFFER</td> + + <td>1</td> + + <td>Буфер для серийного номера слишком маленький. Минимальный + размер буфера вычисляется по формуле: bits / 8 * 3 / 2 + N, + где bits - длина RSA ключа в битах, а N - "константа + безопасности" - дополнительное количество байт на случай + переносов строк и прочих спец-символов. Рекомендуется + использовать как минимум 10.</td> + </tr> + + <tr> + <td>ACTIVATION_NO_CONNECTION</td> + + <td>2</td> + + <td>Модуль активации не смог подключиться к Web License + Manager.</td> + </tr> + + <tr> + <td>ACTIVATION_BAD_REPLY</td> + + <td>3</td> + + <td>Сервер активации вернул неожиданный результат. Это + означает проблемы конфигурации сервера, неправильный url + сервера активации или попытку взлома.</td> + </tr> + + <tr> + <td>ACTIVATION_BANNED</td> + + <td>4</td> + + <td>Этот код активации заблокирован на сервере производителем + ПО через интерфейс WebLM (например, из-за + утечки кода активации с пиратской копией). Не путать с ACTIVATION_ALREADY_USED.</td> + </tr> + + <tr> + <td>ACTIVATION_CORRUPTED</td> + + <td>5</td> + + <td>Что-то пошло совсем не так. Ошибка выдается системой + самопроверки модуля активации и с высокой вероятностью + означает попытку взлома. В случае получения этой ошибки + дальнейшие операции с серийными номерами и активацией не + могут считаться безопасными.</td> + </tr> + + <tr> + <td>ACTIVATION_BAD_CODE</td> + + <td>6</td> + + <td>Данный код не найден в базе данных сервера активаций. + Возможно пользователь ошибся при вводе кода, так что можно + попросить его проверить правильность ввода данных.</td> + </tr> + + <tr> + <td>ACTIVATION_ALREADY_USED</td> + + <td>7</td> + + <td>Счетчик активаций этого кода дошел до нуля и дальнейшие + активации невозможны. Это не обозначает, что код плохой или + заблокирован - код хороший. Пользователю нужно связаться с + производителем ПО и докупить необходимое количество лицензий + или же деинсталлировать программу на других компьютерах, + чтобы увеличить значение счетчика в базе данных.</td> + </tr> + + <tr> + <td>ACTIVATION_SERIAL_UNKNOWN</td> + + <td>8</td> + + <td>Ошибка деактивации. Означает, что данный серийный + номер не найден в базе данных сервера. Соответственно, + деактивация не может быть проведена успешно.</td> + </tr> + + <tr> + <td>ACTIVATION_EXPIRED</td> + + <td>9</td> + + <td>Ошибка активации. Означает, что период действия кода активации истек.</td> + </tr> + + <tr> + <td>ACTIVATION_NOT_AVAILABLE</td> + + <td>10</td> + + <td>Ошибка означает, что активация/деактивация недоступна.</td> + </tr> + + </table> + + <h3>Маленькие хитрости</h3> + + <p>API Активации достаточно простое, так что с ним не должно + возникнуть сложностей. Не забудьте предоставить пользователям + интерфейс для оффлайн-активации, если онлайн-активация + завершилась неудачей из-за проблем с доступом в интернет. Также + не забывайте, что API Активации не сохраняет полученный серийный + номер и не передает его модулю лицензирования - это задача + разработчика. Нет необходимости вызывать API Активации при каждом + запуске приложения - достаточно вызвать его один раз, получить + серийный номер от WebLM, сохранить его в удобном месте и в + дальнейшем использовать только его.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/activation/vmprotect.htm b/help/ru/manager/activation/vmprotect.htm new file mode 100644 index 0000000..f0a3440 --- /dev/null +++ b/help/ru/manager/activation/vmprotect.htm @@ -0,0 +1,38 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Настройка Активации в VMProtect</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Настройка Активации в VMProtect</h1> + + <p>Для работы <a href="api.htm">API Активации</a> требуется адрес + сервера WebLM, так что необходимо задать его в настройках проекта + VMProtect. Чтобы сделать это, запустите VMProtect и перейдите в + раздел настроек:</p><br /><img src="../../images/activation_setup.png" alt="Настройка сервера активации" /> + + <p>Введите адрес в поле "Сервер активации". Адрес должен + выглядеть так: http://<em>yourserver</em>/<em>weblm + path</em>/activate.php. Это первое место, которое следует проверить, если в дальнейшем Вы столкнетесь + с ошибками в процессе онлайн-активации.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/activation/weblm.htm b/help/ru/manager/activation/weblm.htm new file mode 100644 index 0000000..35cf308 --- /dev/null +++ b/help/ru/manager/activation/weblm.htm @@ -0,0 +1,55 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Поддержка Активации в Web License Manager</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Поддержка Активации в Web License Manager</h1> + + <p>Подробно Web License Manager описан <a href= + "http://vmpsoft.com/products/web-license-manager/" target= + "_blank">на сайте</a>, здесь даны минимальные инструкции по + созданию кода активации для последующего использования с API + Активации.</p> + + <p>Для начала войдите в Web License Manager (можно использовать + демо-версию на нашем сайте) и создайте продукт. Затем + экспортируйте продукт как проект VMProtect, чтобы иметь + возможность использовать его для настроек лицензирования и + активации. После того как проект настроен, необходимые проверки + добавлены в код и исполняемый файл защищен, нажмите ссылку "Add + New Code" в левой панели WebLM:</p> + <p><img src="../../images/weblm_1.png" /></p> + + <p>Выберите нужный продукт в верхнем выпадающем списке и + заполните остальные поля формы данными, которые Вы хотите + поместить в серийный номер. Затем нажмите кнопку "Save". Вы + увидите код активации, который можно использовать для отладки API + Активации.</p> + <p><img src="../../images/weblm_2.png" /></p> + + <p>Множество других возможностей Web License Manager (таких, как интеграция с регистраторами или + автоматическая генерация кодов активации) можно подробно изучить в <a href= + "http://vmpsoft.com/products/web-license-manager/" target= + "_blank">онлайн-версии руководства пользователя</a>.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/features.htm b/help/ru/manager/features.htm new file mode 100644 index 0000000..c717767 --- /dev/null +++ b/help/ru/manager/features.htm @@ -0,0 +1,138 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Возможности системы лицензирования VMProtect</title> +</head> + +<body> + <h1>Возможности системы лицензирования VMProtect</h1> + + <h3>Надежные серийные номера</h3> + + <p>Система лицензирования использует асимметричные алгоритмы для + шифрования серийных номеров. Номер шифруется приватным ключом, + который хранится только у разработчика продукта. Защищаемый + продукт расшифровывает номер публичным ключом и проверяет его. В + силу длины используемых ключей (от 1024 бит для RSA) практически + невозможно подобрать закрытый ключ и создать генератор ключей для + продукта.</p> + + <h3 id="lock">Привязка кода к серийному номеру</h3> + + <p>VMProtect позволяет исполнять часть кода программы на + виртуальной машине. Набор команд виртуальной машины меняется при + каждой сборке защищаемой программы. Система лицензирования + позволяет зашифровать часть команд виртуальной машины ключом, + который хранится в серийном номере. Таким образом, даже если + хакер исправит условный переход в программе, код все равно не + будет работать без корректного серийного номера. А так как + расшифровка кода также происходит под управлением виртуальной + машины, то даже наличие серийного номера не дает возможности + легко проанализировать алгоритм + расшифровки.</p> + + <h3>Ограничение периода бесплатных обновлений</h3> + + <p>Система лицензирования позволяет записать в ключ такую дату, + что версии приложения, собранные после этой даты, не будут + работать с этим ключом. Это позволяет ограничивать период + бесплатных обновлений продукта. Например при продаже в ключ + записывается текущая дата плюс один год и пользователь может + скачивать с сайта новые версии в течение года. Ключ будет + работать в этих версиях. По истечение года у пользователя будет + выбор: пользоваться последней "рабочей" версией программы или + купить обновление еще на один год.</p> + + <h3>Срок годности ключа</h3> + + <p>Система лицензирования позволяет записать в ключ дату, после + которой ключ перестает работать. Это удобно для продажи + продуктов, требующих периодического обновления. Например при + продаже в серийный номер помещается текущая дата плюс год и + программа будет работать у пользователя в течение года. В отличие + от ограничения периода бесплатных обновлений, в этом случае у + пользователя нет выбора - ему придется купить новую лицензию, + если он хочет продолжать пользоваться + программой.</p> + + <h3>Ограничение времени работы программы</h3> + + <p>Система лицензирования позволяет ограничить время работы + экземпляра программы. Это бывает полезно для демонстрационных + задач. Например покупатель хочет получить для тестирования + полноценную копию программы. В этом случае можно передать ему + серийный номер, который ограничит время работы программы, скажем, + десятью минутами. По истечение этого времени программа прекратит + свою работу. Такая схема подходит для демонстрационных версий + различных серверных приложений, где простой перезапуск приложения + будет неудобен.</p> + + <h3>Привязка к оборудованию</h3> + + <p>Система лицензирования позволяет получить идентификатор + оборудования пользователя на основе процессора, сетевых плат и + информации операционной системы. Серийный номер может быть создан + так, что он будет работать только на оборудовании с этим + идентификатором. Это позволяет ограничить использование одной + лицензии на нескольких компьютерах.</p> + + <h3>Черный список</h3> + + <p>В случае дискредитации серийного номера, система + лицензирования позволяет занести такой номер в черный список, + после чего номер не будет работать в следующих версиях + приложения.</p> + + <h3>Хранение данных</h3> + + <p>Система лицензирования позволяет хранить в серийном номере и + выдавать защищаемой программе следующие данные: имя пользователя, + e-mail, а также до 255 байт произвольных данных (т.н. "данные + пользователя"). Это может быть использовано для показа в диалоге + "О Программе", для реализации дополнительных проверок серийного + номера, для хранения констант, доступных только в + зарегистрированной версии продукта и т.п.</p> + + <h3>Ограниченние работы демо-версии по времени</h3> + + <p>Используя систему <a href="activation.htm">активации</a> + производитель ПО может автоматически создавать ограниченные по времени и привязанные к оборудованию + пользователя серийные номера. Это позволяет организовать надежно защищенный + демо-период для приложения, так как VMProtect не прячет триальные + метки на компьютере пользователя, а вместо этого генерирует + полноценный, но ограниченный по времени серийный номер. Активация + обычно производится непосредственно через интернет, но в API активации предусмотрен + и оффлайновый режим.</p><br /> + <hr noshade="noshade" size="1" /> + + <h1>Чего система лицензирования не умеет и + почему?</h1> + + <h3>100%-но надежная привязка к оборудованию</h3> + + <p>Несмотря на то, что система лицензирования позволяет + привязаться к идентификатору оборудования, следует понимать, что + большинство данных об оборудовании получается средствами + операционной системы, которые могут быть перехвачены хакером с + целью изменения данных. Система лицензирования применяет ряд + схем, позволяющих минимизировать такие риски, однако если вам + требуется 100%-но надежная привязка к оборудованию, мы + рекомендуем воспользоваться решением на базе USB-ключей, с + которыми также может работать VMProtect.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/howitworks.htm b/help/ru/manager/howitworks.htm new file mode 100644 index 0000000..0ebb8c6 --- /dev/null +++ b/help/ru/manager/howitworks.htm @@ -0,0 +1,61 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Как работает система лицензирования?</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Как работает система лицензирования?</h1> + + <h3>Защита приложения</h3> + + <p>VMProtect в процессе защиты приложения интегрирует в него код + проверки серийных номеров. При этом используется информация, + указанная в секции "Лицензии" раздела "Проект". В приложение помещается + публичный ключ продукта, при помощи которого будет осуществляться + расшифровка серийных номеров. Также в приложение помещается дата + защиты и ряд дополнительных данных, необходимых для работы + системы лицензирования.</p> + + <h3>Создание серийных номеров</h3> + + <p>Серийные номера могут быть созданы в секции <a href= + "licenses.htm">"Лицензии"</a> раздела "Проект" или при помощи отдельных приложений + - <a href="keygen/index.htm">генераторов ключей</a>. Серийный + номер - это набор данных о покупателе, зашифрованный асимметричным + алгоритмом. Серийный номер передается покупателю, тот вводит его + в программу, после чего он проверяется модулем + лицензирования.</p> + + <h3>Проверка серийного номера в программе</h3> + + <p>Модуль лицензирования предоставляет защищаемой программе + <a href="usage/api.htm">несколько функций</a> для работы с + серийными номерами. Программа передает модулю лицензирования + серийный номер и запрашивает информацию о нем. Модуль + лицензирования выдает краткое состояние серийного номера + (рабочий/нерабочий и почему), а также может выдать подробную + информацию о серийном номере, такую как имя пользователя, e-mail, + срок действия номера и т.д. Защищаемая программа анализирует + информацию о серийном номере и принимает решение о продолжении + или завершении работы, а также об ограничениях + функционала.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/index.htm b/help/ru/manager/index.htm new file mode 100644 index 0000000..3cccf75 --- /dev/null +++ b/help/ru/manager/index.htm @@ -0,0 +1,43 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Система лицензирования</title> +</head> + +<body> + <h1>Система лицензирования</h1> + + <p>Система лицензирования решает задачи создания и проверки + серийных номеров. Поддерживаются ограничения работы защищаемого + ПО по дате и времени, привязка к оборудованию, шифрование кода + серийным номером, ограничение периода бесплатных обновлений и + многое другое. Система построена на асимметричных алгоритмах + шифрования, что минимизирует вероятность создания генераторов + серийных номеров. Для защиты системы лицензирования применяется + виртуализация VMProtect, что минимизирует вероятность взлома на + уровне кода и создания патчей.</p> + + <ul> + <li><a href="features.htm">Возможности системы лицензирования</a></li> + <li><a href="howitworks.htm">Схема работы системы лицензирования</a></li> + <li><a href="licenses.htm">Управление лицензиями: создание, изменение, блокировка и т.п.</a></li> + <li><a href="usage/index.htm">Пример интеграции в приложение</a></li> + <li><a href="keygen/index.htm">Автоматическое создание серийных номеров</a></li> + </ul> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/keygen/algorithms.htm b/help/ru/manager/keygen/algorithms.htm new file mode 100644 index 0000000..05b9bc3 --- /dev/null +++ b/help/ru/manager/keygen/algorithms.htm @@ -0,0 +1,79 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Алгоритмы шифрования серийных номеров</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Алгоритмы шифрования серийных номеров</h1> + + <p>Надежность ключей системы лицензирования основывается на + применении асимметричных алгоритмов шифрования. В текущей версии + реализован алгоритм RSA с длиной ключа от 1024 до 16384 бит. В + будущих версиях планируется добавление других алгоритмов, + основанных на ECC, а также схем, совмещающих симметричные и + асимметричные шифры.</p> + + <p>Используемый алгоритм уникален для каждого продукта. Ключи, + созданные с одним алгоритмом, не подойдут к другому, поэтому + смена алгоритмов после создания хоть одной лицензии не + допускается. Модуль защиты, располагающийся в защищаемой + программе, "знает" каким алгоритмом должен быть зашифрован + серийный номер и не примет ключ, созданный другим алгоритмом или + тем же алгоритмом, но с другими параметрами (скажем, с другой + длиной ключа).</p> + + <h3>Алгоритм RSA</h3> + + <p>Шифрование серийного номера алгоритмом RSA происходит по + следующей схеме:</p> + + <ul> + <li><strong>Добавление случайных данных в начало + номера</strong> - метод основывается на RFC2313, однако + реализация немного отличается от описаной там. В начало + серийного номера добавляютя байты: 00 02 NN...NN 00, где NN..NN + - от 8 до 16 случайных ненулевых байт. Количество байт + выбирается случайным, однако принимается во внимание длина + серийного номера и максимальная вместительность ключа.</li> + + <li><strong>Добавление случайных данных в конец номера</strong> + - окончательное количество байт в серийном номере должно + равняться количеству бит в ключах алгоритма, деленному на 8. + Серийный номер дополняется до этого числа байт случайными + данными. В результате получается следующий формат серийного + номера: 00 02 NN..NN 00 DD..DD MM..MM, где NN - набор случайных + ненулевых байтов, DD - исходный серийный номер, MM -набор + случайных байтов (в т.ч. и нулевых). Суммарная длина + последовательности должна равняться количеству бит, + применяемому в алгоритме, деленному на 8.</li> + + <li><strong>Шифрование</strong> - производится по стандатной + схеме, реализованной во многих библиотеках, работающих с + большими числами. Генератор на PHP содержит всю необходимую + информацию в открытом виде.</li> + + <li><strong>Упаковка</strong> - полученный после шифрования + набор байт кодируется в base-64 - это и есть серийный номер, + который отправляется покупателю.</li> + </ul><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/keygen/index.htm b/help/ru/manager/keygen/index.htm new file mode 100644 index 0000000..2650150 --- /dev/null +++ b/help/ru/manager/keygen/index.htm @@ -0,0 +1,121 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Генераторы ключей</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Генераторы ключей</h1><strong>Зачем они нужны?</strong> + + <p>Помимо VMProtect, серийные номера могут генерироваться другими + программами - генераторами. Это нужно для автоматизации выдачи + номеров без участия человека. Покупатель покупает продукт, + регистратор делает HTTP-запрос на сайт производителя, там + запускается программа-генератор и на основе данных о покупателе + формирует серийный номер. Номер отправляется покупателю и + производителю. Производитель вносит его в базу VMProtect вручную, + через окно импорта лицензий.</p><strong>Принцип работы</strong> + + <p>Система лицензирования VMProtect построена на асимметричных + алгоритмах, поэтому для генерации серийных номеров требуется + секретный ключ продукта. Этот ключ можно экспортировать в окне + свойств продукта и передать программе-генератору подходящим для + нее способом.</p> + + <p>Программа-генератор вызывается регистратором через + HTTP-запрос. Генератор на PHP может быть вызван напрямую, + генератор в виде DLL - косвенно, но алгоритм остается одним и тем + же:</p> + + <ul> + <li>Получить данные о пользователе от регистратора</li> + + <li>Добавить необходимую информацию, которую указал + производитель</li> + + <li>Сформировать серийный номер</li> + + <li>Зашифровать его одним из алгоритмов</li> + + <li>Передать результат регистратору</li> + </ul><strong>Существуют ли готовые генераторы?</strong> + + <p>С системой лицензирования поставляется три готовых генератора + серийных номеров <a href="keygen_dll.htm">в виде DLL</a>, + <a href="keygen_net.htm">для платформы .Net</a> и <a href= + "keygen_php.htm">реализованный на PHP</a>.</p><strong>Можно ли + сделать свой генератор?</strong> + + <p>Можно. Формат серийного номера находится <a href= + "serial_format.htm">здесь</a>, алгоритмы шифрования серийного + номера описаны <a href= + "algorithms.htm">здесь</a>.</p><strong>Насколько это + безопасно?</strong> + + <p>В общем случае - вполне безопасно. Однако есть несколько + рекомендаций, которым стоит следовать:</p> + + <ul> + <li><strong>Используйте протокол HTTPS</strong> - если ваш + регистратор умеет делать запрос по HTTPS, а ваш хостинг + позволяет отвечать на такие запросы, то этот вариант + предпочтительнее обычного HTTP, т.к. поток данных будет + зашифрован и сгенерированный серийный номер сможет получить + только регистратор.</li> + + <li><strong>"Спрячьте" генератор</strong> - убедитесь, что + генератор нельзя вызвать случайно. Адрес + www.site.com/keygen.php - плохая идея. А вот + www.site.com/abc123.php - уже лучше. Убедитесь, что на + генератор нет внешних ссылок, что он не показывается при + просмотре содержимого директории сайта и не помещайте его в + служебные файлы типа robots.txt. Чем меньше известно о + расположении генератора - тем лучше. Как вариант - можно + вынести генератор на другой сайт.</li> + + <li><strong>Убедитесь, что вас вызывает регистратор</strong> - + в программе, обрабатывающей запрос от регистратора, необходимо + проверить IP-адрес вызывающей стороны. Обычно регистраторы + публикуют список адресов, с которых они могут вызвать + генератор. Найдите такой у вашего регистратора и добавьте + проверку. В случае несовпадения адреса, лучше не выдавать + понятных ошибок. Не возвращайте ничего или верните ошибку 404. + Не давайте повода понять, почему вызов оказался неудачен.</li> + + <li><strong>Проверяйте входные параметры</strong> - в + настройках продукта у регистратора обычно дается возможность + указать строку запроса, который регистратор будет делать для + получения лицензии. Скажем, вы хотите получать имя + пользователя, адрес его электронной почты, дату продажи и номер + заказа. Убедитесь при получении запроса, что все параметры + переданы и что все они имеют корректный формат. Не отвечайте на + запросы с ошибками. О любых ошибках уведомляйте себя отправкой + e-mail со всеми параметрами, с которыми был вызван генератор. + Это поможет разобраться в причинах проблемы.</li> + + <li><strong>Добавьте "пароль"</strong> - укажите в запросе, + посылаемом регистратором, дополнительный параметр - пароль. С + неочевидным именем и значением. Проверяйте его на принимающей + стороне. В случае несовпадения или отсутствия - не генерируйте + номер.</li> + </ul><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/keygen/keygen_dll.htm b/help/ru/manager/keygen/keygen_dll.htm new file mode 100644 index 0000000..5e8134e --- /dev/null +++ b/help/ru/manager/keygen/keygen_dll.htm @@ -0,0 +1,284 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Генератор ключей: Windows-версия</title> +</head> + +<body> + <h1>Генераторы ключей: Windows-версия</h1> + + <h3>Описание</h3> + + <p>Генератор для Windows представляет собой DLL-файлы для + платформ x86 и x64, заголовочный файл языка C и lib-файл, + совместимый с MSVC. Таким образом, библиотека может быть как слинкована статически, так + и загружаться динамически.</p> + + <p>Все файлы генератора находятся в каталоге + <strong>Keygen\DLL</strong>, там же находится тестовое + приложение, которое генерирует серийные номера.</p> + + <h3>API генератора</h3> + + <p>Генератор экспортирует всего две функции: одна непосредственно + генерирует серийный номер, вторая - освобождает память, + выделенную первой. Начнем с первой и основной функции:</p> + <pre class="code"><strong>VMProtectErrors</strong> __stdcall <strong>VMProtectGenerateSerialNumber</strong>( + <strong>VMProtectProductInfo *</strong> pProductInfo, + <strong>VMProtectSerialNumberInfo *</strong> pSerialInfo, + <strong>char **</strong> pSerialNumber + ); +</pre> + + <p>Первый параметр - указатель на структуру + <strong>VMProtectProductInfo</strong>, содержимое которой + выгружается в VMProtect (см. <a href= + "../licenses.htm#export">Экспорт параметров продукта</a>). + Структура содержит приватный ключ продукта, используемый алгоритм + и количество бит, а также идентификатор продукта. Подробнее о + заполнении этой структуры написано ниже.</p> + + <p>Второй параметр - указатель на структуру + <strong>VMProtectSerialNumberInfo</strong>, содержимое которой + переносится в генерируемый серийный номер. Структура содержит все + поля серийного номера, а также битовую маску, определяющую какие + именно поля должны быть записаны в серийный номер.</p> + <pre class="code">struct <strong>VMProtectSerialNumberInfo</strong> +{ + <strong>INT</strong> flags; + <strong>wchar_t *</strong> pUserName; + <strong>wchar_t *</strong> pEMail; + <strong>DWORD</strong> dwExpDate; + <strong>DWORD</strong> dwMaxBuildDate; + <strong>BYTE</strong> nRunningTimeLimit; + <strong>char *</strong> pHardwareID; + <strong>size_t</strong> nUserDataLength; + <strong>BYTE *</strong> pUserData; +}; +</pre> + + <p>Поле <strong>flags</strong> содержит битовые флаги из набора + <strong>VMProtectSerialNumberFlags</strong>, описанного перед + структурой:</p> + + <ul> + <li><strong>HAS_USER_NAME</strong> - поместить в серийный номер + имя пользователя, находящееся в переменной + <strong>pUserName</strong>.</li> + + <li><strong>HAS_EMAIL</strong> - поместить в серийный номер + e-mail пользователя, находящийся в переменной + <strong>pEMail</strong>.</li> + + <li><strong>HAS_EXP_DATE</strong> - серийный номер перестанет + действовать поле окончания дня, указанного в переменной + <strong>dwExpDate</strong>.</li> + + <li><strong>HAS_MAX_BUILD_DATE</strong> - серийный номер будет + подходить только к версиям продукта, созданным до даты, + указанной в переменной <strong>dwMaxBuildDate</strong>.</li> + + <li><strong>HAS_TIME_LIMIT</strong> - программа перестанет + работать по истечении времени, указанного в переменной + <strong>nRunningTimeLimit</strong> (время указывается в минутах + и не может превышать 255).</li> + + <li><strong>HAS_HARDWARE_ID</strong> - программа будет работать + только на оборудовании с идентификатором, указанным в + переменной <strong>pHardwareID</strong>.</li> + + <li><strong>HAS_USER_DATA</strong> - поместить в серийный номер + пользовательские данные длинной + <strong>nUserDataLength</strong>, расположенные по адресу, + указанному в переменной <strong>pUserData</strong>.</li> + </ul> + + <p>Третий параметр - указатель на указатель. Туда будет записан + адрес сгенерированного серийного номера. После генерации номер + необходимо скопировать, а адрес передать во вторую функцию API + генератора, которая освободит занимаемую серийным номером + память.</p> + <pre class="code"><strong>void</strong> __stdcall <strong>VMProtectFreeSerialNumberMemory</strong>(<strong>char *</strong> pSerialNumber); +</pre> + + <p>Функция <strong>VMProtectGenerateSerialNumber</strong> + возвращает значение типа <strong>VMProtectErrors</strong>, + содержащее 0 в случае успешной генерации номера или код ошибки в + противном случае. Возможны следующие коды ошибок:</p> + + <ul> + <li><strong>ALL_RIGHT</strong> - ошибок нет, номер сгенерирован + успешно.</li> + + <li><strong>UNSUPPORTED_ALGORITHM</strong> - в первом параметре + функции передан некорректный алгоритм шифрования ключа.</li> + + <li><strong>UNSUPPORTED_NUMBER_OF_BITS</strong> - в первом + параметре функции передано некорректное количество бит в + ключе.</li> + + <li><strong>USER_NAME_IS_TOO_LONG</strong> - длина имени + пользователя в кодировке UTF-8 превысила 255 байт.</li> + + <li><strong>EMAIL_IS_TOO_LONG</strong> - длина e-mail + пользователя в кодировке UTF-8 превысила 255 байт.</li> + + <li><strong>USER_DATA_IS_TOO_LONG</strong> - длина + пользовательских данных превышает 255 байт.</li> + + <li><strong>HWID_HAS_BAD_SIZE</strong> - идентификатор + оборудования имеет некорректный размер.</li> + + <li><strong>PRODUCT_CODE_HAS_BAD_SIZE</strong> - идентификатор + продукта, переданный в первом параметре функции, имеет неверный + размер.</li> + + <li><strong>SERIAL_NUMBER_TOO_LONG</strong> - серийный номер + слишком длинный и не помещается в указанное в алгоритме количество + бит.</li> + + <li><strong>BAD_PRODUCT_INFO</strong> - первый параметр функции + некорректен или NULL.</li> + + <li><strong>BAD_SERIAL_NUMBER_INFO</strong> - второй параметр + функции некорректен или NULL.</li> + + <li><strong>BAD_SERIAL_NUMBER_CONTAINER</strong> - третий + параметр функции не указывает на ячейку памяти для записи + адреса серийного номера.</li> + + <li><strong>NOT_EMPTY_SERIAL_NUMBER_CONTAINER</strong> - третий + параметр функции не указывает на пустую ячейку, в ячейке должно + быть значение NULL.</li> + + <li><strong>BAD_PRIVATE_EXPONENT</strong> - значение приватной + экспоненты в первом параметре функции некорректно.</li> + + <li><strong>BAD_MODULUS</strong> - значение модуля в первом + параметре функции некорректно.</li> + </ul> + + <p>Ошибки делятся на две категории: те, что связаны с + некорректными параметрами или с содержимым первого параметра + функции, и все остальные. Ошибки первой категории редки и + являются признаком некорректной настройки структуры. Имеет смысл + выгрузить информацию о продукте повторно и убедиться, что + структура заполняется правильно. Пример правильного заполнения + приведен ниже.</p> + + <p>Ошибки второй категории связаны с попыткой вместить в ключ + больше данных, чем это возможно ввиду его размера. В таком случае + разумно будет отправить регистратору вместо ключа текст "Ключ + будет выслан в течение суток", а всю необходимую информацию + отправить себе по почте. Ключ в таком случае генерируется в + VMProtect в ручном режиме, какие-то данные обрезаются, чтобы + уместить все необходимое в максимальный размер + ключа.</p> + + <h3>Пример использования</h3> + + <p>Ниже приведен пример кода, который вызывает две вышеописанные + функции и генерирует серийный номер. Обратите внимание на блок + кода, расположенный в самом начале. Пример не будет работать пока + вы не замените его на блок, выгруженный для продукта из + VMProtect:</p> + <pre class="code">////////////////////////////////////////////////////////////////////////// +// !!! this block should be generated by VMProtect !!! /// +////////////////////////////////////////////////////////////////////////// + +<strong>VMProtectAlgorithms</strong> g_Algorithm = ALGORITHM_RSA; +<strong>size_t</strong> g_nBits = 0; +<strong>byte</strong> g_vModulus[1]; +<strong>byte</strong> g_vPrivate[1]; +<strong>byte</strong> g_vProductCode[1]; + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +<strong>int</strong> _tmain(<strong>int</strong> argc, <strong>_TCHAR*</strong> argv[]) +{ + <strong>VMProtectProductInfo</strong> pi; + pi.algorithm = g_Algorithm; + pi.nBits = g_nBits; + pi.nModulusSize = sizeof(g_vModulus); + pi.pModulus = g_vModulus; + pi.nPrivateSize = sizeof(g_vPrivate); + pi.pPrivate = g_vPrivate; + pi.nProductCodeSize = sizeof(g_vProductCode); + pi.pProductCode = g_vProductCode; + + <strong>VMProtectSerialNumberInfo</strong> si = {0}; + si.flags = HAS_USER_NAME | HAS_EMAIL; + si.pUserName = L"John Doe"; + si.pEMail = L"john@doe.com"; + <strong>char *</strong> pBuf = NULL; + <strong>VMProtectErrors</strong> res = <strong>VMProtectGenerateSerialNumber</strong>(&pi, &si, &pBuf); + <strong>if</strong> (res == ALL_RIGHT) + { + <strong>printf</strong>("Serial number:\n%s\n", pBuf); + <strong>VMProtectFreeSerialNumberMemory</strong>(pBuf); + } + else + { + <strong>printf</strong>("Error: %d\n", res); + } + + <strong>return</strong> 0; +} +</pre> + + <p>Этот пример с проектом для Microsoft Visual Studio находится в + каталоге <strong>Keygen\DLL\Example</strong>, ниже будут описаны + наиболее интересные места кода.</p> + + <p>Первые строчки функции <strong>main</strong> заполняют + структуру <strong>VMProtectProductInfo</strong> данными, + выгруженными из VMProtect. Этот код стандартен, его не следует + менять во избежание появления ошибок. Далее создается структура + <strong>VMProtectSerialNumberInfo</strong>, в поле флагов + выставляется комбинация из битов имени пользователя и e-mail. + Строчкой ниже в соответствующие поля структуры заносятся значения + имени пользователя и пароля. Обратите внимание, что значения + принимаются в кодировке UNICODE. Генератор ключей внутри + преобразует их в кодировку UTF-8.</p> + + <p>Далее описывается переменная-указатель, куда будет записан + адрес сгенерированного ключа, и вызывается функция + <strong>VMProtectGenerateSerialNumber</strong>, после чего + анализируется код возврата. Если ошибок нет, то сгенерированный + номер печатается на консоль и вызывается функция осовобождения + памяти.</p> + + <h3>Остальные поля структуры VMprotectSerialNumberInfo</h3> + + <p>Некоторые поля структуры требуют дополнительных поясненений. К + примеру, поля <strong>dwExpDate</strong> и + <strong>dwMaxBuildDate</strong> содержат даты в определенном + формате: <strong>0xYYYYMMDD</strong>, т.е. год хранится в старшем + слове, а месяц и день в старшем и младшем байтах младшего слова. + Для формирования такого числа описан макрос <strong>MAKEDATE(y, + m, d)</strong>, который можно вызвать так: <strong>MAKEDATE(2010, + 05, 12)</strong>.</p> + + <p>В поле <strong>pHardwareID</strong> должен быть записан + указатель на строку, которую вернул метод + <strong>VMProtectGetCurrentHWID</strong> из SDK + лицензирования.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/keygen/keygen_net.htm b/help/ru/manager/keygen/keygen_net.htm new file mode 100644 index 0000000..f2d8d36 --- /dev/null +++ b/help/ru/manager/keygen/keygen_net.htm @@ -0,0 +1,115 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Генератор ключей: .Net-версия</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + p.c1 {color:red;} + /*]]>*/ + </style> +</head> + +<body> + <h1>Генераторы ключей: .Net-версия</h1> + + <h3>Описание</h3> + + <p>.Net-версия генератора ключей преставляет собой сборку, + содержащую все необходимое для генерации серийных номеров. + Исходные коды находятся в каталоге <strong>Keygen\Net</strong> в + виде двух проектов: KeyGen (непосредственно генератор серийных + номеров) и Usage (пример использования генератора).</p> + + <p class="c1">Генератор поставляется в исходных кодах, чтобы + иметь возможность пересобрать его под нужную версию .Net + Framework, однако крайне не рекомендуется вносить изменения в его + код. В будущих версиях VMProtect возможно добавление новых + возможностей в генератор, что приведет к необходимости повторной + модификации кода. Также возможно появление трудноуловимых ошибок. + В случае нахождения ошибки в оригинальном коде генератора или + пожеланий по его улучшению - обращайтесь в службу + поддержки.</p> + + <h3>Использование генератора</h3> + + <p>Возьмите за основу код из проекта <strong>Usage</strong>, + добавьте в Ваш проект ссылку на сборку VMProtect.KeyGen.dll, + после чего Вы сможете генерировать серийные номера в вашем + приложении. Для нормальной работы генератор должен понимать, + к какому продукту Вы собираетесь генерировать серийные номера. + Для этого на закладке "Лицензии" VMProtect нажмите кнопку + «Экспорт» и в выпадающем списке выберите «Параметры для + KeyGen.Net». В текстовом поле ниже появятся несколько строк + текста, которые необходимо скопировать и перенести в Ваше + приложение в виде строковой константы.</p> + + <p>Пример вызова генератора представлен ниже:</p> + <pre> +try +{ + string data = @""; // put the exported data here + Generator g = new Generator(data); + g.UserName = "John Doe"; + g.EMail = "john@doe.com"; + g.ExpirationDate = DateTime.Now.AddMonths(1); + g.MaxBuildDate = DateTime.Now.AddYears(1); + g.RunningTimeLimit = 15; + g.HardwareID = "AQIDBAgHBgU="; + g.UserData = new byte[] { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; + string serial = g.Generate(); + Console.WriteLine("Serial number:\n{0}\n", serial); +} +catch (Exception ex) +{ + Console.WriteLine("Error: {0}", ex); +} + +</pre> + + <p>Строку, скопированную в окне экспорта VMProtect, необходимо + поместить в переменную <strong>data</strong>, которая будет + передана параметром в конструктор класса генератора серийных + номеров. В случае каких-либо проблем с разбором данных продукта, + конструктор выбросит исключение с описанием проблемы. Если + конструктор отработал успешно, то генератор готов к созданию + серийных номеров.</p> + + <p>Серийный номер может содержать различную информацию, которая + задается через свойства генератора. Пример выше показывает, как + заполнить абсолютно все поля серийного номера. Отдельные поля + имеют ограничения. Например, поля <strong>User Name</strong> и + <strong>E-Mail</strong> не могут принять строки, которые в + кодировке UTF-8 будут иметь длину, превышающую 255 символов. В + случае подачи некорректных данных, свойства выбрасывают исключения с + описанием проблемы.</p> + + <p>По окончании настройки генератора вызывается метод + <strong>Generate()</strong>, который и создает серийный номер. На + этом этапе происходит компоновка всех данных номера, подсчет + контрольных сумм и, непосредственно, шифрование. В случае, если + объем данных превышает максимально допустимую длину, метод выбросит + исключение.</p> + + <p>В случае, если необходимо сгенерировать несколько серийных + номеров, можно использовать класс генератора несколько раз, не + пересоздавая его. Чтобы "очистить" любое из свойств генератора, + ему нужно присвоить значение <strong>null</strong>.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/keygen/keygen_php.htm b/help/ru/manager/keygen/keygen_php.htm new file mode 100644 index 0000000..7df459a --- /dev/null +++ b/help/ru/manager/keygen/keygen_php.htm @@ -0,0 +1,143 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Генератор ключей: UNIX-версия</title> +</head> + +<body> + <h1>Генераторы ключей: UNIX-версия</h1> + + <h3>Описание</h3> + + <p>UNIX-версия генератора ключей преставляет собой PHP-файл, + содержащий все необходимое для генерации серийных номеров. Файл + находится в каталоге <strong>Keygen\PHP</strong>, ниже + рассмотрены основные моменты его + использования.</p> + + <h3>Настройка генератора</h3> + + <p>В самом начале PHP-файла располагается код настройки + генератора:</p> + <pre class="code">////////////////////////////////////////////////////////////////////////////////////////////// +// The following lines should be generated by VMProtect License Manager +$exported_algorithm = "RSA"; +$exported_bits = 2048; +$exported_private = "PJvj4kEpoQMIpYK+9wEt......xKeiSZgzdiln8Q=="; +$exported_modulus = "rOlny/3QgZb/VmGr3CmY......I6ESAUmtQ+RBqQ=="; +$exported_product_code = "oLQdGUn8kVk="; +////////////////////////////////////////////////////////////////////////////////////////////// +</pre> + + <p>Этот код генерируется автоматически в VMProtect (см. <a href= + "../licenses.htm#export">Экспорт параметров продукта</a>) и + уникален для каждого конкретного продукта. Очень важно + скопировать его без ошибок, в противном случае генератор будет + работать некорректно.</p><strong>Содержимое ключа</strong> + + <p>Далее в генераторе задается содержимое серийного номера. + Содержимое задается массивом, ниже задаются все возможные + параметры ключа, однако в реальных условиях часть из них может + отсутствовать:</p> + <pre class="code">$params = <strong>array</strong>( + user_name => "John Doe", // UTF-8! + email => "john@doe.com", + hwid => "vHGMdMRvGCPjWcCQ", // Exactly as returned by VMProtectGetCurrentHWID + expire_date => <strong>array</strong>(year => 2009, month => 10, day => 1), + maxbuild_date => <strong>array</strong>(year => 2009, month => 10, day => 1), + time_limit => 10, + user_data => <strong>base64_decode</strong>("CGCvRvMWcPHGdMjQ"), // string of bytes + ); +</pre> + + <h3>Функция обработки успешной генерации</h3> + + <p>Ниже расположена простейшая реализация функции, которая + вызывается при успешной генерации серийного номера. Единственным + параметром она получает строку с номером. Функция должна передать + номер вызывающей стороне (регистратору), обычно это делается при + помощи команды <strong>echo</strong>. Предварительно строка + разбивается на подстроки длиной 75 символов для удобства. Также + эта функция может отправлять сгенерированный номер по почте + производителю программы или заносить его в базу данных.</p> + <pre class="code">function <strong>OnSerialGenerated</strong>($serial) +{ + $serial = <strong>wordwrap</strong>($serial, 75, "\n", true); + <strong>echo</strong> $serial; +} +</pre> + + <h3>Функция обработки ошибок генерации</h3> + + <p>Последний участок кода, требующий внимания - это функция, + которая вызывается в случае возникновения проблем. Функция + получает в виде параметра строку с текстом ошибки, а после ее + завершения вызывается функция <strong>die()</strong>. Функция + должна сделать две вещи: вернуть регистратору вместо ключа текст + о том, что ключ будет выслан вручную, а также выслать + производителю программы всю необходимую информацию для устранения + ошибки и ручной генерации ключа.</p> + <pre class="code">function <strong>OnSerialGenerationFailed</strong>($details) +{ + <strong>echo</strong> "You will receive serial number in the next 24 hours"; // message to the customer +// mail("support@vendor.com", "Houston, we have a problem", $details); // message to vendor +} +</pre> + + <p>Причин возникновения ошибки может быть несколько: некорректные + параметры алгоритма, некорректные параметры ключа, слишком + длинное имя пользователя или e-mail. Слишком длинный серийный + номер, который не влезает в количество бит, указанное в + алгоритме. Поэтому функция + <strong>OnSerialGenerationFailed</strong> должна отправить + производителю максимально подробную информацию о случившемся, + дабы тот мог вручную сгенерировать серийный номер и отправить его + покупателю.</p> + + <h3>На что еще следует обратить внимание</h3> + + <p>Генератор ключей в примерах максимально упрощен. Он не + учитывает рекомендации по разработке веб-генераторов, данные + <a href="index.htm">здесь</a>. Он не проверяет IP-адрес + вызывающей стороны и не анализирует входные параметры. Имейте это + в виду, когда будете создавать свой собственный генератор на + основе этого.</p> + + <p>Имя пользователя и e-mail должны быть переданы в кодировке + UTF-8. Уточните у вашего регистратора, в какой кодировке он + передает информацию о покупателе и, при необходимости, проведите + конвертацию. Неправильная кодировка не приведет к + неработоспособности серийного номера, однако номер будет + содержать совершенно другое имя пользователя и он может быть + удивлен, если вы показываете его, скажем, в окне "О + Программе".</p> + + <p>Асимметричное шифрование - достаточно сложный в математическом + плане процесс. Если он реализован на чистом PHP, без применения + сторонних библиотек, то генерация серийного номера может занять + десятки секунд. Генератор использует функции + <strong>gmp_powm</strong>, <strong>bi_powmod</strong>, + <strong>bcpowod</strong> в случае их наличия. Все эти функции + имеют разную скорость. Если генерация ключей на вашем хостинге + занимает слишком большое время, рекомендуется пообщаться со + службой поддержки на предмет подключения описаных выше функций. К + примеру, функция <strong>gmp_powm</strong> работает в десятки раз быстрее + функции <strong>bcpowmod</strong>.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/keygen/serial_format.htm b/help/ru/manager/keygen/serial_format.htm new file mode 100644 index 0000000..d11d34f --- /dev/null +++ b/help/ru/manager/keygen/serial_format.htm @@ -0,0 +1,260 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Формат серийного номера</title> + <style type="text/css"> +/*<![CDATA[*/ + th {text-align:left;} + table {border-collapse:collapse; margin-top: 4px;} + td,th {border: 1px solid #B0B0B0; padding-left:10;padding-right:10;} + /*]]>*/ + </style> +</head> + +<body> + <h1>Формат серийного номера</h1> + + <h3>Структура серийного номера</h3> + + <p>Серийный номер состоит из блоков. Каждый блок + начинается с байта идентификатора, который определяет его + содержимое и, возможно, длину. Последним всегда идет блок с + идентификатором 255, содержащий контрольную сумму всего серийного + номера, за исключением последнего блока.</p> + + <p>В зависимости от типа блока, он может иметь фиксированную или + переменную длину. Во втором случае обычно длина идет в следующем + за идентификатором блока байте. Подробно формат каждого блока + описан ниже.</p> + + <h3>Формат блоков</h3> + + <table border="1" cellspacing="0" cellpadding="2"> + <tr> + <th>ID</th> + + <th>Название</th> + + <th>Размер (байт)</th> + + <th>Описание</th> + + <th>Пример</th> + </tr> + + <tr> + <td>0x01</td> + + <td>Версия</td> + + <td>1</td> + + <td>Блок содержит версию серийного номера размером в 1 байт. + Версия должна быть равна 1.</td> + + <td>01 01</td> + </tr> + + <tr> + <td>0x02</td> + + <td>Имя пользователя</td> + + <td>1 + N</td> + + <td>Блок содержит имя пользователя в кодировке UTF-8. Перед + именем пользователя располагается 1 байт длины имени. Таким + образом, длина имени пользователя не может превышать 255 + байт. Завершающий 0 не требуется.</td> + + <td>02 04 4A 5F 48 4E</td> + </tr> + + <tr> + <td>0x03</td> + + <td>E-Mail</td> + + <td>1 + N</td> + + <td>Блок содержит e-mail пользователя в кодировке UTF-8. + Перед e-mail'ом располагается 1 байт длины. Таким образом, + длина e-mail не может превышать 255 байт. Завершающий 0 не + требуется.</td> + + <td>03 07 61 40 62 2E 63 6F 6D</td> + </tr> + + <tr> + <td>0x04</td> + + <td>Идентификатор оборудования</td> + + <td>1 + N</td> + + <td>Блок содержит идентификатор оборудования, возвращенный + функцией <strong>VMProtectGetCurrentHWID()</strong>. Функция + возвращает строку в кодировке base-64, в серийный номер + помещается раскодированный вариант строки. Длина блока данных + должна быть кратна 4. Перед блоком данных располагается байт + длины. Максимальная длина блока - 32 байта.</td> + + <td>04 08 E1 E2 E3 E4 A1 A2 A3 A4</td> + </tr> + + <tr> + <td>0x05</td> + + <td>Дата окончания лицензии</td> + + <td>4</td> + + <td>Блок содержит дату окончания действия серийного номера. + Формат хранения даты описан ниже.</td> + + <td>05 01 0A 07 DA</td> + </tr> + + <tr> + <td>0x06</td> + + <td>Максимальное время работы</td> + + <td>1</td> + + <td>Блок содержит 1 байт с временем работы программы в + минутах. Максимальное время работы, таким образом, может + составлять 255 минут.</td> + + <td>06 05</td> + </tr> + + <tr> + <td>0x07</td> + + <td>Код продукта</td> + + <td>8</td> + + <td>Блок содержит код продукта - 8 байт, которые создаются + VMProtect и выгружаются при экспорте параметров продукта. + Выгружаются они в кодировке base-64, перед помещением в + серийный номер строку необходимо преобразовать в массив байт. + Размер массива должен быть строго равен 8 байтам. + <strong>Этот блок является обязательным, без него защищенная + программа будет работать некорректно!</strong></td> + + <td>07 01 02 03 04 05 06 07 08</td> + </tr> + + <tr> + <td>0x08</td> + + <td>Данные пользователя</td> + + <td>1 + N</td> + + <td>Блок содержит до 255 байт пользовательских данных. + Система лицензирования не анализирует эти данные и возвращает + их при вызове функции + <strong>VMProtectGetSerialNumberData()</strong>. Перед блоком + данных располагается байт, содержащий размер пользовательских + данных.</td> + + <td>08 05 01 02 03 04 05</td> + </tr> + + <tr> + <td>0x09</td> + + <td>Максимальная дата сборки</td> + + <td>4</td> + + <td>Блок содержит максимальную дату сборки приложения, с + которым будет работать этот серийный номер. Формат хранения + даты описан ниже.</td> + + <td>09 01 0A 07 DA</td> + </tr> + + <tr> + <td>0xFF</td> + + <td>Контрольная сумма</td> + + <td>4</td> + + <td>Блок содержит контрольную сумму серийного номера. Блок + располагается последним и контрольная сумма считается для + всех блоков, идущих перед этим. Подробнее о расчете + контрольной суммы написано ниже.</td> + + <td>FF 01 02 03 04</td> + </tr> + </table> + + <h3>Формат хранения даты</h3> + + <p>Даты в серийном номере хранятся в виде двойного слова - + 0xYYYYMMDD. Старшее слово содержит год, а младшее - день и месяц. + Байты расположены в порядке Little Endian - от младшего к + старшему. В случае, если имеется указатель на первый байт записи, + то дата может быть считана и записана следующим кодом:</p> + <pre class="code"><strong>byte *</strong>pDate = 0xNNNNNN; // адрес даты +<strong>*</strong>(<strong>DWORD *</strong>)pDate = (2010 << 16) | (10 << 8) | 1; // October 1, 2010 +<strong>DWORD</strong> dwExp = *(<strong>DWORD *</strong>)pDate; +</pre> + + <h3>Подсчет контрольной суммы</h3> + + <p>Контрольная сумма серийного номера вычисляется при помощи + алгоритма хеширования SHA-1. Результатом работы алгоритма + являются пять 32-битных слов. Первое слово используется в + качестве контрольной суммы серийного номера. <strong>Обратите + внимание:</strong> слово записывается в формате Little Endian (от + младшего байта к старшему). В строковом представлении хеша SHA-1 + используется формат Big Endian - числа записываются от старшего + байта к младшему, поэтому если SHA-1 генерируется функцией, + которая возвращает строку (как в PHP), то первые четыре байта + хеша необходимо предварительно + развернуть.</p> + + <h3>Дополнительная информация</h3> + + <p>Блоки с номерами, отличными от описанных выше, игнорируются + системой лицензирования. Возможно появление новых блоков в + будущих версиях. <strong>Не рекомендуется создавать свои блоки, + используя свободные идентификаторы!</strong> Во-первых, это может + привести к неработоспособности ключа с новыми версиями системы + лицензирования. А во-вторых, защищаемая программа все равно не + сможет прочитать значения этих блоков. Для хранения какой-либо + информации в ключе нужно использовать поле <strong>User + Data</strong>, которое предназначено именно для этого.</p> + + <p>Серийный номер не содержит "соли" (SALT) - случайной + информации, предназначенной для того, чтобы ключи для одних и тех + же данных получались разными. Эта задача возлагается на алгоритм + шифрования. Если необходимы отличия на уровне серийных номеров, + скажем для серии ключей, проданных в организацию, можно записать + номер ключа строкой в поле имени пользователя (ООО "Компания", + ключ 1 из 10) или занести эту информацию в поле <strong>User + Data</strong> в любом удобном для разработчика формате.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/licenses.htm b/help/ru/manager/licenses.htm new file mode 100644 index 0000000..88517d5 --- /dev/null +++ b/help/ru/manager/licenses.htm @@ -0,0 +1,112 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Управление лицензиями</title> +</head> + +<body> + <h1>Управление лицензиями</h1> + + <h3>Инициализация</h3> + + <p>По умолчанию функции лицензирования выключены. Чтобы включить + их, нужно перейти в секцию "Лицензии" раздела "Проект" и создать пару ключей. В + случае, если проект ссылается на базу данных менеджера лицензий + (в старых версиях VMProtect лицензии управлялись отдельной + программой), то будет предложено импортировать эти лицензии в + проект. По окончании инициализации будут доступны опции привязки + кода к серийному номеру, а также появится возможность создавать и + обрабатывать серийные номера.</p> + + <h3>Интерфейс</h3> + + <p>Секция "Лицензии" отображает полный список лицензий в левой панели и + параметры выбранного элемента справа в основной панели.</p> + + <p><img src="../images/licenses1.png" /></p> + + <p>Правая панель отображает подробную информацию о выбранной + лицензии. Также там можно заблокировать серийный номер, + скопировать его в буфер обмена, посмотреть подробную информацию + об идентификаторе оборудования (кликнув по нему).</p> + + <h3 id="AddLicense">Создание лицензии</h3> + + <p>Для того чтобы добавить новую лицензию, необходимо кликнуть + соответствующую кнопку на панели инструментов. + Появится окно создания лицензии:</p> + + <p><img src="../images/project_add_license.png" /></p> + + <p>В верхней части окна задаются основные параметры лицензии. В + нижней можно выбрать, какие из основных параметров попадут в + серийный номер, а также добавить дополнительные параметры: + например, идентификатор оборудования или пользовательские данные. + По окончании заполнения полей нажмите ОК и VMProtect создаст + новую лицензию.</p> + + <h3>Удаление и блокирование лицензий</h3> + + <p>Для удаления лицензии щелкните по ней в списке лицензий правой кнопкой мыши и выберите "Удалить" в контекстном меню. Либо просто выделите лицензию в списке и нажмите Del. Для того чтобы заблокировать лицензию, переключите параметр "Заблокирована" в основной панели справа в состояние "Да".</p><p>Между удалением лицензии и ее блокированием есть + разница. Удаленные серийные номера не блокируются модулем + лицензирования. Они просто перестают существовать в базе данных. + Если лицензия создана ошибочно и серийный номер никогда никому не + отправлялся, то ее можно удалить. Если же серийный номер + скомпрометирован, то лицензию удалять нельзя, ее необходимо + заблокировать. Тогда в модуль лицензирования будет передана + информация об этом номере и он не будет принимать его.</p> + + <h3>Импорт серийных номеров</h3> + + <p>Серийные номера могут быть созданы не только в VMProtect, но и + в сторонних программах - генераторах номеров. Обычно они + применяются для автоматизированной выдачи серийных номеров + регистраторам при продаже лицензий. Чтобы корректно занести такие + номера в базу данных, существует функция импорта серийных + номеров. Для ее активации необходимо нажать сочетание клавиш + Ctrl+I или выбрать пункт "Импортировать" в меню "Проект".</p> + + <p><img src="../images/menu_project_import.png" /></p> + + <p>Первым шагом при импорте серийного номера является окно ввода + номера:</p> + + <p><img src="../images/import_key.png" /></p> + + <p>В случае, если такая лицензия уже есть в базе данных, будет + открыто окно редактирования лицензии. Если лицензии в базе нет, + то будет открыто окно создания лицензии, где можно внести + необходимые правки, после чего, нажатием кнопки ОК, лицензия + заносится в базу данных.</p><a name="export" id="export"></a> + + <h3>Экспорт параметров лицензирования</h3> + + <p>Для корректной работы генераторов ключей, им необходима + информация о секретном ключе продукта. Эту информацию в наиболее + подходящей форме можно получить, нажав кнопку "Экспорт ключа" над + списком лицензий. При этом появится окно экспорта данных:</p> + + <p><img src="../images/export_keys.png" /></p> + + <p>Поле "Формат экспорта" позволяет выбрать один из + поддерживаемых форматов, а поле "Результат экспорта" содержит + данные в виде, наиболее удобном для соответствующего генератора + ключей. Кнопка "Копировать" позволяет скопировать содержимое поля + "Результат экспорта" в буфер обмена.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/api.htm b/help/ru/manager/usage/api.htm new file mode 100644 index 0000000..df533b4 --- /dev/null +++ b/help/ru/manager/usage/api.htm @@ -0,0 +1,312 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Описание функций API лицензирования</title> + <style type="text/css"> +/*<![CDATA[*/ + th {text-align:left;} + table {border-collapse:collapse; margin-top: 4px;} + td,th {border: 1px solid #B0B0B0; padding-left:10;padding-right:10;} + /*]]>*/ + </style> +</head> + +<body> + <h1>Описание функций API лицензирования</h1> + + <p>API системы лицензирования является продолжением API VMProtect + и входит в его SDK. API позволяет задать серийный номер и + получить информацию о нем: подходит он к программе или нет, истек + ли срок действия, на кого зарегистрирован продукт и т.п. Также API + позволяет получить идентификатор оборудования, на котором + выполняется программа.</p><strong id= + "VMProtectSetSerialNumber">VMProtectSetSerialNumber</strong> + + <p>Функция предназначена для загрузки серийного номера в систему + лицензирования. Полный формат вызова представлен ниже:</p> + <pre class="code">int VMProtectSetSerialNumber(const char *SerialNumber); +</pre> + + <p>Входной параметр <strong>SerialNumber</strong> должен + содержать указатель на текстовую строку с серийным номером в + кодировке base-64 и завершаемую нулем ('\0'). Функция возвращает + битовую маску флагов состояния серийного номера, аналогичную той, + что возвращает <strong>VMProtectGetSerialNumberState()</strong>, + подробнее о флагах будет написано ниже. Серийный номер считается + "хорошим", если функция вернула значение 0.</p><br /> + <strong id= + "VMProtectGetSerialNumberState">VMProtectGetSerialNumberState</strong> + + <p>Функция возвращает флаги состояния серийного номера, + предварительно установленного вызовом + <strong>VMProtectSetSerialNumber()</strong>.</p> + <pre class="code">int VMProtectGetSerialNumberState(); +</pre> + + <p>Наличие хотя бы одного установленного флага говорит о + проблемах с серийным номером: программа не должна работать, если + установлен хотя бы один бит. Подробные значениях флагов описаны в + таблице:</p> + + <table border="1" cellspacing="0" cellpadding="2"> + <tr> + <th>Флаг</th> + + <th>Значение</th> + + <th>Описание</th> + </tr> + + <tr> + <td>SERIAL_STATE_FLAG_CORRUPTED</td> + + <td>0x00000001</td> + + <td>Система лицензирования повреждена. Возможные причины: + некорректная настройка проекта защиты, попытка взлома + программы.</td> + </tr> + + <tr> + <td>SERIAL_STATE_FLAG_INVALID</td> + + <td>0x00000002</td> + + <td>Серийный номер некорректен. Флаг выставляется, если + система лицензирования не может расшифровать серийный + номер.</td> + </tr> + + <tr> + <td>SERIAL_STATE_FLAG_BLACKLISTED</td> + + <td>0x00000004</td> + + <td>Серийный номер подходит к продукту, однако занесен в + черный список в VMProtect.</td> + </tr> + + <tr> + <td>SERIAL_STATE_FLAG_DATE_EXPIRED</td> + + <td>0x00000008</td> + + <td>Срок действия серийного номера истек. Подробную + информацию о сроке действия можно получить вызовом + <strong>VMProtectGetSerialNumberData()</strong></td> + </tr> + + <tr> + <td>SERIAL_STATE_FLAG_RUNNING_TIME_OVER</td> + + <td>0x00000010</td> + + <td>Время работы программы истекло. Подробную информацию о + времени работы программы можно получить вызовом + <strong>VMProtectGetSerialNumberData()</strong></td> + </tr> + + <tr> + <td>SERIAL_STATE_FLAG_BAD_HWID</td> + + <td>0x00000020</td> + + <td>Идентификатор оборудования не совпадает с тем, что + записан в серийном номере.</td> + </tr> + + <tr> + <td>SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED</td> + + <td>0x00000040</td> + + <td>Серийный номер не предназначен для работы с этой версией + защищаемой программы. Максимальную дату сборки программы, к + которой подходит этот серийный номер, можно узнать вызовом + <strong>VMProtectGetSerialNumberData()</strong>.</td> + </tr> + </table><br /><br /> + <strong id= + "VMProtectGetSerialNumberData">VMProtectGetSerialNumberData</strong> + + <p>Функция предназначена для получения информации о содержимом + серийного номера, установленного вызовом + <strong>VMProtectSetSerialNumber()</strong>. Формат вызова + представлен ниже:</p> + <pre class="code">bool VMProtectGetSerialNumberData(VMProtectSerialNumberData *Data, int Size); +</pre> + + <p>Первый параметр - указатель на структуру + <strong>VMProtectSerialNumberData</strong>, в которую будет + записана вся необходимая информация. Второй параметр - размер + структуры, передаваемой в первом параметре - служит для контроля + формата структуры. Функция возвращает FALSE в случаях, если система + лицензирования повреждена (см. флаг состояния + SERIAL_STATE_FLAG_CORRUPTED), если на вход подан нулевой адрес + структуры или если переданный размер структуры некорректен. Во + всех остальных случаях функция возвращает TRUE и записывает всю + информацию о серийном номере по указанном адресу. Ниже + описываются все элементы структуры:</p> + + <table border="1" cellspacing="0" cellpadding="2"> + <tr> + <th>Элемент</th> + + <th>Тип</th> + + <th>Описание</th> + </tr> + + <tr> + <td>nState</td> + + <td>int</td> + + <td>Битовая маска флагов проверки ключа. Аналогична той, что + возвращает + <strong>VMProtectGetSerialNumberState()</strong>.</td> + </tr> + + <tr> + <td>wUserName</td> + + <td>wchar_t[256]</td> + + <td>Имя покупателя в кодировке UNICODE, завершаемое + нулем.</td> + </tr> + + <tr> + <td>wEMail</td> + + <td>wchar_t[256]</td> + + <td>E-Mail покупателя в кодировке UNICODE, завершаемый + нулем.</td> + </tr> + + <tr> + <td>dtExpire</td> + + <td>VMProtectDate</td> + + <td>Дата окончания срока действия ключа. Формат структуры + VMProtectDate описан ниже.</td> + </tr> + + <tr> + <td>dtMaxBuild</td> + + <td>VMProtectDate</td> + + <td>Максимальная дата сборки продукта, с которой будет + работать этот ключ. Формат структуры VMProtectDate описан + ниже.</td> + </tr> + + <tr> + <td>bRunningTime</td> + + <td>int</td> + + <td>Количество минут, которое программа будет работать + (максимальная длина сессии). Измеряется в минутах, + отсчитывается с момента запуска программы.</td> + </tr> + + <tr> + <td>nUserDataLength</td> + + <td>unsigned char</td> + + <td>Длина пользовательских данных, размещенных в поле + <strong>bUserData</strong>.</td> + </tr> + + <tr> + <td>bUserData</td> + + <td>unsigned char[255]</td> + + <td>Пользовательские данные, записанные в ключ. Количество + актуальных байт указано в поле + <strong>nUserDataLength</strong>.</td> + </tr> + </table><br /> + + <p>Структура <strong>VMProtectDate</strong> предназначена для + компактного хранения даты. Ее поля описаны в таблице:</p> + + <table border="1" cellspacing="0" cellpadding="2"> + <tr> + <th>Элемент</th> + + <th>Тип</th> + + <th>Описание</th> + </tr> + + <tr> + <td>wYear</td> + + <td>unsigned short</td> + + <td>Год.</td> + </tr> + + <tr> + <td>bMonth</td> + + <td>unsigned char</td> + + <td>Месяц, нумерация начинается с единицы.</td> + </tr> + + <tr> + <td>bDay</td> + + <td>unsigned char</td> + + <td>День, нумерация начинается с единицы.</td> + </tr> + </table><br /> + <br /> + <strong id= + "VMProtectGetCurrentHWID">VMProtectGetCurrentHWID</strong> + + <p>Функция предназначена для получения идентификатора + оборудования, на котором работает программа. Формат вызова + следующий:</p> + <pre class="code">int VMProtectGetCurrentHWID(char * HWID, int Size); +</pre> + + <p>Первый параметр - указатель на область памяти, куда будет + записан идентификатор. Второй параметр - размер области данных. + Функция возвращает количество записанных байт с учетом + завершающего нуля ('\0'). Если вместо первого параметра подать + NULL, то функция вернет необходимое количество байт для записи + номера. Наиболее правильный способ вызова функции следующий:</p> + <pre class="code"><strong>int</strong> nSize = <strong>VMProtectGetCurrentHWID</strong>(NULL, 0); // получим необходимый размер буфера +<strong>char *</strong>pBuf = <strong>new char</strong>[nSize]; // выделим буфер +<strong>VMProtectGetCurrentHWID</strong>(pBuf, nSize); // получим идентификатор +// используем его +<strong>delete</strong> [] pBuf; // освободим память +</pre><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/index.htm b/help/ru/manager/usage/index.htm new file mode 100644 index 0000000..99189c0 --- /dev/null +++ b/help/ru/manager/usage/index.htm @@ -0,0 +1,127 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Интеграция в приложение</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Интеграция в приложение</h1> + + <p>В нескольких шагах, описанных ниже, мы создадим тестовое + приложение, которое будет обращаться к системе лицензирования: + подавать ей серийные номера и получать статус номера и его + содержимое. На первом этапе система лицензирования будет + использоваться в тестовом режиме, а на втором этапе - в + реальном.</p><strong>Режимы работы системы + лицензирования</strong> + + <p>В создании защиты всегда есть два этапа: разработка и + использование. В случае с лицензированием, вы сначала создаете + приложение, потом интегрируете механизмы защиты, добавляете + проверки и блокируете функции. И только потом, после + всестороннего тестирования, продукт передается пользователям и + начинается второй этап. Тестирование защищаемого приложения - + процесс сложный, необходимо убедиться в работоспособности всех + проверок и условных переходов. Создание "настоящих" серийных + номеров на все случаи жизни на этапе тестирования может оказаться + неудобным, поэтому у системы лицензирования есть т.н. "режим + разработки" или "тестовый" режим, при котором никакой защиты не + осуществляется, а реакция системы на серийные номера описывается + в конфигурационном файле. Когда приложение отлажено и корректно + работает с системой лицензирования, VMProtect заменяет "тестовый" + модуль лицензирования на реальный, проверяющий реальные серийные + номера. Это происходит в момент защиты приложения, поэтому + пропустить этот этап по ошибке не получится.</p><strong id="TestMode">Этап 1: + Тестовый режим работы</strong> + + <p>В тестовом режиме реакция системы лицензирования на серийные + номера, все возвращаемые статусы и данные описываются в + конфигурационном файле. Файл называется VMPLicense.ini и должен + располагаться в рабочем каталоге приложения. В 10 шагах, + представленных ниже, мы пройдем от создания простейшего + приложения до полноценного использования системы лицензирования в + тестовом режиме с привязкой к оборудованию и ограничением срока + бесплатных обновлений.</p> + + <ul> + <li><a href="step11_app.htm">Шаг 1.1: Создаем защищаемое + приложение</a></li> + + <li><a href="step12_code.htm">Шаг 1.2: Добавляем код проверки + лицензии</a></li> + + <li><a href="step13_flags.htm">Шаг 1.3: Получаем флаги состояния + номера</a></li> + + <li><a href="step14_name.htm">Шаг 1.4: Получаем имя и e-mail + пользователя</a></li> + + <li><a href="step15_exp.htm">Шаг 1.5: Проверяем срок действия + номера</a></li> + + <li><a href="step16_time.htm">Шаг 1.6: Ограничиваем время работы + программы</a></li> + + <li><a href="step17_maxbuild.htm">Шаг 1.7: Ограничиваем + бесплатные обновления</a></li> + + <li><a href="step18_blacklist.htm">Шаг 1.8: Номера из "черного + списка"</a></li> + + <li><a href="step19_hwid.htm">Шаг 1.9: Привязка к + оборудованию</a></li> + + <li><a href="step1A_userdata.htm">Шаг 1.10: Пользовательские + данные</a></li> + </ul><strong id="RealMode">Этап 2: Реальный режим работы</strong> + + <p>В реальном режиме работы системы лицензирования VMProtect + помещает в защищаемое приложение специальный модуль + лицензирования. Модуль выполняет все те же функции, что и + тестовый код в SDK, но работает не с ini-файлом, а с содержимым + серийного номера. В следующих пяти шагах мы защитим простое + приложение полноценной защитой на основе VMProtect и системы + лицензирования.</p> + + <ul> + <li><a href="step21_src.htm">Шаг 2.1: Создаем новое защищаемое + приложение</a></li> + + <li><a href="step22_vmp.htm">Шаг 2.2: Создаем проект защиты в + VMProtect</a></li> + + <li><a href="step23_product.htm">Шаг 2.3: Первый запуск + защищенного продукта</a></li> + + <li><a href="step24_test.htm">Шаг 2.4: Тестируем + результат</a></li> + + <li><a href="step25_codelock.htm">Шаг 2.5: Привязываем код к + серийному номеру</a></li> + </ul><strong>Дополнительная информация</strong> + + <p>Значения всех битовых флагов, форматы структур и параметры + вызова функций можно посмотреть в разделе <a href="api.htm">API + системы лицензирования</a>. Этот раздел удобно использовать как + справочник, тогда как шаги, описанные выше, позволяют легко + реализовать готовые типовые схемы защиты.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step11_app.htm b/help/ru/manager/usage/step11_app.htm new file mode 100644 index 0000000..cb5afbd --- /dev/null +++ b/help/ru/manager/usage/step11_app.htm @@ -0,0 +1,62 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.1: Создаем защищаемое приложение</title> +</head> + +<body> + <h1>Шаг 1.1: Создаем защищаемое приложение</h1> + + <p>Первым шагом будет создание приложения. Это будет простое + приложение, без интерфейса пользователя и каких-либо серьезных + возможностей. Нашей задачей будет передать системе лицензирования + серийный номер и получить от нее ответ.</p> + <pre class="code">#include <windows.h> +#include <stdio.h> + +bool is_registered(const char *serial) +{ + return serial && serial[0] == 'X'; +} + +int main(int argc, char **argv) +{ + char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты + if (!is_registered(serial)) + { + printf("please register!\n"); + return 0; + } + printf("We are registered.\n"); + return 0; +} +</pre> + + <p>Программа реализует очень простую схему проверки серийного + номера. Функция <strong>is_registered()</strong> сравнивает + первую букву номера с 'Х' и считает номер корректным в случае + совпадения. Для некорректного номера выдается просьба о + регистрации, а в случае правильного номера выводится сообщение + "We are registered."</p> + + <p><a href="step12_code.htm">Следующим шагом</a> будет добавление + кода проверки серийного номера на основе системы лицензирования + VMProtect.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step12_code.htm b/help/ru/manager/usage/step12_code.htm new file mode 100644 index 0000000..75bad46 --- /dev/null +++ b/help/ru/manager/usage/step12_code.htm @@ -0,0 +1,105 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.2: Добавляем код проверки лицензии</title> +</head> + +<body> + <h1>Шаг 1.2: Добавляем код проверки лицензии</h1><strong>Подключаем + VMProtect SDK</strong> + + <p>Если вы этого еще не сделали, то сейчас самое время подключить + к проекту VMProtect SDK. SDK это три файла: заголовочный файл + (VMProtectSDK.h), файл библиотеки (VMProtectSDK32.lib) и dll-файл + с реализацией (VMProtectSDK32.dll). Для 64-битной платформы есть + отдельные реализации библиотеки и dll-файла.</p> + + <p>Помещаем dll-файл в рабочий каталог нашего приложения, + файл заголовков и библиотечный файл - рядом с исходниками, включаем + файл заголовков в основной файл:</p> + <pre class="code">#include <windows.h> +#include <stdio.h> +#include "VMProtectSDK.h" +</pre> + + <p>Собираем проект и убеждаемся, что он компилируется, запускается + и работает, как и раньше. Система лицензирования пока еще не + активна.</p><strong>Подаем серийный номер в систему + лицензирования</strong> + + <p>Теперь непосредственно после строки с серийным номером добавим + вызов функции SDK системы лицензирования:</p> + <pre class="code">char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты +int res = VMProtectSetSerialNumber(serial); +printf("res = 0x%08X\n", res); +</pre> + + <p>Если после этого программа будет завершаться с ошибкой об + отсутствии dll-файла, убедитесь, что вы положили соответствующий + DLL-файл в рабочий каталог нашего приложения. В случае успешного + запуска, вы должны увидеть сообщение:</p> + <pre class="code">res = 0x00000002 +</pre> + + <p>Число 2 соответствует флагу SERIAL_STATE_FLAG_INVALID, + <a href="api.htm">описанному в API</a>. Т.е. система + лицензирования посчитала наш ключ некорректным, что вполне + логично, т.к. мы до сих пор не "объяснили" системе лицензирования, + какие ключи считать правильными, а какие - нет.</p><strong>Задаем + "правильный" серийный номер</strong> + + <p>В тестовом режиме система лицензирования анализирует файл + VMProtectLicense.ini, и реагирует на вызовы функций согласно + указанным там настройкам. Подробно файл разбирается в следующих + шагах, а здесь мы просто создадим такой файл и поместим туда + следующий текст:</p> + <pre class="code">[TestLicense] +AcceptedSerialNumber=Xserialnumber +</pre> + + <p>Запустим нашу программу еще раз. Если вы снова получили код + ошибки "2", то убедитесь, что ini-файл находится в рабочем + каталоге приложения. В этот раз вы должны получить результат "0". + Признак того, что система лицензирования приняла и одобрила + серийный номер. Теперь мы можем убрать функцию + <strong>is_registered()</strong> - проверкой серийного номера + займется система лицензирования:</p> + <pre class="code">#include <windows.h> +#include <stdio.h> +#include "VMProtectSDK.h" + +int main(int argc, char **argv) +{ + char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты + + int res = VMProtectSetSerialNumber(serial); + printf("res = 0x%08X\n", res); + + if (res) + { + printf("please register!\n"); + return 0; + } + printf("We are registered.\n"); + return 0; +} +</pre><br /> + <a href="step13_flags.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step13_flags.htm b/help/ru/manager/usage/step13_flags.htm new file mode 100644 index 0000000..a392b38 --- /dev/null +++ b/help/ru/manager/usage/step13_flags.htm @@ -0,0 +1,96 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.3: Получаем флаги состояния серийного номера</title> +</head> + +<body> + <h1>Шаг 1.3: Получаем флаги состояния серийного + номера</h1><strong>Удобная функция для печати флагов</strong> + + <p>Первым делом добавим в наш файл одну удобную функцию, которая + будет печатать в человеческом виде значения флагов состояния + серийного номера. Код функции приведен ниже:</p> + <pre class="code">#define PRINT_HELPER(state, flag) if (state & flag) printf("%s ", #flag) +void print_state(INT state) +{ + if (state == 0) + { + printf("state = 0\n"); + return; + } + + printf("state = "); + PRINT_HELPER(state, SERIAL_STATE_FLAG_CORRUPTED); + PRINT_HELPER(state, SERIAL_STATE_FLAG_INVALID); + PRINT_HELPER(state, SERIAL_STATE_FLAG_BLACKLISTED); + PRINT_HELPER(state, SERIAL_STATE_FLAG_DATE_EXPIRED); + PRINT_HELPER(state, SERIAL_STATE_FLAG_RUNNING_TIME_OVER); + PRINT_HELPER(state, SERIAL_STATE_FLAG_BAD_HWID); + PRINT_HELPER(state, SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED); + printf("\n"); +} +</pre> + + <p>Несмотря на свой размер, функция очень простая - она + последовательно проверяет все битовые флаги и печатает те, что + присутствуют в переменной состояния. Заменим + <strong>printf</strong> после проверки номера на вызов + <strong>print_state</strong>, заодно временно поправим серийный + номер, который подается в систему лицензирования:</p> + <pre class="code">char *serial = "Xserialnumber1"; // зададим номер непосредственно в коде для простоты +int res = VMProtectSetSerialNumber(serial); +print_state(res); +</pre> + + <p>Если запустить эту программу, то на консоль выведется + следующее:</p> + <pre class="code">state = SERIAL_STATE_FLAG_INVALID +please register! +</pre> + + <p>Вернем теперь старый серийный номер, убрав "1", и запустим + программу еще раз:</p> + <pre class="code">state = 0 +We are registered. +</pre> + + <p>Теперь, когда мы можем видеть флаги состояние серийного + номера, перейдем к получению флагов и данных из серийного + номера.</p><strong>Получение состояния номера</strong> + + <p>Состояние номера можно получить тремя способами: вызвав + <strong>VMProtectSetSerialNumber()</strong>, вызвав + <strong>VMProtectGetSerialNumberState()</strong> и вызвав + <strong>VMProtectGetSerialNumberData()</strong> - флаги состояния + будут помещены в одно из полей структуры. Каждый из методов + предназначен для использования в разное время. Первая проверка + серийного номера происходит непосредственно при его установке. В + этот момент нужно отсекать некорректные номера, номера с истекшим + сроком действия, номера из черного списка и т.п. Некоторые + ограничения - скажем, максимальное время работы продукта или срок + действия номера, имеет смысл проверять и в процессе работы + программы. Тут оптимально воспользоваться простым и быстрым + методом <strong>VMProtectGetSerialNumberState()</strong>, а в + случае, если нужно получить подробную информацию о данных в + серийном номере, можно использовать более мощную функцию + <strong>VMProtectGetSerialNumberData()</strong>.</p><br /> + <a href="step14_name.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step14_name.htm b/help/ru/manager/usage/step14_name.htm new file mode 100644 index 0000000..c6b6759 --- /dev/null +++ b/help/ru/manager/usage/step14_name.htm @@ -0,0 +1,53 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.4: Получаем имя и e-mail пользователя</title> +</head> + +<body> + <h1>Шаг 1.4: Получаем имя и e-mail пользователя</h1> + + <p>Начнем с простого: получим из серийного номера имя и e-mail + пользователя (часто показываются в окне About). Для этого нам + придется прописать их в ini-файл. Добавим еще две строчки к нашим + двум:</p> + <pre class="code">[TestLicense] +AcceptedSerialNumber=Xserialnumber +UserName=John Doe +EMail=john@doe.com +</pre> + + <p>А в самой программе, в случае успешной регистрации, добавим + получение этих данных и вывод их на экран:</p> + <pre class="code">VMProtectSerialNumberData sd = {0}; +VMProtectGetSerialNumberData(&sd, sizeof(sd)); +printf("name = %ls,\ne-mail = %ls\n", sd.wUserName, sd.wEMail); +</pre> + + <p>Структура содержит данные в UNICODE, поэтому в + <strong>printf()</strong> использованы спецификаторы %ls вместо %s. + Программа должна вывести на экран текст:</p> + <pre class="code">state = 0 +We are registered. +name = John Doe, +e-mail = john@doe.com +</pre><br /> + <a href="step15_exp.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step15_exp.htm b/help/ru/manager/usage/step15_exp.htm new file mode 100644 index 0000000..19169c7 --- /dev/null +++ b/help/ru/manager/usage/step15_exp.htm @@ -0,0 +1,59 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.5: Проверяем срок действия серийного номера</title> +</head> + +<body> + <h1>Шаг 1.5: Проверяем срок действия серийного номера</h1> + + <p>Поместите в ini-файл строчку вида ExpDate=YYYYMMDD - например, + такую:</p> + <pre class="code">ExpDate=20000101 +</pre> + + <p>Важно, чтобы дата, указанная в строке, уже прошла. Т.е. + максимум - вчера. Запустив программу, вы увидите следующее:</p> + <pre class="code">state = SERIAL_STATE_FLAG_DATE_EXPIRED +please register! +</pre> + + <p>Добавим получение дополнительной информации перед выходом с + сообщением "please register":</p> + <pre class="code">if (res) +{ + VMProtectSerialNumberData sd = {0}; + VMProtectGetSerialNumberData(&sd, sizeof(sd)); + printf("exp. date: y = %d, m = %d, d = %d\n", sd.dtExpire.wYear, sd.dtExpire.bMonth, sd.dtExpire.bDay); + printf("please register!\n"); + return 0; +} +</pre> + + <p>Повторный запуск приложения даст нам больше подробностей:</p> + <pre class="code">state = SERIAL_STATE_FLAG_DATE_EXPIRED +exp. date: y = 2000, m = 1, d = 1 +please register! +</pre> + + <p>Удалите из ini-файла строку ExpDate=..., чтобы она не мешала + нам в дальнейшем.</p><br /> + <a href="step16_time.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step16_time.htm b/help/ru/manager/usage/step16_time.htm new file mode 100644 index 0000000..8ccd5d6 --- /dev/null +++ b/help/ru/manager/usage/step16_time.htm @@ -0,0 +1,79 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.6: Ограничиваем время работы программы</title> +</head> + +<body> + <h1>Шаг 1.6: Ограничиваем время работы программы</h1> + + <p>Вы можете ограничить время работы программы с момента запуска. + Это может быть полезно для демонстрационных целей: выдается + полноценный серийный номер, однако программа работает не более + пяти минут. Система лицензирования не закрывает такую программу + принудительно по истечении указанного времени, а лишь уведомляет + об окончании времени выставлением флага состояния. Зададим + ограничение времени работы в одну минуту, добавив в ini-файл + строчку:</p> + <pre class="code">TimeLimit=1 +</pre> + + <p>Модифицируем программу следующим образом:</p> + <pre class="code">int main(int argc, char **argv) +{ + char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты + + int res = VMProtectSetSerialNumber(serial); + print_state(res); + if (res) return 0; + + VMProtectSerialNumberData sd = {0}; + VMProtectGetSerialNumberData(&sd, sizeof(sd)); + printf("I will run for %d minute(s)\n", sd.bRunningTime); + print_state(VMProtectGetSerialNumberState()); + Sleep(60 * 1000 * sd.bRunningTime); + printf("After %d minute(s):\n", sd.bRunningTime); + print_state(VMProtectGetSerialNumberState()); + + return 0; +} +</pre> + + <p>Программа выводит состояние серийного номера в момент старта, + потом считывает максимальное время работы, ждет, пока оно пройдет + и выводит состояние номера еще раз. Для одной минуты мы получим + следующий результат:</p> + <pre class="code">state = 0 +I will run for 1 minute(s) +state = 0 +After 1 minute(s): +state = SERIAL_STATE_FLAG_RUNNING_TIME_OVER +</pre> + + <p>Защищаемая программа должна анализировать состояние серийного + номера с определенной периодичностью и завершить свою работу в + случае появления такого флага. Система лицензирования не делает + этого автоматически, т.к. программе может требоваться освободить + какие-то ресурсы, записать данные в файл и т.д. Также программа + может не завершаться по истечении данного времени, а переходить в + более ограниченный режим работы. Система лицензирования оставляет + эти вопросы на усмотрение разработчика.</p><br /> + <a href="step17_maxbuild.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step17_maxbuild.htm b/help/ru/manager/usage/step17_maxbuild.htm new file mode 100644 index 0000000..d76c271 --- /dev/null +++ b/help/ru/manager/usage/step17_maxbuild.htm @@ -0,0 +1,85 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.7: Ограничиваем бесплатные обновления</title> +</head> + +<body> + <h1>Шаг 1.7: Ограничиваем бесплатные обновления</h1><strong>Схема + работы</strong> + + <p>В момент защиты приложения VMProtect запоминает дату, когда это + происходило. Эта дата является для системы лицензирования датой + сборки приложения. В серийном номере можно прописать максимальную + дату сборки, для которой подойдет этот номер. Таким образом, если + при создании ключа Вы пропишете в него текущую дату + 1 год, то + ключ подойдет ко всем релизам Вашей программы, которые вы + выпустите в течение года. К релизу, выпущенному через год и 1 + день ключ уже не подойдет и у пользователя будет выбор: + пользоваться более старой версией или купить новый ключ, который + будет работать еще год.</p><strong>Пробуем на деле</strong> + + <p>Поместите в ini-файл строчку вида MaxBuildDate=YYYYMMDD - + например, такую:</p> + <pre class="code">MaxBuildDate=20000101 +</pre> + + <p>В тестовом режиме система лицензирования считает датой сборки + сегодняшнее число, поэтому важно, чтобы дата, указанная в строке, + уже прошла. Т.е. максимум - вчера. Модифицируйте исходный код + функции <strong>main()</strong>, чтобы он выглядел так:</p> + <pre class="code">int main(int argc, char **argv) +{ + char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты + + int res = VMProtectSetSerialNumber(serial); + print_state(res); + + if (res) + { + VMProtectSerialNumberData sd = {0}; + VMProtectGetSerialNumberData(&sd, sizeof(sd)); + printf("max. build date: y = %d, m = %d, d = %d\n", sd.dtMaxBuild.wYear, sd.dtMaxBuild.bMonth, sd.dtMaxBuild.bDay); + printf("please register!\n"); + return 0; + } + + printf("I'm registered\n"); + + return 0; +} +</pre> + + <p>Тогда при запуске программы вы увидите следующее:</p> + <pre class="code">state = SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED +max. build date: y = 2000, m = 1, d = 1 +please register! +</pre> + + <p>Заменив в ini-файле дату на сегодняшнюю или завтрашнюю, мы + получим "рабочую" программу:</p> + <pre class="code">state = 0 +I'm registered +</pre> + + <p>Удалите из ini-файла строку MaxBuildDate=..., чтобы она не + мешала нам в дальнейшем.</p><br /> + <a href="step18_blacklist.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step18_blacklist.htm b/help/ru/manager/usage/step18_blacklist.htm new file mode 100644 index 0000000..f0a1eab --- /dev/null +++ b/help/ru/manager/usage/step18_blacklist.htm @@ -0,0 +1,64 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.8: Номера из "черного списка"</title> +</head> + +<body> + <h1>Шаг 1.8: Номера из "черного списка"</h1> + + <p>Номер, помеченный в VMProtect как "заблокированный", больше не + должен приниматься системой лицензирования. При очередной защите + приложения VMProtect запишет в защищаемый файл хеш от номеров + черного списка, вследствие чего система лицензирования в этом приложении откажет при попытке + установить такой номер.</p> + + <p>Сократим до минимума код функции <strong>main()</strong>:</p> + <pre class="code">int main(int argc, char **argv) +{ + char *serial = "Xserialnumber"; // зададим номер непосредственно в коде для простоты + + int res = VMProtectSetSerialNumber(serial); + print_state(res); + + return 0; +} +</pre> + + <p>Запустим программу и убедимся, что система лицензирования + принимает наш серийный номер:</p> + <pre class="code">state = 0 +</pre> + + <p>Теперь занесем наш номер в черный список с точки зрения + системы лицензирования. Для этого в ini-файл добавим строку:</p> + <pre class="code">BlackListedSerialNumber=Xserialnumber +</pre> + + <p>И снова запускаем программу:</p> + <pre class="code">state = SERIAL_STATE_FLAG_BLACKLISTED +</pre> + + <p>Сообщать ли пользователю о занесении его номера в черный список, + или просто сообщить, что номер неверный - оставлено на усмотрение + разработчика. Система лицензирования лишь сообщает программе о + факте использования заблокированного номера.</p><br /> + <a href="step19_hwid.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step19_hwid.htm b/help/ru/manager/usage/step19_hwid.htm new file mode 100644 index 0000000..354206b --- /dev/null +++ b/help/ru/manager/usage/step19_hwid.htm @@ -0,0 +1,123 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.9: Привязка к оборудованию</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + p.c1 {color:red;} + /*]]>*/ + </style> +</head> + +<body> + <h1>Шаг 1.9: Привязка к оборудованию</h1><strong>Получение + идентификатора оборудования</strong> + + <p>Прежде чем привязываться к оборудованию, необходимо получить + идентификатор оборудования. Идентификатор помещается в серийный + номер и при передаче этого номера системе лицензирования + происходит проверка соответствия идентификаторов. Поэтому для + начала получим идентификатор нашего оборудования. Сократим + <strong>main()</strong> до самого короткого варианта:</p> + <pre class="code">int main(int argc, char **argv) +{ + int nSize = VMProtectGetCurrentHWID(NULL, 0); + char *buf = new char[nSize]; + VMProtectGetCurrentHWID(buf, nSize); + printf("HWID: %s\n", buf); + delete [] buf; + return 0; +} +</pre> + + <p>Запустив эту программу, мы получим тестовый идентификатор + оборудования, используемый по умолчанию:</p> + <pre class="code">HWID: myhwid +</pre> + + <p>Чтобы изменить идентификатор, используемый по умолчанию, + добавьте в ini-файл строку:</p> + <pre class="code">MyHWID=test +</pre> + + <p>Запустив программу после этого, мы увидим, что система + лицензирования теперь считает "test" идентификатором + оборудования:</p> + <pre class="code">HWID: test +</pre> + + <p class="c1"><strong>Внимание!</strong> реальный идентификатор + оборудования программа будет выдавать только после ее обработки в + VMProtect.</p><br /> + <strong>Серийный номер с привязкой к оборудованию</strong> + + <p>Чтобы наш тестовый серийный номер был привязан к оборудованию, + добавим в ini-файл еще одну строчку, на этот раз с + идентификатором, "записанным" в номер:</p> + <pre class="code">KeyHWID=test +</pre> + + <p>А функцию <strong>main()</strong> слегка усложним, она снова + будет подавать серийный номер и анализировать получаемый + результат:</p> + <pre> +int main(int argc, char **argv) +{ + int nSize = VMProtectGetCurrentHWID(NULL, 0); + char *buf = new char[nSize]; + VMProtectGetCurrentHWID(buf, nSize); + printf("HWID: %s\n", buf); + delete [] buf; + + char *serial = "Xserialnumber"; + int res = VMProtectSetSerialNumber(serial); + print_state(res); + return 0; +} +</pre> + + <p>Запустив код, получим следующий результат:</p> + <pre class="code">HWID: test +state = 0 +</pre> + + <p>Система лицензирования сравнила текущий идентификатор + оборудования и тот, который был запиан в серийном номере. + Идентификаторы совпали и функция + <strong>VMProtectSetSerialNumber()</strong> вернула 0 - серийный + номер подходит.</p> + + <p>Попробуем теперь "запустить" нашу программу на другом + оборудовании. Для этого поменяем значение "test" параметра MyHWID + в ini-файле на "new test". И снова запустим программу:</p> + <pre class="code">HWID: new test +state = SERIAL_STATE_FLAG_BAD_HWID +</pre> + + <p>На этот раз система лицензирования вернула флаг + SERIAL_STATE_FLAG_BAD_HWID, означающий несовпадение реально + идентификатора оборудования с тем, что хранится в серийном + номере. Текущий идентификатор оборудования, выведенный на экран - + "new test", а в серийном номере хранится "test". Поменяв в + ini-файле значение параметра KeyHWID на "new test" можно добиться + работы серийного номера и на этом "оборудовании".</p><br /> + <a href="step1A_userdata.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step1A_userdata.htm b/help/ru/manager/usage/step1A_userdata.htm new file mode 100644 index 0000000..15fc5de --- /dev/null +++ b/help/ru/manager/usage/step1A_userdata.htm @@ -0,0 +1,76 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 1.10: Пользовательские данные</title> +</head> + +<body> + <h1>Шаг 1.10: Пользовательские данные</h1> + + <p>Серийный номер может содержать до 255 байт произвольных + данных, которые система лицензирования без изменений передает + вызывающей программе. Это может быть какая-то дополнительная + информация о продаже, данные, без которых не будет работать + полная версия, или еще что-нибудь. Изменим функцию + <strong>main()</strong>, чтобы она считывала данные из серийного + номера и показывала их на экране:</p> + <pre class="code">int main(int argc, char **argv) +{ + char *serial = "Xserialnumber"; + int res = VMProtectSetSerialNumber(serial); + print_state(res); + if (res) return 0; + + VMProtectSerialNumberData sd = {0}; + VMProtectGetSerialNumberData(&sd, sizeof(sd)); + printf("Serial number has %d byte(s) of data\n", sd.nUserDataLength); + for (int i = 0; i < sd.nUserDataLength; i++) + printf("%02X ", sd.bUserData[i]); + printf("\n"); + return 0; +} +</pre> + + <p>Ini-файл при этом сократим до такого вида:</p> + <pre class="code">[TestLicense] +AcceptedSerialNumber=Xserialnumber +</pre> + + <p>Теперь запустим программу и убедимся, что наш серийный номер + подходит, но не содержит никаких данных:</p> + <pre class="code">state = 0 +Serial number has 0 byte(s) of data +</pre> + + <p>Чтобы добавить пользовательские данные в серийный номер, + необходимо создать в ini-файле переменную UserData и присвоить ей + строчку из HEX-символов. Символы должны идти парами, т.е. длина + строки должна быть кратна 2. Строка может быть, например, + такой:</p> + <pre class="code">UserData=010203A0B0C0D0E0 +</pre> + + <p>В этом случае при запуске программы мы получим следующий + результат:</p> + <pre class="code">state = 0 +Serial number has 8 byte(s) of data +01 02 03 A0 B0 C0 D0 E0 +</pre><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step21_src.htm b/help/ru/manager/usage/step21_src.htm new file mode 100644 index 0000000..65a2ec7 --- /dev/null +++ b/help/ru/manager/usage/step21_src.htm @@ -0,0 +1,109 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 2.1: Создаем новое защищенное приложение</title> +</head> + +<body> + <h1>Шаг 2.1: Создаем новое защищенное приложение</h1> + + <p>Если на первом этапе мы создавали несколько разных тестовых + приложений для изучения API системы лицензирования, то на втором этапе + приложение будет одно. Оно также будет консольным и в нем будет + функция <strong>foo()</strong>, которая может работать только в + зарегистрированной версии. Вот код нашего тестового + приложения:</p> + <pre class="code">#include <windows.h> +#include <stdio.h> +#include "VMProtectSDK.h" + +#define PRINT_HELPER(state, flag) if (state & flag) printf("%s ", #flag) +void print_state(INT state) +{ + if (state == 0) + { + printf("state = 0\n"); + return; + } + + printf("state = "); + PRINT_HELPER(state, SERIAL_STATE_FLAG_CORRUPTED); + PRINT_HELPER(state, SERIAL_STATE_FLAG_INVALID); + PRINT_HELPER(state, SERIAL_STATE_FLAG_BLACKLISTED); + PRINT_HELPER(state, SERIAL_STATE_FLAG_DATE_EXPIRED); + PRINT_HELPER(state, SERIAL_STATE_FLAG_RUNNING_TIME_OVER); + PRINT_HELPER(state, SERIAL_STATE_FLAG_BAD_HWID); + PRINT_HELPER(state, SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED); + printf("\n"); +} + +char *read_serial(const char *fname) +{ + FILE *f; + if (0 != fopen_s(&f, fname, "rb")) return NULL; + fseek(f, 0, SEEK_END); + int s = ftell(f); + fseek(f, 0, SEEK_SET); + char *buf = new char[s + 1]; + fread(buf, s, 1, f); + buf[s] = 0; + fclose(f); + return buf; +} + +// метод foo() очень короткий, но он нам нужен в виде отдельной функции +// поэтому мы попросим компилятор не делать его inline +__declspec(noinline) void foo() +{ + printf("I'm foo!\n"); +} + +int main(int argc, char **argv) +{ + char *serial = read_serial("serial.txt"); + int res = VMProtectSetSerialNumber(serial); + delete [] serial; + if (res) + { + printf("serial number is bad\n"); + print_state(res); + return 0; + } + printf("serial number is correct, calling foo()\n"); + foo(); + printf("done\n"); + return 0; +} +</pre> + + <p>Скомпилируем программу без отладочной информации, но в + настройках линкера попросим создать MAP-файл, который потребуется + для работы VMProtect. При запуске программы мы должны увидеть + следующий текст:</p> + <pre class="code">serial number is bad +state = SERIAL_STATE_FLAG_INVALID +</pre> + + <p>В настоящий момент система лицензирования все еще работает в + тестовом режиме, т.к. файл еще не был обработан VMProtect'ом и в + него не был внедрен модуль лицензирования. На <a href= + "step22_vmp.htm">следующем шаге</a> мы создадим проект VMProtect + и попробуем защитить нашу программу.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step22_vmp.htm b/help/ru/manager/usage/step22_vmp.htm new file mode 100644 index 0000000..bf0ac9b --- /dev/null +++ b/help/ru/manager/usage/step22_vmp.htm @@ -0,0 +1,42 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 2.2: Создаем проект защиты в VMProtect</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Шаг 2.2: Создаем проект защиты в VMProtect</h1> + + <p>Теперь, когда тестовая программа готова, скомпилирована и + рядом с ней находится ее MAP-файл, мы можем запустить VMProtect + Ultimate и открыть исполняемый файл. Нам нужно будет добавить в + проект две функции: _main (так Visual Studio переименовала нашу + функцию main()) и foo(). Обе функции видны в списке функций в + VMProtect в разделе "Функции".</p> + + <!-- <p class="c1"><br /><img src="../../images/real_project_functions.png" alt="Дерево проекта" /></p> --> + + <p>Далее необходимо инициализировать систему лицензирования. + Перейдите на вкладку "Лицензии" и создайте пару кючей длиной 2048 + бит.</p><br /> + <a href="step23_product.htm">Следующий шаг</a> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step23_product.htm b/help/ru/manager/usage/step23_product.htm new file mode 100644 index 0000000..bf5784b --- /dev/null +++ b/help/ru/manager/usage/step23_product.htm @@ -0,0 +1,70 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 2.3: Первый запуск защищенного продукта</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Шаг 2.3: Первый запуск защищенного продукта</h1> + + <p>Система лицензирования инициализирована, так что мы можем + попробовать скомпилировать проект VMPrtoect и запустить + защищенный файл. Запустив его из командной строки мы получим + следующее сообщение:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is bad +state = SERIAL_STATE_FLAG_INVALID +</pre> + + <p>Запустив программу depends.exe, мы можем убедиться, что наш + защищенный файл более не связан с библиотекой VMProtectSDK.dll, а + значит модуль лицензирования встроен в приложение. Список + используемых DLL можно посмотреть и в VMProtect, открыв + защищенный файл и выбрав из раздела "Свойства" секцию "Импорты".</p> + + <p><img src="../../images/depends.png" /></p> + + <p>Наша защищаемая программа читает серийный номер из файла + serial.txt. Поскольку этого файла сейчас нет, то модулю лицензирования + подается пустой номер, который также не считается корректным. + Перейдем на закладку "лицензии" и сгенерируем серийный номер. + Подробно эта процедура описана <a href= + "../licenses.htm">здесь</a>, мы создадим самый простой серийный + номер без каких-либо ограничений.</p> + + <p><img src="../../images/project_add_license.png" /></p> + + <p>Затем скопируем серийный номер (в свойствах лицензии выделим поле + "Серийный номер" и нажмем Ctrl+C), создадим рядом с + защищенным приложением файл serial.txt и вставим туда серийный + номер. После запуска программы мы увидим следующее:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is correct, calling foo() +I'm foo +done +</pre> + + <p>Система лицензирования проверила серийный номер и посчитала + его корректным. На <a href="step24_test.htm">следующем шаге</a> мы + попробуем применить некоторые ограничения и посмотрим что из + этого выйдет.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step24_test.htm b/help/ru/manager/usage/step24_test.htm new file mode 100644 index 0000000..31f5ed8 --- /dev/null +++ b/help/ru/manager/usage/step24_test.htm @@ -0,0 +1,90 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 2.4: Тестируем результат</title> +</head> + +<body> + <h1>Шаг 2.4: Тестируем результат</h1><strong>Срок действия + серийного номера</strong> + + <p>Создадим еще один серийный номер с ограничением срока + действия - скажем, 2005-м годом. Эта дата уже прошла и наш номер + должен быть недействительным. Перейдите на закладку "Лицензии" и + нажмите кнопку "Добавить лицензию". В появившемся окне поставьте + галочку "Срок годности" и введите "30 сентября 2005 года". + Создайте номер, скопируйте его и поместите в файл seral.txt, + после чего запустите программу:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is bad +state = SERIAL_STATE_FLAG_DATE_EXPIRED +</pre> + + <p>Модуль лицензирования вернул флаг "срок действия номера + закончен". Вернем рабочий номер обратно в файл serial.txt и + убедимся, что его модуль лицензирования примет без проблем.</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is correct, calling foo() +I'm foo +done +</pre><strong>Занесение номера в черный список</strong> + + <p>Предположим, что наш "хороший" серийный номер выложен в + Интернет. Нам необходимо его заблокировать, чтобы в следующих + версиях программы он уже не работал. Для этого мы выбираем его в + списке номеров и нажимаем кнопку "Заблокировать". Сам факт + нажатия кнопки не блокирует серийный номер в защищенном + приложении, однако после повторной защиты файла, он откажется + принимать этот серийный номер. Проверим. Если сейчас запустить + нашу программу, то она примет заблокированный номер без проблем, + т.к. это старая версия программы и она еще не знает о + блокировке:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is correct, calling foo() +I'm foo +done +</pre> + + <p>Сделаем копию нашей программы и назовем ее + "dummy_app1.vmp.exe", а после этого перейдем в VMProtect и + повторно защитим наше приложение, после чего запустим новую + версию программы:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is bad +state = SERIAL_STATE_FLAG_BLACKLISTED +</pre> + + <p>Теперь для сравнения еще раз запустим старую версию + программы:</p> + <pre class="code">C:\test>dummy_app1.vmp.exe +serial number is correct, calling foo() +I'm foo +done +</pre> + + <p>Старая версия ничего не знает о блокировании номера и + продолжает работать как и раньше. </p><br /> + <br /><p>На <a href= + "step25_codelock.htm">последнем шаге</a> мы попробуем привязать + выполняемый код к серийному номеру. Перед этим разблокируйте + серийный номер и перезащитите приложение в VMProtect, чтобы оно + снова принимало наш серийный номер. Или создайте новую + лицензию.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/manager/usage/step25_codelock.htm b/help/ru/manager/usage/step25_codelock.htm new file mode 100644 index 0000000..8cbe5c4 --- /dev/null +++ b/help/ru/manager/usage/step25_codelock.htm @@ -0,0 +1,144 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href= + "../../default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Шаг 2.5. Привязка кода к серийному номеру</title> + <style type="text/css"> +/*<![CDATA[*/ + p.c2 {color:red;} + span.c1 {background-color:yellow;} + /*]]>*/ + </style> +</head> + +<body> + <h1>Шаг 2.5. Привязка кода к серийному номеру</h1> + + <p>Одним из наиболее популярных способов взлома программ является + поиск проверки серийного номера и последующего условного + перехода. Если номер корректен, то ход выполнения программы идет + по одной ветке, если некорректен, то по другой. Хакер находит + этот переход и заменяет его на безусловный переход на + "правильную" ветку. Давайте "взломаем" таким образом нашу + тестовую программу. На уровне исходников, конечно же. "Отключим" + условный переход:</p> + <pre class="code">char *serial = read_serial("serial.txt"); +int res = VMProtectSetSerialNumber(serial); +delete [] serial; +if (<span class="c1">false &&</span> res) +{ +</pre> + + <p>Теперь наша программа примет любой серийный номер и будет + работать как ни в чем не бывало. Безусловно, если файл защищен + VMProtect, то даже опытному хакеру потребуется не один месяц, + чтобы найти и исправить этот переход так, как сделали это мы. А с + учетом того, что правильно защищенная программа проверяет + серийный номер не в одном месте и не всегда, то даже такая + простая проверка уже достаточно надежна. Однако мы пойдем + дальше.</p><strong>Привяжем код к серийному номеру</strong> + + <p class="c2"><strong>Внимание!</strong> демо-версия VMProtect + имеет ограничение на количество обрабатываемых функций: + обрабатывается только одна функция. Поэтому в случае + использования демо-версии, необходимо включать в проект только + функцию foo(), т.к. в противном случае демо-версия VMProtect + может выбрать для защиты функцию main() и привязка кода к + серийному номеру не сработает.</p> + + <p>Система лицензирования VMProtect позволяет привязать код одной + или нескольких функций к серийному номеру так, что они не будут + работать без корректного номера. Тело функции виртуализируется, + потом шифруется и может быть расшифровано только при наличии + корректного серийного номера. То есть даже если хакер найдет и + исправит условный переход в коде проверки номера, функции, + привязанные к номеру, все равно не будут работать. Давайте + попробуем. В VMProtect в разделе "Функции" выберем функцию <strong>foo()</strong> и в + правой панели изменим значение опции "Привязать к серийному номеру" на "Да".</p> + + <p><img src="../../images/lock_to_serial.png" /></p> + + <p>После этого защитим наше приложение. С учетом + того, что оно "взломано", поместим в файл serial.txt произвольный + текст и запустим приложение. В консоли появится текст:</p> + <pre class="code">C:\test>dummy_app.vmp.exe +serial number is correct, calling foo() +</pre> + + <p>То есть хакер "исправил" нужный условный переход и программа + пошла по "правильной" ветке. Однако в момент вызова + <strong>foo()</strong> программа выводит сообщение:</p> + + <p><img src="../../images/codelock_error.png" /></p> + + <p>Так как мы привязали функцию <strong>foo()</strong> к + серийному номеру, а у хакера его нет, то при попытке расшифровать + код функции модуль лицензирования выдал сообщение о невозможности + продолжить выполнение программы. После нажатия кнопки "ОК" + программа завершится и в консоли мы не увидим строчки + "done".</p><strong>Что привязывать к серийному номеру?</strong> + + <p>Привязывать к серийному номеру имеет смысл те функции, которые + вызываются только в зарегистрированной версии программы. Так как + привязка возможна только при использовании виртуализации, то + необходимо принимать во внимание возможное падение + производительности. Скажем, если текстовый редактор не позволяет + сохранять результаты своей работы в демо-версии, то к серийному + номеру можно привязать функцию сохранения документа. Если эта + функция вызывает ряд других в процессе работы, то их привязывать + уже не обязательно, так как без основной функции от них будет + немного толку.</p> + + <p>Также необходимо помнить, что вызов привязанной функции без + серийного номера приведет к завершению работы программы без + возможности сохранения результатов работы, поэтому тщательно + тестируйте защищаемую программу, чтобы она не позволяла вызвать + такие функции в демо-режиме. В примере с текстовым редактором + убедитесь, что в демо-режиме пункт меню "Сохранить" всегда + неактивен, что комбинация Ctrl+S не срабатывает и что при + закрытии программы также не предлагается сохранить изменения. В + противном случае пользователь может составить негативное мнение о + вашей программе.</p><strong>Привязка к серийному номеру и + нерабочие номера</strong> + + <p>При вызове функции <strong>VMProtectSetSerialNumber()</strong> + модуль лицензирования проверяет переданный серийный номер и + зашифрованные участки кода будут выполняться только в том случае, + если на момент проверки серийный номер был полностью корректным - + не занесенным в черный список, с правильным идентификатором + оборудования, с неистекшим сроком годности и т.п. В этом случае все + зашифрованные процедуры будут выполняться до завершения работы + приложения или до нового вызова + <strong>VMProtectSetSerialNumber()</strong>.</p> + + <p>Некоторые ограничения могут "сработать" в процессе выполнения + программы: например, может истечь время работы программы или + окончится срок действия серийного номера. В этом случае модуль + лицензирования продолжит расшифровывать и выполнять функции, + привязанные к серийному номеру. Это делается потому, что + защищенному приложению будет сложно отследить момент срабатывания + ограничений и соответствующим образом изменить модель своего + поведения (заблокировать пункты меню и т.п). Если модуль + лицензирования неожиданно для приложения перестанет выполнять + привязанные к серийному номеру участки кода, это с большой + вероятностью приведет к неработоспособности приложения. Поэтому + все решается в момент установки серийного номера и именно в этот + момент определяется режим, в котором будет работать + приложение.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/menu_edit.htm b/help/ru/menu_edit.htm new file mode 100644 index 0000000..db8c5c6 --- /dev/null +++ b/help/ru/menu_edit.htm @@ -0,0 +1,61 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Меню "Правка"</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + /*]]>*/ + </style> +</head> + +<body> + <h1>Меню "Правка"</h1> + <br /><img src= + "images/menu_edit.png" alt="Image" /> + + <ul> + <li><strong>Отменить</strong> - отменить последние + исправления;</li> + + <li><strong>Повторить</strong> - восстановить последние + отмененные исправления;</li> + + <li><strong>Вырезать</strong> - переместить выделенные данные в + буфер обмена;</li> + + <li><strong>Копировать</strong> - скопировать выделенные данные + в буфер обмена;</li> + + <li><strong>Вставить</strong> - вставить из буфера обмена;</li> + + <li><strong>Удалить</strong> - удалить выделенный элемент;</li> + + <li><strong>Поиск</strong> - поиск фрагмента текста + <p><img src="images/expert_find.png" alt="Поиск" /></p> + </li> + + <li><a name="Goto" id="Goto"><strong>Перейти на + адрес</strong></a> - перейти на заданный адрес защищаемого + приложения. Возможен переход на введенный адрес либо на адрес + объекта, выбранного в списке "Функции". Возможен также поиск объекта по названию; + <p><br /><img src="images/properties_dump_goto.png" alt="Image" /></p> + </li> + </ul> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html>
\ No newline at end of file diff --git a/help/ru/menu_file.htm b/help/ru/menu_file.htm new file mode 100644 index 0000000..761919c --- /dev/null +++ b/help/ru/menu_file.htm @@ -0,0 +1,58 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Меню "Файл"</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + /*]]>*/ + </style> +</head> + +<body> + <h1>Меню "Файл"</h1> + <p><img src="images/menu_file.png" /></p> + + <ul> + <li><a name="Open" id="Open"><strong>Открыть</strong></a> - + выбрать исполняемый файл приложения, которое необходимо + защитить, или файл проекта (*.vmp). Можно выбрать файл для открытия из списка ранее защищенных приложений, который отображается в меню Файл. Доступ к функции открытия файлов также + возможен с помощью кнопки <img src="images/button_open.png" /> + на панели инструментов. Нужный исполняемый файл + также можно перетащить в окно VMProtect;</li> + + <li><strong>Сохранить проект</strong> - сохранить установки + защиты приложения в файл формата "*.vmp". Файл настроек проекта + будет сохранен в ту же папку, где находится исполняемый модуль + защищаемого приложения. Функция сохранения проекта доступна по + кнопке <img src="images/button_save.png" /> на + панели инструментов;</li> + + <li><a name="SaveProjectAs" id= + "SaveProjectAs"><strong>Сохранить проект как</strong></a> - + сохранить файл проекта в файл с новым именем;</li> + + <li><strong>Закрыть</strong> - завершить работу с текущим + проектом;</li> + + <li><strong>Выход</strong> - завершить работу с + программой.</li> + </ul> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html>
\ No newline at end of file diff --git a/help/ru/menu_help.htm b/help/ru/menu_help.htm new file mode 100644 index 0000000..f8398ef --- /dev/null +++ b/help/ru/menu_help.htm @@ -0,0 +1,38 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Меню "Справка"</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + /*]]>*/ + </style> +</head> + +<body> + <h1>Меню "Справка"</h1> + <p><img src="images/menu_help.png" /></p> + + <ul> + <li><strong>Домашняя страница</strong> - перейти на домашнюю страницу VMProtect;</li> + <li><strong>Содержание</strong> - открыть справку VMProtect;</li> + <li><strong>О программе</strong> - просмотреть основные сведения о программе VMProtect.</li> + </ul> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/menu_project.htm b/help/ru/menu_project.htm new file mode 100644 index 0000000..c0e8582 --- /dev/null +++ b/help/ru/menu_project.htm @@ -0,0 +1,66 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Меню "Проект"</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + /*]]>*/ + </style> +</head> + +<body> + <h1>Меню "Проект"</h1> + <p><img src="images/menu_project.png" /></p> + + <ul> + <li><strong>Добавить функцию</strong> - добавить в список защищаемых объектов новую функцию. Можно задать как точный адрес функции, так и найти нужную функцию поиском по ее имени: + <p><img src="images/project_add_function.png"/></p></li> + <li><strong>Добавить папку</strong> - добавить папку в проект: + <p><img src="images/project_add_folder.png" /></p> + + <p>Использование папок не влияет на защиту находящихся в них + объектов, а служит для систематизации отображения защищаемых + объектов в дереве проекта. Перемещать объекты в папку можно + простым перетаскиванием (drag-n-drop);</p></li> + + <li><strong>Добавить лицензию</strong> - добавить лицензию в проект: + <p><img src="images/project_add_license.png" /></p> + + <p>Добавляет новую лицензию пользователя и генерирует лицензионный ключ на основе пользовательских данных: имя покупателя, e-mail, дата, номер заказа и других. Внутрь ключа может быть записана как указанная информация, так и дополнительные ограничения функциональности лицензии: например, число запусков или конечная дата действия ключа.<br /> + Для добавления лицензии необходимо сначала сгенерировать пару ключей:</p> + <p><img src="images/project_generate_keys.png" /></p></li> + + <li><strong>Экспортировать ключ</strong> - экспортирует ключи проекта в выбранный формат <a href="manager/keygen/index.htm">генератора ключей</a>: + <p><img src="images/export_keys.png" /></p></li> + + <li><strong>Импортировать</strong> - добавляет к проекту лицензии, импортированные из серийного номера, либо из другого проекта.</li> + + <li><strong>Компилировать</strong> - компилировать защищаемое + приложение с текущими параметрами защиты. Для компиляции + проекта также можно нажать кнопку <img src="images/button_compilation.png" /> на панели + инструментов.</li> + + <li><strong>Выполнить</strong> - запустить защищаемое + приложение. Исходный/защищенный исполняемый файл приложения + также можно запустить нажатием кнопки <img src="images/button_execute.png" /> на панели + инструментов. Нажатие на стрелочку позволяет задать параметры командной строки.</li> + </ul> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html>
\ No newline at end of file diff --git a/help/ru/menu_tools.htm b/help/ru/menu_tools.htm new file mode 100644 index 0000000..a4473bb --- /dev/null +++ b/help/ru/menu_tools.htm @@ -0,0 +1,41 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Меню "Инструменты"</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + /*]]>*/ + </style> +</head> + +<body> + + <h1>Меню "Инструменты"</h1> + + <p><img src="images/menu_tools.png" /></p> + + <ul> + <li><strong>Водяные знаки</strong> - служит для вызова диалогового окна управления <a href="watermarks.htm">водяными знаками</a>: + <p><img src="images/watermarks_setup.png" /></p></li> + <li><strong>Настройки</strong> - вызывает диалог настроек программы: + <p><img src="images/preferences.png" /></p></li> + </ul> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/mode_console.htm b/help/ru/mode_console.htm new file mode 100644 index 0000000..b2cd6fe --- /dev/null +++ b/help/ru/mode_console.htm @@ -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>Консольная версия</title> +</head> + +<body> + <h1>Консольная версия</h1> + + <p>После создания проекта в <a href="main_window.htm">GUI + режиме</a> в дальнейшем может использоваться консольная версия + (VMProtect_Con.exe), вызов которой осуществляется следующим + образом:</p> + + <p><strong>VMProtect_Con Файл [Выходной файл] [-pf Файл проекта] + [-sf Файл скрипта] [-lf Файл с параметрами лицензирования] [-bd Дата сборки (yyyy-mm-dd)] [-wm Название водяного знака] + [-we]</strong></p> + + <ul> + <li><strong>Файл</strong> - имя исполняемого файла, который + необходимо защитить (*.exe, *.dll и т.д.), или имя файла + проекта (*.vmp). Если в качестве исходного файла указан файл + проекта, то имя исполняемого файла будет браться из файла + проекта.</li> + + <li><strong>Выходной файл</strong> - имя и путь к защищенному + файлу, который должен быть создан после обработки исходного + файла. Если параметр не задан, его значение берется из файла + проекта.</li> + + <li><strong>Файл проекта</strong> - имя и путь к файлу проекта, + созданного в <a href="main_window.htm">GUI режиме</a>. Если + параметр не задан, поиск файла проекта *.vmp будет + осуществляться в папке с исполняемым файлом.</li> + + <li><strong>Файл скрипта</strong> - имя файла, содержащего + <a href="script.htm">скрипт</a>, с помощью которого будет + обработан защищаемый файл. Если параметр не задан, будет использоваться скрипт из текущего файла проекта.</li> + + <li><strong>Файл с параметрами лицензирования</strong> - имя файла, содержащего <a href="manager/licenses.htm">параметры лицензирования</a>. + Если параметр не задан, будут использовать параметры лицензирования из текущего файла проекта.</li> + + <li><strong>Дата сборки</strong> - дата сборки приложения в формате "yyyy-mm-dd". Если параметр не задан, будет использоваться текущая дата. + Дата сборки записывается в защищаемое приложение и используется системой лицензирования при проверке серийных номеров, содержащих поле "<a href="manager/licenses.htm#AddLicense">Максимальная дата сборки</a>".</li> + + <li><strong>Название водяного знака</strong> - название + <a href="watermarks.htm">водяного знака</a>, который будет + вставлен в защищаемый файл. Если название водяного файла не + указано, в защищенный файл будет вставлен водяной знак, который + был указан при создании проекта.</li> + + <li><strong>we</strong> - при использовании данного параметра + все предупреждения будут отображаться как ошибки.</li> + </ul><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/project.htm b/help/ru/project.htm new file mode 100644 index 0000000..1ca6f53 --- /dev/null +++ b/help/ru/project.htm @@ -0,0 +1,34 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Раздел "Проект"</title> +</head> + +<body> + <h1>Раздел "Проект"</h1> + <p><img src="images/project_functions.png" /></p> + + Раздел "Проект" содержит следующие секции: + <ul><li><a href="project_functions.htm">Функции для защиты</a> - позволяет выбрать объекты для защиты</li> + <li><a href="manager/licenses.htm">Лицензии</a> - позволяет управлять лицензиями и серийными номерами</li> + <li><a href="project_files.htm">Файлы</a> - позволяет включить в защищаемый EXE файл дополнительные файлы данных или DLL</li> + <li><a href="project_script.htm">Скрипт</a> - позволяет расширить возможности защиты за счет использования встроенного скриптового языка на базе LUA</li> + <li><a href="project_options.htm">Опции</a> - позволяет настроить параметры защиты приложения</li> + </ul> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/project_files.htm b/help/ru/project_files.htm new file mode 100644 index 0000000..6a7194b --- /dev/null +++ b/help/ru/project_files.htm @@ -0,0 +1,43 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Секция "Файлы"</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Секция "Файлы"</h1> + + <p>Секция "Файлы" позволяет включить в защищаемый EXE файл + необходимые для его работы файлы данных, включая изображения, текстовые ресурсы, а также динамически подгружаемые библиотеки. Все виды данных, включая DLL, в процессе работы защищенного EXE файла будут загружаться из памяти процесса без + предварительной записи на диск.</p> + <p><img src="images/project_file_protection.png" /></p> + + <p>Кнопка <strong>Добавить файл</strong> на панели инструментов главного окна программы позволяет добавить к защищаемому EXE файлу новый файл. Также можно добавить новый файл с помощью контекстного меню:</p> + <p><img src="images/project_file_menu.png" /></p> + + <p>Для изменения свойств выбранного файла, выберите его в списке слева и отредактируйте название, имя файла или дополнительные свойства.</p> + <p><img src="images/project_file_settings.png" /></p> + + <p>Чтобы удалить файл из списка защищаемых, щелкните его правой кнопкой и выберите "Удалить", либо просто выделите файл и нажмите Del.</p> + <p><img src="images/project_file_delete.png" /></p> + <p>Щелкнув правой кнопкой по названию секции можно исключить файл из компиляции. Настройки исключения из компиляции сохраняются в файл проекта.</p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/project_functions.htm b/help/ru/project_functions.htm new file mode 100644 index 0000000..d5841e9 --- /dev/null +++ b/help/ru/project_functions.htm @@ -0,0 +1,134 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Секция "Функции для защиты"</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + /*]]>*/ + </style> +</head> + +<body> + <h1>Секция "Функции для защиты"</h1> + + <p>Секция предназначена для выбора защищаемых функций.</p> + <p><img src="images/project_functions.png" /></p> + <h3 id="AddFunction">Добавление функции</h3> + <p>Для того чтобы добавить новый объект в проект, нажмите кнопку "Добавить функцию" на панели инструментов, либо выберите этот пункт в контекстном меню:</p> + <p><img src="images/project_functions_menu.png" /></p> + <p>Появится диалог добавления функции:</p> + <p><img src="images/project_add_function.png" /></p> + <p>Задайте адрес функции или выберите нужную функцию из списка на вкладке "Функции", начав набирать ее имя в строке быстрого поиска. Вы можете добавить сразу несколько функций, используя множественное выделение. Все выделенные функции будут добавлены с выбраными опциями защиты.</p> + <p><strong>Опции</strong></p> + <ul> + <li><a name="CompilationTypes" id= + "CompilationTypes"><strong>Тип компиляции</strong></a> - + выбрать тип компиляции объекта. Правильный выбор способа защиты + от изучения и взлома для каждого защищаемого объекта + (процедуры, функции, фрагмента кода) обеспечит оптимальное + соотношение между защищенностью кода и его быстродействием. + VMProtect позволяет пользователю установить следующие типы + компиляции для каждого защищаемого объекта:</li> + <ul> + <li><strong>Мутация.</strong> Исполняемый код + видоизменяется на уровне команд процессора - существующие + команды видоизменяются, добавляются различные мусорные + команды и т.д. Данный тип компиляции относительно слабо + защищает обрабатываемый код от взлома и анализа и главным + образом препятствует определению обрабатываемых функций с + помощью сигнатурных анализаторов (PEiD+KANAL, IDA+FLIRT и + т.д.). Этот тип компиляции целесообразно применять при + защите библиотечных функций, так как они, как правило, не + нуждаются в защите от взлома и анализа и достаточно будет + только изменить их сигнатуры, чтобы взломщик не смог + автоматически определить, какие именно библиотеки + используются в приложении. При использовании мутации + степень защиты от взлома и анализа низкая, скорость + исполнения кода высокая.</li> + + <li><strong>Виртуализация.</strong> Исполняемый код + переводится в байт-код, исполняемый на виртуальной машине. + Данный тип компиляции следует применять для всех критичных + участков кода, где помимо противодействия взлому и анализу + важна скорость работы. При использовании виртуализации + степень защиты от взлома и анализа средняя, скорость + исполнения кода средняя.</li> + + <li><strong>Ультра (мутация + виртуализация).</strong> + Исполняемый код видоизменяется на уровне команд процессора + и уже после этого переводится в байт-код, исполняемый на + виртуальной машине. Данный тип компиляции следует применять + для всех участков кода, где не важна скорость работы. + Степень защиты от взлома и анализа высокая, скорость + исполнения кода низкая.</li> + </ul> + + <li id="LockToKey"><strong>Привязать к серийному номеру</strong> - при включении данной опции защищенная функция будет <a href="manager/features.htm#lock">недоступна без ввода валидного серийного номера</a>. Таким образом можно, например, ограничивать доступ к определенным функциям приложения в незарегистрированной версии.</li> + </ul> + + <p id="Search"><strong>Поиск</strong></p> + + <p>Необходимые объекты можно отыскать по их имени в универсальном быстром поиске:</p> + <p><img src="images/project_functions_search.png" /></p> + + <p>В строке поиска можно использовать стандартные символы подстановки:</p> + <ul> + <li><strong>*</strong> - заменяет группу символов произвольной длины;</li> + <li><strong>?</strong> - заменяет любой одиночный символ.</li> + </ul> + + <h3 id="AddFolder">Добавление папки</h3> + <p>Добавление папки осуществляется с помощью контекстного меню:</p> + <p><img src="images/project_functions_menu.png" /></p> + <p>Папки используются для группировки защищаемых объектов в + дереве проекта, а также для группового изменения параметров + защиты (включение в компиляцию, тип компиляции) для всех + объектов из этой папки.</p> + <p>Задайте имя новой папке:</p> + <p><img src="images/project_add_folder.png" /></p> + + <h3>Редактирование объектов</h3> + <p>В правой части окна отображается содержимое выбранного + объекта. Если в дереве проекта выбран защищаемый объект, то с + правой стороны отображается дизассемблированное представление + этого объекта:</p> + + <p><img src="images/project_functions_content.png" alt= + "Код" /></p> + <p>Щелчок правой кнопкой мыши по строчке кода вызывает контекстное меню:</p> + <p><img src="images/project_functions_menu3.png" /></p> + <ul> + <li><a name="ExtAddress" id="ExtAddress"><strong>Внешний + адрес</strong></a> - включить выбранный адрес в список <a href= + "project_options_external_addresses.htm">внешних адресов</a>;</li> + + <li><strong>Конец функции</strong> - ограничить список + команд, которые будут обработаны в процессе компиляции;</li> + </ul> + + <p>Если в дереве проекта выбрана папка, то с правой стороны + отображается список функций, входящих в эту папку:</p> + + <p><img src="images/project_functions_content2.png" /></p> + + <p>Перемещать функции из папки в папку можно простым + перетаскиванием при помощи мыши.</p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/project_options.htm b/help/ru/project_options.htm new file mode 100644 index 0000000..c60f49e --- /dev/null +++ b/help/ru/project_options.htm @@ -0,0 +1,125 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Секция "Опции"</title> +</head> + +<body> + <h1>Секция "Опции"</h1> + + <p>Секция "Опции" раздела "Проект" предназначена для установки опций защиты:</p> + <p><img src="images/project_options.png" /></p> + + <h3>Файл</h3> + + <ul> + <li><strong id="MemoryProtection">Защита памяти</strong> - + данная опция позволяет защитить образ файла в памяти от + каких-либо изменений (целостность данных проверяется по всем + секциям, не имеющим атрибут WRITABLE). Проверка целостности + образа происходит до передачи управления оригинальной точке + входа в программу. В случае нарушения целостности будет + показано соответствующее сообщение с полным прекращением + дальнейшего выполнения программы.</li> + + <li><strong id="ImportProtection">Защита импорта</strong> - + данная опция позволяет спрятать от взломщика список API, + которые использует защищенная программа (рекомендуется + использовать совместно с упаковкой выходного файла).</li> + + <li><strong id="ResourceProtection">Защита ресурсов</strong> - + данная опция позволяет зашифровать ресурсы программы (кроме + иконок, манифеста и других служебных ресурсов).</li> + + <li> + <strong id="PackOutputFile">Упаковать выходной файл</strong> + - данная опция позволяет упаковать защищенный файл, что + уменьшает его размер. Распаковка происходит автоматически при + запуске защищенного файла. Весь процесс распаковки происходит + в оперативной памяти без какой-либо записи данных на диск. + + <p>При использовании данной опции рекомендуется включить + <a href="dictionary.htm#EntryPoint">EntryPoint</a> в список + защищаемых объектов.<br /> + <strong>Важно:</strong><br /> + При старте программы после распаковки кода управление будет + передано EntryPoint. Если код EntryPoint будет + завиртуализирован, то этот код будет выполнен на том же + исполнителе ВМ, что и код самого распаковщика. Совместная + виртуализация EntryPoint с упаковкой защищенного файла + препятствует "ручной" распаковке защищенного файла, т.к. + взломщику надо будет восстановить код EntryPoint для + получения работоспособного образа файла.</p> + </li> + <li> + <strong id="Additional">Дополнительные</strong> + - дополнительные настройки защиты:</li> + <ul> + <li> + <strong id="watermarks">Водяные знаки</strong> - позволяет добавить в проект <a href="watermarks.htm">водяные знаки</a>. + </li> + <li><strong id="VMSectionName">Сегменты ВМ</strong> - + при компиляции в файл будут добавлены дополнительные сегменты, в + которые будут записаны различные данные (завиртуализированный, + промутированный код, исполнители ВМ, водяные знаки и т.п.). + Данная опция позволяет задать названия для новых сегментов. + Рекомендуется изменять стандартное название сегментов ".vmp" + (например, на ".UPX").</li> + <li><strong>Удалять отладочную информацию</strong> - удаление отладочной информации компилятора затруднит анализ кода приложения злоумышленником.</li> + <li><strong>Удалять настраиваемые элементы</strong> - некоторые + компиляторы (в частности Delphi) создают для EXE файлов список + настраиваемых элементов, которые не используются операционной + системой при загрузке EXE файлов. При включенной опции область, + занятая под список настраиваемых элементов, будет + использоваться под нужды ВМ.</li> + </ul> + + </ul> + + <h3>Обнаружение</h3> + + <ul> + <li><strong id="DebuggerDetection">Отладчик</strong> - данная опция препятствует отладке + защищенного файла. Существуют 2 типа отладчиков: User-mode + (отладчики пользовательского режима: OllyDBG, WinDBG и т.п.) и + Kernel-mode (отладчики режима ядра: SoftICE, Syser и т.п.). + Обнаружение отладчика происходит до передачи управления + оригинальной точке входа в программу. В случае обнаружения + отладчика будет показано соответствующее сообщение с + прекращением дальнейшего выполнения программы.</li> + + <li><strong id="VirtualizationToolsDetection">Инструменты виртуализации</strong> - данная опция препятствует + запуску защищенного файла в различных виртуальных средах: + VMware, Virtual PC, VirtualBox, Sandboxie. Обнаружение + виртуальной среды происходит до передачи управления + оригинальной точке входа в программу. В случае обнаружения + виртуальной среды будет показано соответствующее сообщение с + прекращением дальнейшего выполнения программы.</li> + </ul> + + <h3>Сообщения</h3> + <p>В данном разделе можно задать сообщения, выводимые программой при обнаружении отладчика, инструментов виртуализации, повреждении файла или попытке исполнения кода, защищенного серийным номером.</p> + + <h3 id="LicensingParameters">Параметры лицензирования</h3> + + <p>В качестве файла с параметрами лицензирования выберите файл + проекта, созданного в <a href="manager/licenses.htm">менеджере + лицензий</a>. По умолчанию используется текущий файл проекта.</p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/project_options_external_addresses.htm b/help/ru/project_options_external_addresses.htm new file mode 100644 index 0000000..cc8dff5 --- /dev/null +++ b/help/ru/project_options_external_addresses.htm @@ -0,0 +1,80 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Внешние адреса</title> +</head> + +<body> + <h1>Внешние адреса</h1> + + При защите кода место, освободившееся в + процессе компиляции, VMProtect использует для своих нужд, в + том числе для хранения различных данных + (завиртуализированного, промутированного кода, исполнителей + ВМ и т.п.). В связи с этим могут возникать различные + ситуации, когда "внутрь" защищенного кода может происходить + переход из других частей программы (адреса, на которые может + происходить переход, называются внешними). Подобные ситуации + могут возникать при использовании маркеров кода, когда + происходит переход из незащищенного участка программы внутрь + маркера: + <pre class="code">VMProtectBegin(nil); +for I:=0 to 10 do +begin + Inc(J); + VMProtectEnd; +end; +</pre> + + <p>В виде ассемблерных команд данный цикл выглядит следующим + образом:</p> + <pre class="code">----------------- начало маркера ---------------- +0044D12C mov eax, 0000000B +0044D131 inc ebx +----------------- конец маркера ----------------- +0044D132 dec eax +0044D133 jnz 0044D131 +</pre> + + <p>Очевидно, что после виртуализации команд с адресами + 0044D12C и 0044D131 при выполнении незавиртуализированной + команды условного перехода по адресу 0044D133 возникнет + ошибка (т.к. по адресу 0044D131 вместо оригинального кода + будут записаны различные данные или просто мусор). Для + рассматриваемого примера адрес 0044D131 будет являться + внешним.</p> + + <p>При включении опции "Режим отладки" на место оригинального + кода будет записана команда INT 03, являющаяся обычной точкой + останова и служебной командой при работе под отладчиком. При + запуске защищенной программы из-под отладчика в случае + передачи управления по адресу 0044D131 произойдет вызов точки + останова, а при открытии окна отладчика можно будет увидеть, + по какому адресу произошел данный переход.</p> + + <p>При обнаружении подобных переходов рекомендуется проверить + правильность расстановки маркеров кода. Если защищаемый код + не помечен маркерами или невозможно изменить логику + приложения так, чтобы внутрь защищаемого кода не было + перехода из других частей программы, то, используя + графическую версию приложения, данные адреса <a href= + "project_functions.htm#ExtAddress">следует пометить как + внешние</a>.</p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/project_script.htm b/help/ru/project_script.htm new file mode 100644 index 0000000..083c534 --- /dev/null +++ b/help/ru/project_script.htm @@ -0,0 +1,34 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Секция "Скрипт"</title> +</head> + +<body> + <h1>Секция "Скрипт"</h1> + + <p>Секция "Скрипт" раздела "Проект" предназначена для создания программ на встроенном <a href="script.htm">скриптовом языке</a>:</p> + <p><img src="images/project_script.png" /></p> + + <p>Основная панель предназначена для редактирования самого + скрипта. С помощью контекстного меню можно манипулировать фрагментами кода.</p> + <p>Отдельные блоки кода (циклы, функции) можно свернуть или развернуть, нажав на значок иерархии (плюс или минус) рядом с номером строки.</p> + <p>Щелкнув правой кнопкой мыши по заголовку секции, можно исключить скрипт из компиляции. Скрипт, исключенный из компиляции, не обрабатывается и не исполняется программой. Эта настройка сохраняется в свойствах проекта.</p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/recommendations.htm b/help/ru/recommendations.htm new file mode 100644 index 0000000..b459b3a --- /dev/null +++ b/help/ru/recommendations.htm @@ -0,0 +1,233 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Рекомендации по защите</title> +</head> + +<body> + <h1>Рекомендации по защите</h1> + + <p>Программа VMProtect представляет собой надежный инструмент + защиты кода приложения от изучения и взлома. Однако его + эффективное использование возможно лишь в том случае, если + встроенные в приложение защитные механизмы спроектированы по + определенным правилам и не содержат типичных ошибок. Рассмотрим + некоторые моменты, связанные с созданием защитных механизмов + приложения.</p> + + <h3>Процедура регистрации</h3> + + <p>Типичной ошибкой программистов, разрабатывающих собственную + схему регистрации экземпляра приложения, является вынос процедуры + проверки корректности введенного регистрационного ключа в + отдельную функцию c понятным возвращаемым значением:</p> + <pre class="indent code">function CheckRegistration(const RegNumber: String): Boolean; +begin + if RegNumber='123' then + Result:=True + else + Result:=False; +end; + +procedure TForm1.Button1Click(Sender: TObject); +begin + ... + if not CheckRegistration(RegNumber) then + exit; + Application.CreateForm(TForm2, Form2); + Form2.ShowModal; + ... +end; +</pre> + + <p>При подобном подходе к проверке регистрационного кода + взломщику нет необходимости вникать в алгоритм проверки ключа, а + будет достаточно изменить код в начале процедуры проверки таким + образом, чтобы она всегда возвращала значение, + соответствующее корректному регистрационному ключу:</p> + <pre class="indent code">function CheckRegistration(const RegNumber: String): Boolean; +begin + Result:=True; + exit; + ... +end; +</pre> + + <p>Гораздо более эффективным способом является встраивание + проверки корректности регистрационного кода в логику работы + программы таким образом, чтобы невозможно было отделить алгоритм + проверки регистрационного кода от алгоритма работы вызывающей эту + проверку процедуры. Также рекомендуется "примешивать" логику + работы программы в процедуру проверки регистрационного кода так, + чтобы "обход" регистрационной процедуры приводил к ошибкам в + работе приложения. Для примера, приведенного выше, это можно + сделать следующим образом:</p> + <pre class="indent code">function CheckRegistration(const RegNumber: String): Boolean; +begin + if RegNumber='123' then + begin + Application.CreateForm(TForm2, Form2); + Result:=True + end + else + Result:=False; +end; + +procedure TForm1.Button1Click(Sender: TObject); +begin + ... + Form2:=nil; + if not CheckRegistration(RegNumber) then + exit; + Form2.ShowModal; + ... +end; +</pre> + + <p>При подобной реализации функции CheckRegistration для "обхода" + проверки регистрационного ключа взломщику будет необходимо + досконально разбирать работу всей функции проверки ключа. При + защите данного приложения с помощью VMProtect рекомендуется + выполнить виртуализацию не только функции CheckRegistration, но и + процедуры TForm1.Button1Click. Для еще большего усложнения + процесса взлома приложения можно воспользоваться <a href="project_functions.htm#CompilationTypes">режимом защиты + "Ультра"</a>, сочетающим мутацию кода приложения с его последующей + виртуализацией.</p> + + <h3>Проверка регистрационных ключей</h3> + + <p>Очень часто программисты допускают грубейшие ошибки при + реализации самой проверки правильности регистрационного ключа, + производя сравнение введенного ключа с его корректным значением. + При подобной реализации взломщик легко сможет подобрать + корректное значение ключа, просмотрев в процессе трассировки + аргументы, с которыми вызывается функция сравнения строк:</p> + <pre class="indent code">var ValidRegNumber: String; +... +function CheckRegistration(const RegNumber: String): Boolean; +begin + if RegNumber=ValidRegNumber then + Result:=True + else + Result:=False; +end; +</pre> + + <p>Для исключения подобной ситуации при сравнении введенного + значения ключа с его допустимым значением рекомендуется + использовать их хеши, а не реальные значения. По своей сути + хеш-функция необратима, а значит, по результатам проверки хешей + невозможно определить значение допустимого ключа. При взломе + приложения будет необходимо потратить гораздо больше времени на + изучение программы, так как придется исследовать гораздо больше + участков кода, а не только процедуру проверки корректности + введенного ключа:</p> + <pre class="indent code">var + HashOfValidRegNumber: Longint; +... +// Пример использования обобщенного алгоритма хеширования Питера Вейнбергера (PJW) +function HashPJW(const Value: String): Longint; +var I:Integer; + G:Longint; +begin + Result:=0; + for I:=1 to Length(Value) do + begin + Result:=(Result shl 4)+Ord(Value[I]); + G:=Result and $F0000000; + if G<&gt0 then + Result:=(Result xor (G shr 24)) xor G; + end; +end; + +function CheckRegistration(const RegNumber: String): Boolean; +begin + if HashPJW(RegNumber)=HashOfValidRegNumber then + Result:=True + else + Result:=False; +end; +... +initialization + HashOfValidRegNumber:=HashPJW(ValidRegNumber); + +end. +</pre> + + <p>При защите программы с помощью VMProtect целесообразно + защитить функции HashPJW и CheckRegistration для усложнения + работы взломщика.</p> + + <h3>Хранение результата проверки регистрации</h3> + + <p>Как правило, программисты, затратившие много времени на + реализацию самой процедуры регистрации, не уделяют достаточного + внимания защите самого результата регистрации программы. В + приведенном ниже примере перед вызовом функции проверки + корректности регистрационного номера контролируется состояние + глобальной переменной, хранящей результат проверки регистрации. + Для взломщика поиск глобальной переменной не представляет + трудностей - достаточно будет сравнить сегменты данных ДО и ПОСЛЕ + регистрации. Кстати, аналогичный принцип лежит в основе работы + известной программы ArtMoney.</p> + <pre class="indent code">var IsRegistered: Boolean; +... +procedure TForm1.Button1Click(Sender: TObject); +begin + ... + if not IsRegistered then + IsRegistered:=CheckRegistration(RegNumber); + if not IsRegistered then + exit; + ... +end; +</pre> + + <p>Для исключения подобной ситуации рекомендуется результаты всех + проверок, отвечающих за регистрацию программы, хранить в + динамической памяти, так как в этом случае сканирование секций + данных на предмет изменения ячеек памяти ДО и ПОСЛЕ регистрации + окажется бесполезным. Простейший пример, демонстрирующий хранение + результата в динамически выделяемой памяти, приведен ниже.</p> + <pre class="indent code">type PBoolean = ^Boolean; + +var IsRegistered: PBoolean; +... +procedure TForm1.Button1Click(Sender: TObject); +begin + ... + if not IsRegistered^ then + IsRegistered^:=CheckRegistration(RegNumber); + if not IsRegistered^ then + exit; + ... +end; +... +initialization + New(IsRegistered); +</pre> + + <p>Выше приведены простейшие примеры реализации встроенных в + приложение механизмов защиты. Варианты реальной реализации + процедуры регистрации, функции проверки регистрационного ключа + или организации хранения результата проверки регистрационного + ключа ограничены только фантазией разработчика. Однако в любом + случае при разработке механизмов защиты приложения следует знать + о возможных ошибках и не повторять их.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/ru.qhcp b/help/ru/ru.qhcp new file mode 100644 index 0000000..8805876 --- /dev/null +++ b/help/ru/ru.qhcp @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" ?> +<QHelpCollectionProject version="1.0"> + <docFiles> + <generate> + <file> + <input>ru.qhp</input> + <output>../../bin/ru.qch</output> + </file> + </generate> + <register> + <file>../../bin/ru.qch</file> + </register> + </docFiles> +</QHelpCollectionProject>
\ No newline at end of file diff --git a/help/ru/ru.qhp b/help/ru/ru.qhp new file mode 100644 index 0000000..e737a7c --- /dev/null +++ b/help/ru/ru.qhp @@ -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="Введение" ref="terms.htm"> + <section title="Словарь терминов" ref="dictionary.htm" /> + <section title="Изучение, взлом и защита программного обеспечения" ref="software_protection.htm" /> + <section title="Что такое VMProtect?" ref="about_vmprotect.htm" /> + <section title="Рекомендации по защите" ref="recommendations.htm" /> + <section title="История изменений" ref="history.htm" /> + </section> + <section title="Работа с VMProtect" ref="work.htm"> + <section title="Подготовка проекта" ref="create_project.htm"> + <section title="Использование MAP-файла" ref="use_map_file.htm" /> + <section title="Использование маркеров" ref="use_markers.htm" /> + <section title="Функции SDK" ref="sdk_functions.htm" /> + </section> + <section title="Главное окно" ref="main_window.htm"> + <section title="Главное меню" ref="main_menu.htm"> + <section title="Меню "Файл"" ref="menu_file.htm" /> + <section title="Меню "Правка"" ref="menu_edit.htm" /> + <section title="Меню "Проект"" ref="menu_project.htm" /> + <section title="Меню "Инструменты"" ref="menu_tools.htm" /> + <section title="Меню "Справка"" ref="menu_help.htm" /> + </section> + <section title="Панель инструментов" ref="toolbar.htm" /> + <section title="Раздел "Проект"" ref="project.htm"> + <section title="Секция "Функции для защиты"" ref="project_functions.htm" /> + <section title="Секция "Лицензии"" ref="manager/licenses.htm" /> + <section title="Секция "Файлы"" ref="project_files.htm" /> + <section title="Секция "Скрипт"" ref="project_script.htm" /> + <section title="Секция "Опции"" ref="project_options.htm" /> + </section> + <section title="Раздел "Функции"" ref="functions.htm" /> + <section title="Раздел "Свойства"" ref="info.htm"> + <section title="Секция "Директории"" ref="info_directories.htm" /> + <section title="Секция "Сегменты"" ref="info_segments.htm" /> + <section title="Секция "Импорты"" ref="info_imports.htm" /> + <section title="Секция "Экспорты"" ref="info_exports.htm" /> + <section title="Секция "Ресурсы"" ref="info_resources.htm" /> + <section title="Секция "Калькулятор"" ref="info_calc.htm" /> + <section title="Секция "Дамп"" ref="info_dump.htm" /> + </section> + </section> + <section title="Консольная версия" ref="mode_console.htm" /> + </section> + <section title="Система лицензирования" ref="manager/index.htm"> + <section title="Возможности системы лицензирования VMProtect" ref="manager/features.htm" /> + <section title="Как работает система лицензирования?" ref="manager/howitworks.htm" /> + <section title="Интеграция в приложение" ref="manager/usage/index.htm"> + <section title="Этап 1: Тестовый режим работы" ref="manager/usage/index.htm#TestMode"> + <section title="Шаг 1: Создаем защищаемое приложение" ref="manager/usage/step11_app.htm" /> + <section title="Шаг 2: Добавляем код проверки лицензии" ref="manager/usage/step12_code.htm" /> + <section title="Шаг 3: Получаем флаги состояния серийного номера" ref="manager/usage/step13_flags.htm" /> + <section title="Шаг 4: Получаем имя и e-mail пользователя" ref="manager/usage/step14_name.htm" /> + <section title="Шаг 5: Проверяем срок действия серийного номера" ref="manager/usage/step15_exp.htm" /> + <section title="Шаг 6: Ограничиваем время работы программы" ref="manager/usage/step16_time.htm" /> + <section title="Шаг 7: Ограничиваем бесплатные обновления" ref="manager/usage/step17_maxbuild.htm" /> + <section title="Шаг 8: Номера из "черного списка"" ref="manager/usage/step18_blacklist.htm" /> + <section title="Шаг 9: Привязка к оборудованию" ref="manager/usage/step19_hwid.htm" /> + <section title="Шаг 10: Пользовательские данные" ref="manager/usage/step1A_userdata.htm" /> + </section> + <section title="Этап 2: Реальный режим работы" ref="manager/usage/index.htm#RealMode"> + <section title="Шаг 1: Создаем новое защищенное приложение" ref="manager/usage/step21_src.htm" /> + <section title="Шаг 2: Создаем проект защиты в VMProtect" ref="manager/usage/step22_vmp.htm" /> + <section title="Шаг 3: Создаем продукт в менеджере лицензий" ref="manager/usage/step23_product.htm" /> + <section title="Шаг 4: Тестируем результат" ref="manager/usage/step24_test.htm" /> + <section title="Шаг 5: Привязываем код к серийному номеру" ref="manager/usage/step25_codelock.htm" /> + </section> + <section title="Описание функций API лицензирования" ref="manager/usage/api.htm" /> + </section> + <section title="Генераторы ключей" ref="manager/keygen/index.htm"> + <section title="Windows-версия" ref="manager/keygen/keygen_dll.htm" /> + <section title=".Net-версия" ref="manager/keygen/keygen_net.htm" /> + <section title="UNIX-версия" ref="manager/keygen/keygen_php.htm" /> + <section title="Формат серийного номера" ref="manager/keygen/serial_format.htm" /> + <section title="Алгоритмы шифрования серийных номеров" ref="manager/keygen/algorithms.htm" /> + </section> + <section title="Система Активации" ref="manager/activation.htm"> + <section title="Настройка Активации в VMProtect" ref="manager/activation/vmprotect.htm" /> + <section title="Поддержка Активации в Web License Manager" ref="manager/activation/weblm.htm" /> + <section title="API Активации" ref="manager/activation/api.htm" /> + </section> + </section> + <section title="Использование скриптов" ref="script.htm"> + <section title="Классы" ref="script_classes.htm" /> + <section title="Встроенные функции" ref="script_functions.htm" /> + <section title="События" ref="script_events.htm" /> + </section> + <section title="Водяные знаки" ref="watermarks.htm"> + <section title="Вкладка "Настройка"" ref="watermarks_setup.htm" /> + <section title="Вкладка "Поиск"" ref="watermarks_search.htm" /> + </section> + <section title="Ответы на вопросы" ref="faq.htm" /> + <section title="Контактная информация" 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> diff --git a/help/ru/script.htm b/help/ru/script.htm new file mode 100644 index 0000000..288a14b --- /dev/null +++ b/help/ru/script.htm @@ -0,0 +1,37 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Использование скриптов</title> +</head> + +<body> + <h1>Использование скриптов</h1> + + <p>Программа VMProtect обладает мощным встроенным скриптовым + языком <a href="http://www.lua.org/">LUA</a>, использование которого позволяет расширить возможности + VMProtect на каждом этапе обработки защищаемого файла.</p> + + <p>Синтаксис языка LUA похож на JavaScript, однако в отличие от последнего он не содержит классов в явном виде. Тем не менее, скриптовый язык позволяет легко формировать такие механизмы объектно-ориентированного программирования, как классы, наследование и события. Примеры использования скриптов находятся в каталоге "VMProtect/Examples/Scripts".</p> + <ul> + <li><a href="script_classes.htm">Классы</a></li> + <li><a href="script_functions.htm">Встроенные функции</a></li> + <li><a href="script_events.htm">События</a></li> + </ul> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/script_classes.htm b/help/ru/script_classes.htm new file mode 100644 index 0000000..ae7b33e --- /dev/null +++ b/help/ru/script_classes.htm @@ -0,0 +1,1188 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Классы</title> +</head> + +<body> + <h1>Классы</h1> + + <p>Встроенный скриптовый язык <a href="http://www.lua.org/about.html">LUA</a> программы VMProtect является + объектно-ориентированным: по синтаксису, идеалогии и реализации он во многом похож на JavaScript. + В состав скриптового языка входят как стандартные классы, + обеспечивающие базовую функциональность, так и специализированные + классы, предоставляющие доступ к функционалу защиты приложения. + </p> + +<h3>Иерархия классов</h3> +<ul> +<li><a href="#Core">Core</a><ul> + <li><a href="#Watermarks">Watermarks</a><ul> + <li><a href="#Watermark">Watermark</a></li> + </ul></li> + <li><a href="#Licenses">Licenses</a><ul> + <li><a href="#License">License</a></li> + </ul></li> + <li><a href="#Files">Files</a><ul> + <li><a href="#File">File</a></li> + </ul></li> + <li><a href="#Folders">Folders</a><ul> + <li><a href="#Folder">Folder</a></li> + </ul></li> + + <li><a href="#PEFile">PEFile</a><ul> + <li><a href="#PEFormat">PEFormat</a><ul> + </ul></li> + <li><a href="#PEArchitecture">PEArchitecture</a><ul> + <li><a href="#PESegments">PESegments</a><ul> + <li><a href="#PESegment">PESegment</a></li> + </ul></li> + <li><a href="#PESections">PESections</a><ul> + <li><a href="#PESection">PESection</a></li> + </ul></li> + <li><a href="#PEDirectories">PEDirectories</a><ul> + <li><a href="#PEDirectory">PEDirectory</a></li> + </ul></li> + <li><a href="#PEImports">PEImports</a><ul> + <li><a href="#PEImport">PEImport</a></li> + </ul></li> + <li><a href="#PEExports">PEExports</a><ul> + <li><a href="#PEExport">PEExport</a></li> + </ul></li> + <li><a href="#PEResources">PEResources</a><ul> + <li><a href="#PEResource">PEResource</a></li> + </ul></li> + <li><a href="#PEFixups">PEFixups</a><ul> + <li><a href="#PEFixup">PEFixup</a></li> + </ul></li> + </ul></li> + </ul></li> + <li><a href="#MacFile">MacFile</a><ul> + <li><a href="#MacFormat">MacFormat</a><ul> + </ul></li> + <li><a href="#MacArchitecture">MacArchitecture</a><ul> + <li><a href="#MacSegments">MacSegments</a><ul> + <li><a href="#MacSegment">MacSegment</a></li> + </ul></li> + <li><a href="#MacSections">MacSections</a><ul> + <li><a href="#MacSection">MacSection</a></li> + </ul></li> + <li><a href="#MacCommands">MacCommands</a><ul> + <li><a href="#MacCommand">MacCommand</a></li> + </ul></li> + <li><a href="#MacSymbols">MacSymbols</a><ul> + <li><a href="#MacSymbol">MacSymbol</a></li> + </ul></li> + <li><a href="#MacImports">MacImports</a><ul> + <li><a href="#MacImport">MacImport</a></li> + </ul></li> + <li><a href="#MacExports">MacExports</a><ul> + <li><a href="#MacExport">MacExport</a></li> + </ul></li> + <li><a href="#MacFixups">MacFixups</a><ul> + <li><a href="#MacFixup">MacFixup</a></li> + </ul></li> + </ul></li> + </ul></li> + <li><a href="#MapFunctions">MapFunctions</a><ul> + <li><a href="#MapFunction">MapFunction</a><ul> + <li><a href="#References">References</a><ul> + <li><a href="#Reference">Reference</a></li> + </ul></li> + </ul></li> + </ul></li> + <li><a href="#IntelFunctions">IntelFunctions</a><ul> + <li><a href="#IntelFunction">IntelFunction</a><ul> + <li><a href="#IntelSegment">IntelSegment</a><ul> + <li><a href="#IntelRegistr">IntelRegistr</a></li> + <li><a href="#IntelCommandType">IntelCommandType</a></li> + <li><a href="#IntelFlag">IntelFlag</a></li> + <li><a href="#IntelCommand">IntelCommand</a><ul> + <li><a href="#OperandType">OperandType</a><ul> + <li><a href="#IntelOperand">IntelOperand</a></li> + </ul></li> + </ul></li> + </ul></li> + <li><a href="#CommandLinks">CommandLinks</a><ul> + <li><a href="#LinkType">LinkType</a><ul> + <li><a href="#CommandLink">CommandLink</a></li> + </ul></li> + </ul></li> + </ul></li> + </ul></li> +</ul></li> +<li><a href="#FFILibrary">FFILibrary</a><ul> + <li><a href="#FFIFunction">FFIFunction</a></li> +</ul></li> +</ul> + +<h3>Ядро</h3> + +<p id="ProjectOption">Опции проекта:</p> +<pre class="code"> +enum ProjectOption { + None, + Pack, + ImportProtection, + MemoryProtection, + ResourceProtection, + CheckDebugger, + CheckKernelDebugger, + CheckVirtualMachine, + StripFixups, + StripDebugInfo, + DebugMode +} +</pre> + +<p id="Core">Класс для работы с ядром VMProtect:</p> +<pre class="code" id="Core"> +class Core { +public: + string projectFileName(); // возращает имя проекта + void saveProject(); // сохраняет проект + string inputFileName(); // возвращает имя исходного файла для текущего проекта + string outputFileName(); // возращает имя выходного файла для текущего проекта + void setOutputFileName(string name); // устанавливает имя выходного файла для текущего проекта + string watermarkName(); // возвращает имя водяного знака из текущего проекта + void setWatermarkName(string name); // устанавливает имя водяного знака для текущего проекта + int options(); // возвращает <a href="#ProjectOption">опции</a> для текущего проекта + void setOptions(int options); // устанавливает опции для текущего проекта + string vmSectionName(); // возвращает имя сегмента ВМ для текущего проекта + void setVMSectionName(); // устанавливает имя сегмента ВМ для текущего проекта + <a href="#Licenses">Licenses</a> licenses(); // возвращает список лицензий для текущего проекта + <a href="#Files">Files</a> files(); // возвращает список файлов для текущего проекта + <a href="#Watermarks">Watermarks</a> watermarks(); // возвращает список водяных знаков + <a href="#PEFile">PEFile</a>/<a href="#MacFile">MacFile</a> inputFile(); // возвращает исходный файл + <a href="#PEFile">PEFile</a>/<a href="#MacFile">MacFile</a> outputFile(); // возвращает выходной файл + <a href="#PEArchitecture">PEArchitecture</a>/<a href="#MacArchitecture">MacArchitecture</a> inputArchitecture(); // возвращает исходную архитектуру + <a href="#PEArchitecture">PEArchitecture</a>/<a href="#MacArchitecture">MacArchitecture</a> outputArchitecture(); // возвращает выходную архитектуру +}; +</pre> + +<h3>Водяные знаки</h3> + +<p id="Watermarks">Класс для работы со списком <a href="watermarks.htm">водяных знаков</a>:</p> +<pre class="code"> +class Watermarks { +public: + <a href="#Watermark">Watermark</a> item(int index); // возвращает водяной знак с индексом index + int count(); // возвращает количество водяных знаков в списке + <a href="#Watermark">Watermark</a> itemByName(string name); // возвращает водяной знак с именем name + <a href="#Watermark">Watermark</a> add(string name, string value); // добавляет водяной знак с именем name и значением value +} +</pre> + +<p id="Watermark">Класс для работы с водяным знаком:</p> +<pre class="code"> +class Watermark { +public: + string name(); // возвращает имя водяного знака + string value(); // возвращает значение водяного знака + bool blocked(); // возвращает признак "Заблокирован" + void setBlocked(bool value); // устанавливает признак "Заблокирован" +} +</pre> + +<h3>Лицензии</h3> + +<p id="Licenses">Класс для работы со списком <a href="manager/licenses.htm">лицензий</a>:</p> +<pre class="code"> +class Licenses { +public: + int keyLength(); // возвращает размер ключа + string publicExp(); // возвращает публичную экспоненту + string privateExp(); // возвращает приватную экспоненту + string modulus(); // возвращает модулус + <a href="#License">License</a> item(int index); // возвращает лицензию с индексом index + int count(); // возвращает количество лицензий в списке +} +</pre> + +<p id="License">Класс для работы с лицензией:</p> +<pre class="code"> +class License { +public: + string date(string format = "%c"); // возвращает дату лицензии + string customerName(); // возвращает имя владельца лицензии + string customerEmail(); // возвращает адрес электронной почты владельца лицензии + string orderRef(); // возвращает номер заказа, по которому приобретена лицензия + string comments(); // возвращает комментарии к лицензии + string serialNumber(); // возвращает серийный номер лицензии + bool blocked(); // возвращает признак "Заблокирован" + void setBlocked(bool value); // устанавливает признак "Заблокирован" +} +</pre> + +<h3>Файлы</h3> + +<p id="Files">Класс для работы со списком <a href="project_files.htm">файлов</a>:</p> +<pre class="code"> +class Files { +public: + <a href="#File">File</a> item(int index); // возвращает файл с индексом index + int count(); // возвращает количество файлов в списке +} +</pre> + +<p id="File">Класс для работы с <a href="project_files.htm">файлом</a>:</p> +<pre class="code"> +class File { +public: + string name(); // возвращает название файла + string fileName(); // возвращает имя файла + int options(); // возвращает опции + void setName(string name); // устанавливает название файла + void setFileName(string name); // устанавливает имя файла + void setOptions(); // устанавлиает опции +} +</pre> + +<h3>Папки</h3> + +<p id="Folders">Класс для работы с пользовательскими папками:</p> +<pre class="code"> +class Folders { +public: + int count(); // возвращает количество папок в списке + <a href="#Folder">Folder</a> item(int index); // возвращает папку с индексом index + <a href="#Folder">Folder</a> add(string name); // добавляет новую папку + void clear(); // очищает список +}; +</pre> + +<p id="Folder">Класс для работы с пользовательской папкой:</p> +<pre class="code" id="Folder"> +class Folder { +public: + int count(); // возвращает количество подпапок + <a href="#Folder">Folder</a> item(int index); // возвращает подпапку с индексом index + <a href="#Folder">Folder</a> add(string name); // добавляет новую подпапку + string name(); // возвращает имя папки + void clear(); // очищает список подпапок + void destroy(); // уничтожает папку и все дочерние подпапки +}; +</pre> + +<h3>PE файлы</h3> + +<p id="PEFormat">Константы для работы с PE форматом:</p> +<pre class="code"> +enum PEFormat { + // Directory Entries + IMAGE_DIRECTORY_ENTRY_EXPORT, + IMAGE_DIRECTORY_ENTRY_IMPORT, + IMAGE_DIRECTORY_ENTRY_RESOURCE, + IMAGE_DIRECTORY_ENTRY_EXCEPTION, + IMAGE_DIRECTORY_ENTRY_SECURITY, + IMAGE_DIRECTORY_ENTRY_BASERELOC, + IMAGE_DIRECTORY_ENTRY_DEBUG, + IMAGE_DIRECTORY_ENTRY_ARCHITECTURE, + IMAGE_DIRECTORY_ENTRY_TLS, + IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG, + IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT, + IMAGE_DIRECTORY_ENTRY_IAT, + IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT, + IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR, + // Section characteristics + IMAGE_SCN_CNT_CODE, + IMAGE_SCN_CNT_INITIALIZED_DATA, + IMAGE_SCN_CNT_UNINITIALIZED_DATA, + IMAGE_SCN_MEM_DISCARDABLE, + IMAGE_SCN_MEM_NOT_CACHED, + IMAGE_SCN_MEM_NOT_PAGED, + IMAGE_SCN_MEM_SHARED, + IMAGE_SCN_MEM_EXECUTE, + IMAGE_SCN_MEM_READ, + IMAGE_SCN_MEM_WRITE, + // Resource types + RT_CURSOR, + RT_BITMAP, + RT_ICON, + RT_MENU, + RT_DIALOG, + RT_STRING, + RT_FONTDIR, + RT_FONT, + RT_ACCELERATOR, + RT_RCDATA, + RT_MESSAGETABLE, + RT_GROUP_CURSOR, + RT_GROUP_ICON, + RT_VERSION, + RT_DLGINCLUDE, + RT_PLUGPLAY, + RT_VXD, + RT_ANICURSOR, + RT_ANIICON, + RT_HTML, + RT_MANIFEST, + RT_DLGINIT, + RT_TOOLBAR +}; +</pre> + +<p id="PEFile">Класс для работы с PE файлом:</p> +<pre class="code"> +class PEFile { +public: + string name(); // возвращает имя файла + string format(); // возвращает имя формата "PE" + uint64 size(); // возвращает размер файла + int count(); // возвращает количество архитектур в списке + <a href="#PEArchitecture">PEArchitecture</a> item(int index); // возвращает архитектуру с индексом index + uint64 seek(uint64 offset); // устанавливает файловую позицию + uint64 tell(); // возвращает файловую позицию + int write(string buffer); // записывает буфер в файл +}; +</pre> + +<p id="PEArchitecture">Класс для работы с PE архитектурой:</p> +<pre class="code"> +class PEArchitecture { +public: + string name(); // возвращает имя архитектуры + <a href="#PEFile">PEFile</a> file(); // возвращает родительский файл + uint64 entryPoint(); // возвращает стартовый адрес + uint64 imageBase(); // возвращает стартовый адрес + <a href="#OperandSize">OperandSize</a> cpuAddressSize(); // возвращает битность архитектуры + uint64 size(); // возвращает размер архитектуры + <a href="#PESegments">PESegments</a> segments(); // возвращает список сегментов + <a href="#PESections">PESections</a> sections(); // возвращает список секций + <a href="#PEDirectories">PEDirectories</a> directories(); // возвращает список директорий + <a href="#PEImports">PEImports</a> imports(); // возвращает список импортируемых библиотек + <a href="#PEExports">PEExports</a> exports(); // возвращает список экспортируемых функций + <a href="#PEResources">PEResources</a> resources(); // возвращает список ресурсов + <a href="#PEFixups">PEFixups</a> fixups(); // возвращает список настраиваемых элементов + <a href="#MapFunctions">MapFunctions</a> mapFunctions(); // возвращает список доступных для защиты функций + <a href="#IntelFunctions">IntelFunctions</a> functions(); // возвращает список защищаемых функций + bool addressSeek(uint64 address); // устанавливает файловую позицию + uint64 seek(uint64 offset); // устанавливает файловую позицию + uint64 tell(); // возвращает файловую позицию + int write(string buffer); // записывает буфер в файл +}; +</pre> + +<p id="PESegments">Класс для работы cо списком сегментов для PE архитектуры:</p> +<pre class="code"> +class PESegments { +public: + <a href="#PESegment">PESegment</a> item(int index); // возвращает сегмент с индексом index + int count(); // возвращает количество сегментов в списке + <a href="#PESegment">PESegment</a> itemByAddress(uint64 address); // возвращает сегмент с адресом address +}; +</pre> + +<p id="PESegment">Класс для работы c сегментом для PE архитектуры:</p> +<pre class="code"> +class PESegment { +public: + uint64 address(); // возвращает адрес сегмента + string name(); // возвращает имя сегмента + uint64 size(); // возвращает размер сегмента + int physicalOffset(); // возвращает файловую позицию сегмента + int physicalSize(); // возвращает файловый размер сегмента + int flags(); // возвращает флаги сегмента + bool excludedFromPacking(); // возвращает признак "Исключен из упаковки" + void setName(string name); // устанавливает имя сегмента +}; +</pre> + +<p id="PESections">Класс для работы cо списком секций для PE архитектуры:</p> +<pre class="code"> +class PESections { +public: + <a href="#PESection">PESection</a> item(int index); // возвращает секцию с индексом index + int count(); // возвращает количество секций в списке + <a href="#PESection">PESection</a> itemByAddress(uint64 address); // возвращает секцию с адресом address +}; +</pre> + +<p id="PESection">Класс для работы с секцией для PE архитектуры:</p> +<pre class="code"> +class PESection { +public: + uint64 address(); // возвращает адрес секции + string name(); // возвращает имя секции + uint64 size(); // возвращает размер секции + int offset(); // возвращает файловую позицию секции + <a href="#PESegment">PESegment</a> segment(); // возвращает родительский сегмент +}; +</pre> + +<p id="PEDirectories">Класс для работы с директориями для PE архитектуры:</p> +<pre class="code"> +class PEDirectories { +public: + <a href="#PEDirectory">PEDirectory</a> item(int index); // возвращает директорию с индексом index + int count(); // возвращает количество директорий в списке + <a href="#PEDirectory">PEDirectory</a> itemByType(int type); // возвращает директорию с типом type +}; +</pre> + +<p id="PEDirectory">Класс для работы с директорией для PE архитектуры:</p> +<pre class="code"> +class PEDirectory { +public: + uint64 address(); // возвращает адрес директории + string name(); // возвращает имя директории + uint64 size(); // возвращает размер директории + int type(); // возвращает тип директории + void setAddress(uint64 address); // устанавливает адрес директории + void setSize(int size); // устанавливает размер директории + void clear(); // очищает адрес и размер директории +}; +</pre> + +<p id="PEImports">Класс для работы со списком импортируемых библиотек для PE архитектуры:</p> +<pre class="code"> +class PEImports { +public: + <a href="#PEImport">PEImport</a> item(int index); // возвращает библиотеку с индексом index + int count(); // возвращает количество библиотек в списке + <a href="#PEImport">PEImport</a> itemByName(string name); // возвращает библиотеку с именем name +}; +</pre> + +<p id="PEImport">Класс для работы с импортируемой библиотекой для PE архитектуры:</p> +<pre class="code"> +class PEImport { +public: + string name(); // возвращает имя библиотеки + <a href="#PEImportFunction">PEImportFunction</a> item(int index); // возвращает импортируемую функцию с индексом index + int count(); // возвращает количество импортируемых функций + void setName(string name); // устанавливает имя библиотеки +}; +</pre> + +<p id="PEImportFunction">Класс для работы с импортируемой функцией для PE архитектуры:</p> +<pre class="code"> +class PEImportFunction { +public: + uint64 address(); // возвращает адрес ячейки, в которую записывается адрес импортируемой функции + string name(); // возвращает имя импортируемой функции +}; +</pre> + +<p id="PEExports">Класс для работы со списком экспортируемых функций для PE архитектуры:</p> +<pre class="code"> +class PEExports { +public: + string name(); // возвращает имя библиотеки + void setName(string name); // устанавливает имя библиотеки + <a href="#PEExport">PEExport</a> item(int index); // возвращает экспортируемую функцию с индексом index + int count(); // возвращает количество экспортируемых функций в списке + void clear(); // очищает список + <a href="#PEExport">PEExport</a> itemByAddress(uint64 address); // возвращает экспортируемую функцию с адресом address + <a href="#PEExport">PEExport</a> itemByName(string name); // возвращает экспортируемую функцию с именем name +}; +</pre> + +<p id="PEExport">Класс для работы с экспортируемой функцией для PE архитектуры:</p> +<pre class="code"> +class PEExport { +public: + uint64 address(); // возвращает адрес экспортируемой функции + string name(); // возвращает имя экспортируемой функции + void setName(string name); // устанавливает имя экспортируемой функции + int ordinal(); // возвращает ординал экспортируемой функции + string forwardedName(); // возвращает имя функции, на которую перенаправлена экспортируемая функция + void destroy(); // уничтожает экспортируемую функцию +}; +</pre> + +<p id="PEResources">Класс для работы со списком ресурсов для PE архитектуры:</p> +<pre class="code"> +class PEResources { +public: + <a href="#PEResource">PEResource</a> item(int index); // возвращает ресурс с индексом index + int count(); // возвращает количество ресурсов в списке + void clear(); // очищает список + <a href="#PEResource">PEResource</a> itemByType(int type); // возвращает ресурс с типом type + <a href="#PEResource">PEResource</a> itemByName(string name); // возвращает ресурс с именем name +}; +</pre> + +<p id="PEResource">Класс для работы с ресурсом для PE архитектуры:</p> +<pre class="code"> +class PEResource { +public: + <a href="#PEResource">PEResource</a> item(int index); // возвращает ресурс с индексом index + int count(); // возвращает количество ресурсов в списке + void clear(); // очищает список + uint64 address(); // возвращает адрес ресурса + int size(); // возвращает размер ресурса + string name(); // возвращает имя ресурса + int type(); // возвращает тип ресурса + bool isDirectory(); // возвращает признак "Директория" + void destroy(); // уничтожает ресурс + <a href="#PEResource">PEResource</a> itemByName(string name); // возвращает ресурс с именем name + bool excludedFromPacking(); // возвращает признак "Исключен из упаковки" +}; +</pre> + +<p id="PEFixups">Класс для работы со списком настраиваемых элементов для PE архитектуры:</p> +<pre class="code"> +class PEFixups { +public: + <a href="#PEFixup">PEFixup</a> item(int index); // возвращает элемент с индексом index + int count(); // возвращает количество элементов в списке + <a href="#PEFixup">PEFixup</a> itemByAddress(uint64 address); // возвращает элемент с адресом address +}; +</pre> + +<p id="PEFixup">Класс для работы с настраиваемым элементом для PE архитектуры:</p> +<pre class="code"> +class PEFixup { +public: + uint64 address(); // возвращает адрес элемента +}; +</pre> + +<h3>Mach-O файлы</h3> + +<p id="MacFormat">Константы для работы с Mach-O форматом:</p> +<pre class="code"> +enum MacFormat { + // Load Command Types + LC_SEGMENT, + LC_SYMTAB, + LC_SYMSEG, + LC_THREAD, + LC_UNIXTHREAD, + LC_LOADFVMLIB, + LC_IDFVMLIB, + LC_IDENT, + LC_FVMFILE, + LC_PREPAGE, + LC_DYSYMTAB, + LC_LOAD_DYLIB, + LC_ID_DYLIB, + LC_LOAD_DYLINKER, + LC_PREBOUND_DYLIB, + LC_ROUTINES, + LC_SUB_FRAMEWORK, + LC_SUB_UMBRELLA, + LC_SUB_CLIENT, + LC_SUB_LIBRARY, + LC_TWOLEVEL_HINTS, + LC_PREBIND_CKSUM, + LC_LOAD_WEAK_DYLIB, + LC_SEGMENT_64, + LC_ROUTINES_64, + LC_UUID, + LC_RPATH, + LC_CODE_SIGNATURE, + LC_SEGMENT_SPLIT_INFO, + LC_REEXPORT_DYLIB, + LC_LAZY_LOAD_DYLIB, + LC_ENCRYPTION_INFO, + LC_DYLD_INFO, + LC_DYLD_INFO_ONLY, + LC_LOAD_UPWARD_DYLIB, + LC_VERSION_MIN_MACOSX, + // Section Types + SECTION_TYPE, + SECTION_ATTRIBUTES, + S_REGULAR, + S_ZEROFILL, + S_CSTRING_LITERALS, + S_4BYTE_LITERALS, + S_8BYTE_LITERALS, + S_LITERAL_POINTERS, + S_NON_LAZY_SYMBOL_POINTERS, + S_LAZY_SYMBOL_POINTERS, + S_SYMBOL_STUBS, + S_MOD_INIT_FUNC_POINTERS, + S_MOD_TERM_FUNC_POINTERS, + S_COALESCED, + S_GB_ZEROFILL, + S_INTERPOSING, + S_16BYTE_LITERALS, + S_DTRACE_DOF, + S_LAZY_DYLIB_SYMBOL_POINTERS, + SECTION_ATTRIBUTES_USR, + S_ATTR_PURE_INSTRUCTIONS, + S_ATTR_NO_TOC, + S_ATTR_STRIP_STATIC_SYMS, + S_ATTR_NO_DEAD_STRIP, + S_ATTR_LIVE_SUPPORT, + S_ATTR_SELF_MODIFYING_CODE, + S_ATTR_DEBUG, + SECTION_ATTRIBUTES_SYS, + S_ATTR_SOME_INSTRUCTIONS, + S_ATTR_EXT_RELOC, + S_ATTR_LOC_RELOC +}; +</pre> + +<p id="MacFile">Класс для работы с Mach-O файлом:</p> +<pre class="code"> +class MacFile { +public: + string name(); // возвращает имя файла + string format(); // возвращает имя формата "Mach-O" + uint64 size(); // возвращает размер файла + int count(); // возвращает количество архитектур в списке + <a href="#MacArchitecture">MacArchitecture</a> item(int index); // возвращает архитектуру с индексом index + uint64 seek(uint64 offset); // устанавливает файловую позицию + uint64 tell(); // возвращает файловую позицию + int write(string buffer); // записывает буфер в файл +}; +</pre> + +<p id="MacArchitecture">Класс для работы с Mach-O архитектурой:</p> +<pre class="code"> +class MacArchitecture { +public: + string name(); // возвращает имя архитектуры + <a href="#MacFile">MacFile</a> file(); // возвращает родительский файл + uint64 entryPoint(); // возвращает стартовый адрес + <a href="#OperandSize">OperandSize</a> cpuAddressSize(); // возвращает битность архитектуры + uint64 size(); // возвращает размер архитектуры + <a href="#MacSegments">MacSegments</a> segments(); // возвращает список сегментов + <a href="#MacSections">MacSections</a> sections(); // возвращает список секций + <a href="#MacCommands">MacCommands</a> commands(); // возвращает список загрузочных команд + <a href="#MacSymbols">MacSymbols</a> symbols(); // возвращает список символов + <a href="#MacImports">MacImports</a> imports(); // возвращает список импортируемых библиотек + <a href="#MacExports">MacExports</a> exports(); // возвращает список экспортируемых функций + <a href="#MacFixups">MacFixups</a> fixups(); // возвращает список настраиваемых элементов + <a href="#MapFunctions">MapFunctions</a> mapFunctions(); // возвращает список доступных для защиты функций + <a href="#IntelFunctions">IntelFunctions</a> functions(); // возвращает список защищаемых функций + bool addressSeek(uint64 address); // устанавливает файловую позицию + uint64 seek(uint64 offset); // устанавливает файловую позицию + uint64 tell(); // возвращает файловую позицию + int write(string buffer); // записывает буфер в файл +}; +</pre> + +<p id="MacSegments">Класс для работы cо списком сегментов для Mach-O архитектуры:</p> +<pre class="code"> +class MacSegments { +public: + <a href="#MacSegment">MacSegment</a> item(int index); // возвращает сегмент с индексом index + int count(); // возвращает количество сегментов в списке + <a href="#MacSegment">MacSegment</a> itemByAddress(); // возвращает сегмент с адресом address +}; +</pre> + +<p id="MacSegment">Класс для работы c сегментом для Mach-O архитектуры:</p> +<pre class="code" id="MacSegment"> +class MacSegment { +public: + uint64 address(); // возвращает адрес сегмента + string name(); // возвращает имя сегмента + uint64 size(); // возвращает размер сегмента + int physicalOffset(); // возвращает файловую позицию сегмента + int physicalSize(); // возвращает файловый размер сегмента + int flags(); // возвращает флаги сегмента + bool excludedFromPacking(); // возвращает признак "Исключен из упаковки" +}; +</pre> + +<p id="MacSections">Класс для работы cо списком секций для Mach-O архитектуры:</p> +<pre class="code"> +class MacSections { +public: + <a href="#MacSection">MacSection</a> item(int index); // возвращает секцию с индексом index + int count(); // возвращает количество секций в списке + <a href="#MacSection">MacSection</a> itemByAddress(uint64 address); // возвращает секцию с адресом address +}; +</pre> + +<p id="MacSection">Класс для работы c секцией для Mach-O архитектуры:</p> +<pre class="code"> +class MacSection { +public: + uint64 address(); // возвращает адрес секции + string name(); // возвращает имя секции + uint64 size(); // возвращает размер секции + int offset(); // возвращает файловую позицию секции + <a href="#MacSegment">MacSegment</a> segment(); // возвращает родительский сегмент +}; +</pre> + +<p id="MacCommands">Класс для работы cо списком загрузочных команд для Mach-O архитектуры:</p> +<pre class="code"> +class MacCommands { +public: + <a href="#MacCommand">MacCommand</a> item(int index); // возвращает команду с индексом index + int count(); // возвращает количество команд в списке + <a href="#MacCommand">MacCommand</a> itemByType(int type); // возвращает команду с типом type +}; +</pre> + +<p id="MacCommand">Класс для работы c загрузочной командой для Mach-O архитектуры:</p> +<pre class="code"> +class MacCommand { +public: + uint64 address(); // возвращает адрес команды + int type(); // возвращает тип команды + string name(); // возвращает имя команды + int size(); // возвращает размер команды +}; +</pre> + +<p id="MacSymbols">Класс для работы cо списком символов для Mach-O архитектуры:</p> +<pre class="code"> +class MacSymbols { +public: + <a href="#MacSymbol">MacSymbol</a> item(int index); // возвращает символ с индексом index + int count(); // возвращает количество символов в списке +}; +</pre> + +<p id="MacSymbol">Класс для работы c символом для Mach-O архитектуры:</p> +<pre class="code"> +class MacSymbol { +public: + uint64 value(); // возвращает значение символа + string name(); // возвращает имя символа +}; +</pre> + +<p id="MacImports">Класс для работы со списком импортируемых библиотек для Mach-O архитектуры:</p> +<pre class="code"> +class MacImports { +public: + <a href="#MacImport">MacImport</a> item(int index); // возвращает импортируемую библиотеку с индексом index + int count(); // возвращает количество импортируемых библиотек в списке + <a href="#MacImport">MacImport</a> itemByName(string name); // возвращает импортируемую библиотеку с именем name +}; +</pre> + +<p id="MacImport">Класс для работы с импортируемой библиотекой для Mach-O архитектуры:</p> +<pre class="code"> +class MacImport { +public: + string name(); // возвращает имя импортируемой библиотеки + <a href="#MacImportFunction">MacImportFunction</a> item(int index); // возвращает импортируемую функцию с индексом index + int count(); // возвращает количество импортируемых функций в списке + void setName(string name); // устанавливает имя импортируемой библиотеки +}; +</pre> + +<p id="MacImportFunction">Класс для работы с импортируемой функцией для Mach-O архитектуры:</p> +<pre class="code"> +class MacImportFunction { +public: + uint64 address(); // возвращает адрес ячейки, в которую записывается адрес импортируемой функции + string name(); // возвращает имя импортируемой функции +}; +</pre> + +<p id="MacExports">Класс для работы со списком экспортируемых функций для Mach-O архитектуры:</p> +<pre class="code"> +class MacExports { +public: + string name(); // возвращает имя библиотеки + <a href="#MacExport">MacExport</a> item(); // возвращает экспортируемую функцию с индексом index + int count(); // возвращает количество экспортируемых функций в списке + void clear(); // очищает список + <a href="#MacExport">MacExport</a> itemByAddress(uint64 address); // возвращает экспортируемую функцию с адресом address + <a href="#MacExport">MacExport</a> itemByName(string name); // возвращает экспортируемую функцию с именем name +}; +</pre> + +<p id="MacExport">Класс для работы с экспортируемой функцией для Mach-O архитектуры:</p> +<pre class="code"> +class MacExport { +public: + uint64 address(); // возвращает адрес экспортируемой функции + string name(); // возвращает имя экспортируемой функции + string forwardedName(); // возвращает имя функции, на которую перенаправлена экспортируемая функция + void destroy(); // уничтожает экспортируемую функцию +}; +</pre> + +<p id="MacFixups">Класс для работы со списком настраиваемых элементов для Mach-O архитектуры:</p> +<pre class="code"> +class MacFixups { +public: + <a href="#MacFixup">MacFixup</a> item(int index); // возвращает элемент с индексом index + int count(); // возвращает количество элементов в списке + <a href="#MacFixup">MacFixup</a> itemByAddress(uint64 address); // возвращает элемент с адресом address +}; +</pre> + +<p id="MacFixup">Класс для работы с настраиваемым элементом для Mach-O архитектуры:</p> +<pre class="code"> +class MacFixup { +public: + uint64 address(); // возвращает адрес элемента +}; +</pre> + +<h3>Функции</h3> + +<p id="MapFunctions">Класс для работы со списком функций:</p> +<pre class="code"> +class MapFunctions { +public: + <a href="#MapFunction">MapFunction</a> item(int index); // возвращает функцию с индексом index + int count(); // возвращает количество функций в списке + <a href="#MapFunction">MapFunction</a> itemByAddress(uint64 address); // возвращает функцию с адресом address + <a href="#MapFunction">MapFunction</a> itemByName(string name); // возвращает функцию с именем name +}; +</pre> + +<p id="ObjectType">Типы функций:</p> +<pre class="code"> +enum ObjectType { + Unknown, + Code, + Data, + Export, + Marker, + APIMarker, + Import, + String +}; +</pre> + +<p id="MapFunction">Класс для работы с функцией:</p> +<pre class="code"> +class MapFunction { +public: + uint64 address(); // возвращает адрес функции + string name(); // возвращает имя функции + <a href="#ObjectType">ObjectType</a> type(); // возвращает тип функции + <a href="#References">References</a> references(); // возвращает список ссылок +}; +</pre> + +<p id="References">Класс для работы со списком ссылок:</p> +<pre class="code"> +class References { +public: + <a href="#Reference">Reference</a> item(int index); // возвращает ссылку с индексом index + int count(); // возвращает количество ссылок в списке +}; +</pre> + +<p id="Reference">Класс для работы с ссылкой:</p> +<pre class="code"> +class Reference { +public: + uint64 address(); // возвращает адрес команды + uint64 operandAddress(); // возвращает адрес ссылки +}; +</pre> + +<h3>Функции Intel</h3> + +<p id="IntelFunctions">Класс для работы со списком функций Intel:</p> +<pre class="code"> +class IntelFunctions { +public: + <a href="#IntelFunction">IntelFunction</a> item(int index); // возвращает функцию с индексом index + int count(); // возвращает количество функций в списке + void clear(); // очищает список + <a href="#IntelFunction">IntelFunction</a> itemByAddress(uint64 address); // возвращает функцию с адресом address + <a href="#IntelFunction">IntelFunction</a> itemByName(string name); // возвращает функцию с именем name + <a href="#IntelFunction">IntelFunction</a> addByAddress(uint64 address, <a href="#CompilationType">CompilationType</a> type = ctVirtualization); + // добавляет новую функцию с адресом address и типом компиляции type +}; +</pre> + +<p id="CompilationType">Типы компиляции:</p> +<pre class="code"> +enum CompilationType { + None, + Virtualization, + Mutation, + Ultra +}; +</pre> + +<p id="IntelFunction">Класс для работы с функцией Intel:</p> +<pre class="code"> +class IntelFunction { +public: + uint64 address(); // возвращает адрес функции + string name(); // возвращает имя функции + <a href="#ObjectType">ObjectType</a> type(); // возвращает тип функции + <a href="#IntelCommand">IntelCommand</a> item(int index); // возвращает команду с индексом index + int count(); // возвращает количество команд в списке + <a href="#CompilationType">CompilationType</a> compilationType(); // возвращает тип компиляции + void setCompilationType(<a href="#CompilationType">CompilationType</a> value); // устанавливает тип компиляции + <a href="#CommandLinks">CommandLinks</a> links(); // возвращает список связей + <a href="#IntelCommand">IntelCommand</a> itemByAddress(uint64 address); // возвращает команду с адресом address + void destroy(); // уничтожает функцию + <a href="#Folder">Folder</a> folder(); // возвращает пользовательскую папку + void setFolder(<a href="#Folder">Folder</a> folder); // устанавливает пользовательскую папку +}; +</pre> + +<p id="IntelCommandType">Типы команд Intel:</p> +<pre class="code"> +enum IntelCommandType { + Unknown, Push, Pop, Mov, Add, Xor, Test, Lea, Ud0, Ret, Ssh, Crc, Call, Jmp, + Fstsw, Fsqrt, Fchs, Fstcw, Fldcw, Fild, Fist, Fistp, Fld, Fstp, Fst, Fadd, + Fsub, Fsubr, Fisub, Fisubr, Fdiv, Fcomp, Fmul, Repe, Repne, Rep, DB, DW, DD, DQ, + Movs, Cmps, Scas, Movzx, Movsx, Inc, Dec, Les, Lds, Lfs, Lgs, Lss, Xadd, Bswap, + Jxx, And, Sub, Stos, Lods, Nop, Xchg, Pushf, Popf, Sahf, Lahf, Shl, Shr, Sal, + Sar, Rcl, Rcr, Rol, Ror, Shld, Shrd, Loope, Loopne, Loop, Jcxz, In, Ins, Out, + Outs, Wait, Cbw, Cwde, Cdqe, Cwd, Cdq, Cqo, Clc, Stc, Cli, Sti, Cld, Std, Not, + Neg, Div, Imul, Idiv, Mul, Or, Adc, Cmp, Sbb, Pusha, Popa, Clflush, Pause, + Bound, Arpl, Daa, Das, Aaa, Aam, Aad, Aas, Enter, Leave, Int, Into, Iret, Set, + Cmov, Addpd, Addps, Addsd, Addss, Andpd, Andps, Andnpd, Andnps, Cmppd, Cmpps, + Cmpsd, Cmpss, Comisd, Comiss, Cvtdq2ps, Cvtpd2dq, Cvtdq2pd, Cvtpd2pi, Cvtps2pi, + Cvtpd2ps, Cvtps2pd, Cvtpi2pd, Cvtpi2ps, Cvtps2dq, Cvtsd2si, Cvtss2si, Cvtsd2ss, + Cvtss2sd, Cvttpd2pi, Cvttps2pi, Cvttpd2dq, Cvttps2dq, Cvttsd2si, Cvttss2si, + Divpd, Divps, Divsd, Divss, Maxpd, Maxps, Maxsd, Maxss, Minpd, Minps, Minsd, + Minss, Mulpd, Mulps, Mulsd, Mulss, Orpd, Orps, Movd, Movq, Movntq, Movapd, Movaps, + Movdqa, Movdqu, Movdq2q, Movq2dq, Movhlps, Movhpd, Movhps, Movlhps, Movlpd, + Movlps, Movmskpd, Movmskps, Movnti, Movntpd, Movntps, Movsd, Movss, Movupd, + Movups, Pmovmskb, Psadbw, Pshufw, Pshufd, Pshuflw, Pshufhw, Psubb, Psubw, Psubd, + Psubq, Psubsb, Psubsw, Psubusb, Psubusw, Paddb, Paddw, Paddd, Paddq, Paddsb, + Paddsw, Paddusb, Paddusw, Pavgb, Pavgw, Pinsrw, Pextrw, Pmaxsw, Pmaxub, Pminsw, + Pminub, Pmulhuw, Pmulhw, Pmullw, Pmuludq, Psllw, Pslld, Psllq, Pslldq, Psraw, + Psrad, Psrlw, Psrld, Psrlq, Psrldq, Punpcklbw, Punpcklwd, Punpckldq, Punpcklqdq, + Punpckhqdq, Packusdw, Pcmpgtb, Pcmpgtw, Pcmpgtd, Pcmpeqb, Pcmpeqw, Pcmpeqd, + Emms, Packsswb, Packuswb, Punpckhbw, Punpckhwd, Punpckhdq, Packssdw, Pand, + Pandn, Por, Pxor, Pmaddwd, Rcpps, Rcpss, Rsqrtss, Movsxd, Shufps, Shufpd, Sqrtpd, + Sqrtps, Sqrtsd, Sqrtss, Subpd, Subps, Subsd, Subss, Ucomisd, Ucomiss, Unpckhpd, + Unpckhps, Unpcklpd, Unpcklps, Xorpd, Xorps, Bt, Bts, Btr, Btc, Xlat, Cpuid, + Rsm, Bsf, Bsr, Cmpxchg, Cmpxchg8b, Hlt, Cmc, Lgdt, Sgdt, Lidt, Sidt, Smsw, Lmsw, + Invlpg, Lar, Lsl, Clts, Invd, Wbinvd, Ud2, Wrmsr, Rdtsc, Rdmsr, Rdpmc, Fcom, + Fdivr, Fiadd, Fimul, Ficom, Ficomp, Fidiv, Fidivr, Faddp, Fmulp, Fsubp, Fsubrp, + Fdivp, Fdivrp, Fbld, Fbstp, Ffree, Frstor, Fsave, Fucom, Fucomp, Fldenv, Fstenvm, + Fxch, Fabs, Fxam, Fld1, Fldl2t, Fldl2e, Fldpi, Fldlg2, Fldln2, Fldz, Fyl2x, + Fptan, Fpatan, Fxtract, Fprem1, Fdecstp, Fincstp, Fprem, Fyl2xp1, Fsincos, Frndint, + Fscale, Fsin, Fcos, Ftst, Fstenv, F2xm1, Fnop, Finit, Fclex, Fcompp, Sysenter, + Sysexit, Sldt, Str, Lldt, Ltr, Verr, Verw, Sfence, Lfence, Mfence, Prefetchnta, + Prefetcht0, Prefetcht1, Prefetcht2, Prefetch, Prefetchw, Fxrstor, Fxsave, Ldmxcsr, + Stmxcsr, Fcmovb, Fcmove, Fcmovbe, Fcmovu, Fcmovnb, Fcmovne, Fcmovnbe, Fcmovnu, + Fucomi, Fcomi, Fucomip, Fcomip, Fucompp, Vmcall, Vmlaunch, Vmresume, Vmxoff, + Monitor, Mwait, Xgetbv, Xsetbv, Vmrun, Vmmcall, Vmload, Vmsave, Stgi, Clgi, + Skinit, Invlpga, Swapgs, Rdtscp, Syscall, Sysret, Femms, Getsec, Pshufb, Phaddw, + Phaddd, Phaddsw, Pmaddubsw, Phsubw, Phsubd, Phsubsw, Psignb, Psignw, Psignd, + Pmulhrsw, Pabsb, Pabsw, Pabsd, Movbe, Palignr, Rsqrtps, Vmread, Vmwrite, Svldt, + Rsldt, Svts, Rsts, Xsave, Xrstor, Vmptrld, Vmptrst, Maskmovq, Fnstenv, Fnstcw, + Fstp1, Fneni, Fndisi, Fnclex, Fninit, Fsetpm, Fisttp, Fnsave, Fnstsw, Fxch4, + Fcomp5, Ffreep, Fxch7, Fstp8, Fstp9, Haddpd, Hsubpd, Addsubpd, Addsubps, Movntdq, + Fcom2, Fcomp3, Haddps, Hsubps, Movddup, Movsldup, Cvtsi2sd, Cvtsi2ss, Movntsd, + Movntss, Lddqu, Movshdup, Popcnt, Tzcnt, Lzcnt, Pblendvb, Pblendps, Pblendpd, + Ptest, Movsxbw, Movsxbd, Movsxbq, Movsxwd, Movsxwq, Movsxdq, Muldq, Pcmpeqq, + Movntdqa, Xsaveopt, Maskmovdqu, Ud1, Pcmpgtq, Movzxbw, Movzxbd, Movzxbq, Movzxwd, + Movzxwq, Movzxdq +}; +</pre> + +<p id="IntelSegment">Сегменты Intel:</p> +<pre class="code"> +enum IntelSegment { + None, + es, + cs, + ss, + ds, + fs, + gs +}; +</pre> + +<p id="IntelFlag">Флаги Intel:</p> +<pre class="code"> +enum IntelFlag { + C, + P, + A, + Z, + S, + T, + I, + D, + O +}; +</pre> + +<p id="IntelRegistr">Регистры Intel:</p> +<pre class="code"> +enum IntelRegistr { + eax, + ecx, + edx, + ebx, + esp, + ebp, + esi, + edi, + r8, + r9, + r10, + r11, + r12, + r13, + r14, + r15 +}; +</pre> + +<p id="IntelCommand">Класс для работы с командой Intel:</p> +<pre class="code"> +class IntelCommand { +public: + uint64 address(); // возвращает адрес команды + <a href="#IntelCommandType">IntelCommandType</a> type(); // возвращает тип команды + string text(); // возвращает текстовое представление + int size(); // возвращает размер команды + int dump(int index); // возвращает данные команды по индексу index + <a href="#CommandLink">CommandLink</a> link(); // возвращает связь команды + int flags(); // возвращает флаги команды + <a href="#IntelSegment">IntelSegment</a> baseSegment(); // возвращает базовый сегмент + <a href="#IntelCommandType">IntelCommandType</a> preffix(); // возвращает тип преффиксной команды + <a href="#IntelOperand">IntelOperand</a> operand(int index); // возвращает операнд с индексом index +}; +</pre> + +<p id="OperandType">Типы операндов:</p> +<pre class="code"> +enum OperandType { + None, + Value, + Registr, + Memory, + SegmentRegistr, + ControlRegistr, + DebugRegistr, + FPURegistr, + HiPartRegistr, + BaseRegistr, + MMXRegistr, + XMMRegistr +}; +</pre> + +<p id="OperandSize">Размеры операндов:</p> +<pre class="code"> +enum OperandSize { + Byte, + Word, + DWord, + QWord, + TByte, + OWord, + FWord +}; +</pre> + +<p id="IntelOperand">Класс для работы с операндом команды Intel:</p> +<pre class="code"> +class IntelOperand { +public: + int type(); // возвращает тип операнда + <a href="#OperandSize">OperandSize</a> size(); // возвращает размер операнда + int registr(); // возвращает регистр + int baseRegistr(); // возвращает базовый регистр + int scale(); // возвращает коэффициент + uint64 value(); // возвращает значение +}; +</pre> + +<p id="CommandLinks">Класс для работы со списком связей:</p> +<pre class="code" id="CommandLinks"> +class CommandLinks { +public: + <a href="#CommandLink">CommandLink</a> item(int index); // возвращает связь с индексом index + int count(); // возвращает количество связей в списке +}; +</pre> + +<p id="LinkType">Типы связей:</p> +<pre class="code"> +enum LinkType { + None, + SEHBlock, + FinallyBlock, + DualSEHBlock, + FilterSEHBlock, + Jmp, + JmpWithFlag, + JmpWithFlagNSFS, + JmpWithFlagNSNA, + JmpWithFlagNSNS, + Call, + Case, + Switch, + Native, + Offset, + GateOffset, + ExtSEHBlock, + MemSEHBlock, + ExtSEHHandler, + VBMemSEHBlock +}; +</pre> + +<p id="CommandLink">Класс для работы со связью команды:</p> +<pre class="code"> +class CommandLink { +public: + uint64 toAddress(); // возвращает адрес, на который ссылается связь + <a href="#LinkType">LinkType</a> type(); // возвращает тип связи + <a href="#IntelCommand">IntelCommand</a> from(); // возвращает родительскую команду +}; +</pre> + +<p id="FFILibrary">Класс для работы с библиотекой:</p> +<pre class="code"> +enum ParamType { + "void", + "byte", + "char", + "short", + "ushort", + "int", + "uint", + "long", + "ulong", + "size_t", + "float", + "double", + "string", + "pointer" +}; + +enum CallType { + "default", + "cdecl", + "stdcall" +}; + +class FFILibrary { +public: + string name(); // возвращает имя + uint64 address(); // возвращает адрес в памяти + void close(); + FFIFunction getFunction(string name, ParamType ret, ParamType param1, ...); // возвращает функцию + FFIFunction getFunction(string name, table (ParamType ret, CallType abi, ParamType, ...)); // возвращает функцию +}; +</pre> + +<p id="FFIFunction">Класс для работы с внешней функцией:</p> +<pre class="code"> +class FFIFunction { + string name(); // возвращает имя + uint64 address(); // возвращает адрес в памяти +}; +</pre> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html>
\ No newline at end of file diff --git a/help/ru/script_events.htm b/help/ru/script_events.htm new file mode 100644 index 0000000..9022dc0 --- /dev/null +++ b/help/ru/script_events.htm @@ -0,0 +1,91 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>События</title> +</head> + +<body> + <h1>События</h1> + + <p>Встроенный скриптовый язык является эффективным инструментом + автоматизации создания защищенных приложений с помощью VMProtect. + Вызов процедур и функций, необходимых на разных этапах создания + защищаемого файла, осуществляется через события, обрабатываемые + ядром VMProtect. При создании скриптов можно установить + собственные обработчики для 5-ти событий, которые вызываются + ядром протектора в следующем порядке:</p> + + <ul> + <li><a href="#OnBeforeCompilation">OnBeforeCompilation</a></li> + <li><a href="#OnBeforeSaveFile">OnBeforeSaveFile</a></li> + <li><a href="#OnBeforePackFile">OnBeforePackFile</a></li> + <li><a href="#OnAfterSaveFile">OnAfterSaveFile</a></li> + <li><a href="#OnAfterCompilation">OnAfterCompilation</a></li> + </ul> + <a name="OnBeforeCompilation"/><pre class="code">function OnBeforeCompilation() + +end</pre> + + <p>Событие вызывается на этапе формирования списка защищаемых + объектов. В обработчике OnBeforeCompilation можно добавить в + проект новые процедуры, а также изменить или удалить уже + существующие.</p> + <a name="OnBeforeSaveFile"/><pre class="code">function OnBeforeSaveFile() + +end</pre> + + <p>Событие вызывается перед записью в выходной файл всех объектов, созданных в + результате компиляции. В обработчике события + OnBeforeSaveFile можно изменить как сам файл, так и некоторые его + свойства (например, список ресурсов, список экспортируемых + функций, имена секций и т.д.), которые впоследствии будут + автоматически записаны в выходной файл.</p> + + <a name="OnBeforePackFile"/><pre class="code">function OnBeforePackFile() + +end</pre> + + <p>Событие вызывается перед упаковкой защищенного файла + приложения. Используя OnBeforePackFile можно внести изменения в + файл, который будет упакован. Данное событие вызывается только + при использовании опции "Упаковать выходной файл".</p> + + <a name="OnAfterSaveFile"/><pre class="code">function OnAfterSaveFile() + +end</pre> + + <p>Событие вызывается после записи всех объектов, созданных в + результате компиляции, в выходной файл. В обработчике события + можно добавить в выходной файл новые данные или изменить ранее + записанные.</p> + + <a name="OnAfterCompilation"/><pre class="code">function OnAfterCompilation() + +end</pre> + + <p>Событие вызывается после компиляции всех объектов, входящих в + проект. На данном этапе пользователю доступен откомпилированный + файл, над которым могут быть выполнены любые необходимые + действия, например добавление электронной подписи + (сертификата).</p><br/> + + <p>При написании обработчиков событий можно создавать собственные + процедуры и функции. Имена событий отображаются в редакторе + скрипта жирным шрифтом.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/script_functions.htm b/help/ru/script_functions.htm new file mode 100644 index 0000000..9b27aee --- /dev/null +++ b/help/ru/script_functions.htm @@ -0,0 +1,53 @@ +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Встроенные функции</title> +</head> + +<body> + <h1>Встроенные функции</h1> + + <p>Помимо методов и свойств классов скриптового языка + пользователю VMProtect доступны функции, дающие возможность + выполнить ряд основных операций. Среди этих функций присутствуют + как общесистемные функции, позволяющие работать со строками, + датами и числами, использовать командную строку программы, + выводить различные сообщения и т.д., так и специализированные + функции, позволяющие работать с ядром VMProtect и водяными + знаками:</p> + + <ul> + <li><a href="http://www.lua.org/manual/5.2/manual.html#6.4">string</a></li> + <li><a href="http://www.lua.org/manual/5.2/manual.html#6.5">table</a></li> + <li><a href="http://www.lua.org/manual/5.2/manual.html#6.6">math</a></li> + <li><a href="http://www.lua.org/manual/5.2/manual.html#6.7">bit32</a></li> + <li><a href="http://www.lua.org/manual/5.2/manual.html#6.8">io</a></li> + <li><a href="http://www.lua.org/manual/5.2/manual.html#6.9">os</a></li> + <li><a href="#VMProtect">vmprotect</a></li> + </ul> + <a name="VMProtect"></a> + <pre class="code"> +namespace vmprotect { + <a href="script_classes.htm#Core">Core</a> core(); // возвращает ядро VMProtect + string extractFilePath(string name); // извлекает путь файла + string extractFileName(string name); // извлекает имя файла + string extractFileExt(string name); // извлекает расширение файла + table commandLine(); // возвращает командную строку + <a href="script_classes.htm#FFILibrary">FFILibrary</a> openLib(string name); // открывает библиотеку +}; +</pre> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/sdk_functions.htm b/help/ru/sdk_functions.htm new file mode 100644 index 0000000..fb00684 --- /dev/null +++ b/help/ru/sdk_functions.htm @@ -0,0 +1,205 @@ +<!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>Функции SDK</title> +</head> + +<body> + <h1>Функции SDK</h1> + + <p>Функции SDK предназначены для интеграции в исходный код + защищаемого приложения и служат для задания границ защищаемых + областей, обнаружения использования средств отладки или + виртуализации.</p> + + <p><strong>Маркеры кода</strong></p> + + <ul> + <li><a href="#VMProtectBegin">VMProtectBegin</a></li> + <li><a href="#VMProtectBeginVirtualization">VMProtectBeginVirtualization</a></li> + <li><a href="#VMProtectBeginMutation">VMProtectBeginMutation</a></li> + <li><a href="#VMProtectBeginUltra">VMProtectBeginUltra</a></li> + <li><a href="#VMProtectBeginVirtualizationLockByKey">VMProtectBeginVirtualizationLockByKey</a></li> + <li><a href="#VMProtectBeginUltraLockByKey">VMProtectBeginUltraLockByKey</a></li> + <li><a href="#VMProtectEnd">VMProtectEnd</a></li> + </ul> + + <p><strong>Сервисные функции</strong></p> + + <ul> + <li><a href="#VMProtectIsProtected">VMProtectIsProtected</a></li> + <li><a href="#VMProtectIsDebuggerPresent">VMProtectIsDebuggerPresent</a></li> + <li><a href="#VMProtectIsVirtualMachinePresent">VMProtectIsVirtualMachinePresent</a></li> + <li><a href="#VMProtectIsValidImageCRC">VMProtectIsValidImageCRC</a></li> + <li><a href="#VMProtectDecryptStringA">VMProtectDecryptStringA</a></li> + <li><a href="#VMProtectDecryptStringW">VMProtectDecryptStringW</a></li> + <li><a href="#VMProtectFreeString">VMProtectFreeString</a></li> + </ul> + + <p><strong>Функции лицензирования</strong></p> + + <ul> + <li><a href="manager/usage/api.htm">VMProtectSetSerialNumber</a></li> + <li><a href="manager/usage/api.htm">VMProtectGetSerialNumberState</a></li> + <li><a href="manager/usage/api.htm">VMProtectGetSerialNumberData</a></li> + <li><a href= "manager/usage/api.htm">VMProtectGetCurrentHWID</a></li> + </ul> + + <p id="VMProtectBegin"><strong>VMProtectBegin</strong></p> + <pre class="code">void VMProtectBegin(const char *MarkerName); +</pre> + + <p><a href="use_markers.htm">Маркер</a> начала защищаемой области + кода. Вызов VMProtectBegin должен находиться перед первой + командой (вызовом процедуры, функции) защищаемого блока кода. + MarkerName задает имя маркера, которое в VMProtect будет иметь + вид "VMProtectMarker"+MarkerNamе. Например, маркер + VMProtectBegin('CheckRegistration') будет выглядеть как + VMProtectMarker "CheckRegistration". Если имя маркера не задано, + ему будет присвоено уникальное имя вида "VMProtectMarker"+номер + маркера по порядку. <a href= + "project_functions.htm#CompilationTypes">Тип компиляции</a> + защищаемой области задается при обработке проекта в + VMProtect.</p> + + <p id="VMProtectBeginVirtualization"><strong>VMProtectBeginVirtualization</strong></p> + <pre class="code">void VMProtectBeginVirtualization(const char *MarkerName); +</pre> + + <p>Маркер начала защищаемой области кода с предустановленным + типом компиляции "виртуализация". MarkerName задает <a href="#VMProtectBegin">имя маркера</a>. + При дальнейшей работе с VMProtect тип + компиляции, заданный маркером, изменить нельзя.</p> + + <p id="VMProtectBeginMutation"><strong>VMProtectBeginMutation</strong></p> + <pre class="code">void VMProtectBeginMutation(const char *MarkerName); +</pre> + + <p>Маркер начала защищаемой области кода с предустановленным + типом компиляции "мутация". MarkerName задает <a href="#VMProtectBegin">имя маркера</a>. + При дальнейшей работе с VMProtect тип компиляции, + заданный маркером изменить, нельзя.</p> + + <p id="VMProtectBeginUltra"><strong>VMProtectBeginUltra</strong></p> + <pre class="code">void VMProtectBeginUltra(const char *MarkerName); +</pre> + + <p>Маркер начала защищаемой области кода с предустановленным + типом компиляции "ультра (мутация + виртуализация)". MarkerName + задает <a href="#VMProtectBegin">имя маркера</a>. При дальнейшей работе с + VMProtect тип компиляции, заданный маркером, изменить + нельзя.</p> + + <p id="VMProtectBeginVirtualizationLockByKey"><strong>VMProtectBeginVirtualizationByKey</strong></p> + <pre class="code">void VMProtectBeginVirtualizationLockByKey(const char *MarkerName); +</pre> + + <p>Маркер начала защищаемой области кода с предустановленным + типом компиляции "виртуализация" и опцией "<a href= + "project_functions.htm#LockToKey">Привязать к ключу</a>". + MarkerName задает <a href="#VMProtectBegin">имя маркера</a>. При + дальнейшей работе с VMProtect тип компиляции, заданный маркером, + изменить нельзя.</p> + + <p id="VMProtectBeginUltraLockByKey"><strong>VMProtectBeginUltraLockByKey</strong></p> + <pre class="code">void VMProtectBeginUltraLockByKey(const char *MarkerName); +</pre> + + <p>Маркер начала защищаемой области кода с предустановленным + типом компиляции "ультра (мутация + виртуализация)" и опцией + "<a href="project_functions.htm#LockToKey">Привязать к + ключу</a>". MarkerName задает <a href="#VMProtectBegin">имя маркера</a>. + При дальнейшей работе с VMProtect тип компиляции, заданный + маркером, изменить нельзя.</p> + + <p id="VMProtectEnd"><strong>VMProtectEnd</strong></p> + <pre class="code">void VMProtectEnd(void); +</pre> + + <p>Маркер конца защищаемой области кода. Вызов VMProtectEnd + должен находиться после последней команды (вызова процедуры, + функции) защищаемого блока кода.</p> + + <p id="VMProtectIsProtected"><strong>VMProtectIsProtected</strong></p> + <pre class="code">bool VMProtectIsProtected(void); +</pre> + + <p>Функция MProtectIsProtected возвращает True если файл обработан VMProtect.</p> + + <p id="VMProtectIsDebuggerPresent"><strong>VMProtectIsDebuggerPresent</strong></p> + <pre class="code">bool VMProtectIsDebuggerPresent(bool CheckKernelMode); +</pre> + + <p>Функция VMProtectIsDebuggerPresent позволяет определить факт + запуска приложения из-под отладчика. Результат ее работы + (True/False) может быть обработан с помощью защитных механизмов, + встроенных в приложение. При CheckKernelMode=False функция + проверяет наличие отладчика User-mode (OllyDBG, WinDBG и т.п.). + При CheckKernelMode=True будет производиться определение как + отладчиков User-mode, так и отладчиков Kernel-mode (SoftICE, + Syser и т.п.). При защите драйверов значение CheckKernelMode не + имеет значения, так как драйвера работают в режиме ядра, поэтому + для них всегда проверяется наличие отладчиков + Kernel-mode.</p> + + <p id="VMProtectIsVirtualMachinePresent"><strong>VMProtectIsVirtualMachinePresent</strong></p> + <pre class="code">bool VMProtectIsVirtualMachinePresent(void); +</pre> + + <p>Функция VMProtectIsVirtualMachinePresent позволяет определить + факт запуска приложения в виртуальной среде: VMware, Virtual PC, + VirtualBox, Sandboxie. Результат ее работы (True/False) может + быть обработан с помощью защитных механизмов, встроенных в + приложение.</p> + + <p id="VMProtectIsValidImageCRC"><strong>VMProtectIsValidImageCRC</strong></p> + <pre class="code">bool VMProtectIsValidImageCRC(void); +</pre> + + <p>Функция VMProtectIsValidImageCRC позволяет определить факт + изменения защищенного модуля в памяти процесса (проверяются только неизменяемые сегменты кода и данных). + Результат ее работы (True/False) может быть обработан с помощью защитных механизмов, встроенных в + приложение.</p> + + <p id="VMProtectDecryptStringA"><strong>VMProtectDecryptStringA</strong></p> + <pre class="code">const char * VMProtectDecryptStringA(const char *Value); +</pre> + + <p>Функция VMProtectDecryptStringA позволяет дешифровать + строковую ANSI константу Value. Для шифрации константы её + необходимо <a href="project_functions.htm#AddFunction">включить + в список защищаемых объектов</a>.</p> + + <p id="VMProtectDecryptStringW"><strong>VMProtectDecryptStringW</strong></p> + <pre class="code">const wchar_t * VMProtectDecryptStringW(const wchar_t *Value); +</pre> + + <p>Функция VMProtectDecryptStringW позволяет дешифровать + строковую Unicode константу Value. Для шифрации константы её + необходимо <a href="project_functions.htm#AddFunction">включить + в список защищаемых объектов</a>.</p> + + <p id="VMProtectFreeString"><strong>VMProtectFreeString</strong></p> + <pre class="code">bool VMProtectFreeString(const void *Value); +</pre> + + <p>Функция VMProtectFreeString освобождает динамическую память, занятую расшифрованной строкой. Освобождение делать не обязательно, но если делать - то только этой функцией. + Повторное использование VMProtectDecryptStringA/VMProtectDecryptStringW с тем же параметром и без уничтожения ранее + расшифрованной строки не будет приводить к дополнительному выделению памяти.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/software_protection.htm b/help/ru/software_protection.htm new file mode 100644 index 0000000..6a3a482 --- /dev/null +++ b/help/ru/software_protection.htm @@ -0,0 +1,126 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Изучение, взлом и защита программного обеспечения</title> +</head> + +<body> + <h1>Изучение, взлом и защита программного обеспечения</h1> + + <p>Изучение программного продукта может осуществляться методом + статического и/или динамического анализа. При статическом анализе + разработка алгоритма взлома защиты производится на основе анализа + результатов дизассемблирования или декомпиляции взламываемой + программы. Динамический анализ чаще всего применяют при взломе + программных продуктов, исполняемый код которых зашифрован или + динамически изменяется, так как статический анализ подобных + программ сопряжен с определенными трудностями.</p> + + <p>Для динамического анализа взламываемую программу запускают в + среде отладчика, при этом становится возможным контроль всех + изменений, возникающих в процессе функционирования приложения. В + процессе динамического анализа, используя режим отладки, + производят пошаговое прохождение "защитных" алгоритмов программы, + в частности алгоритмов проверки и генерации корректного + регистрационного кода. Еще одним средством, применяемым при + динамическом анализе, являются мониторы активности, отслеживающие + обращение взламываемой программы к файлам, системным сервисам, + портам и внешним устройствам.</p> + + <p>Основным инструментом, применяемым для защиты приложений от + взлома, являются <a href= + "dictionary.htm#Protector">программы-протекторы</a>. Защита, + реализуемая большинством протекторов, заключается в том, что они + <a href="dictionary.htm#Pack">упаковывают</a> и/или <a href= + "dictionary.htm#Crypt">шифруют</a> исходный исполняемый файл, + уделяя основное внимание защите процедуры распаковки/расшифровки + файла.</p> + + <p>Подобный алгоритм работы протекторов очень часто оказывается + причиной недостаточной степени защиты обеспечиваемой большинством + из них. В случае если приложение защищено с использованием + упаковки, по окончании работы распаковщика в распоряжении + злоумышленника может оказаться исходный файл, который может быть + получен при дампе определенной области памяти. Более того, для + борьбы с самыми распространенными протекторами взломщики + разработали множество программных инструментов, позволяющих + взламывать защиту в автоматическом режиме. Аналогичный подход + применяется при борьбе с шифрованием: после получения + лицензионного ключа, который в том числе может быть легально + приобретен, взломщик сможет расшифровать защищенные участки + кода.</p> + + <p>Ряд программ-протекторов применяют различные антиотладочные + приемы. Однако применение антиотладки значительно снижает + быстродействие программы. Также следует помнить, что + антиотладочные приемы действенны лишь против динамического + анализа и совершенно не эффективны против статического. Более + того, все антиотладочные приемы, применяемые в современных + протекторах, уже давно изучены, а взломщиками написано множество + утилит, которые их полностью нейтрализуют. На эффективность + использования мониторов активности встроенные в приложение + средства защиты от отладки не влияют.</p> + + <p>Более эффективными методами защиты приложения являются + <a href="dictionary.htm#Obfuscation">обфускация</a> и <a href= + "dictionary.htm#Virtualization">виртуализация</a>, усложняющие + анализ кода защищаемого приложения. В общем случае эффективность + данных методов достигается за счет использования особенностей + человеческого фактора - чем сложнее исходный код, чем больше + ресурсов использует приложение, тем человеку его анализирующему + тяжелее понять логику работы программы, а следовательно, и + взломать примененные средства защиты.</p> + + <p>При обфускации производится запутывание кода приложения за + счет введения дополнительных инструкций. При виртуализации + исходный код преобразуется в <a href= + "dictionary.htm#ByteCode">байт-код</a>, выполнение которого + осуществляется на специальном интерпретаторе, имитирующем + виртуальную машину со специфической системой команд. + Следовательно, применение виртуализации приводит к высокой и + неснижаемой степени запутанности результирующего кода, а при + определенном подходе к реализации этого метода защищенный код не + содержит методов восстановления оригинального кода в явном виде. + Таким образом, важнейшим преимуществом виртуализации является то, + что в момент выполнения виртуализированного участка кода не + происходит его обратного преобразования в машинные коды + процессора, а это исключает возможность получения взломщиком + оригинального кода приложения.</p> + + <p>Задача обратного инжиниринга виртуализированных фрагментов + сводится к изучению архитектуры <a href= + "dictionary.htm#VirtualMachine">виртуальной машины</a>, созданию + дизассемблера, соответствующего архитектуре имитируемого + виртуальной машиной процессора, и анализу дизассемблированного + кода. При определенном подходе к реализации виртуальной машины + задача создания дизассемблера виртуализированного кода становится + достаточно трудоемкой. Единственным недостатком виртуализации + является сравнительно низкая скорость работы, поэтому этот метод + следует применять только для защиты участков кода, некритичных к + скорости исполнения.</p> + + <p>В подавляющем большинстве современных протекторов методы + обфускации и виртуализации играют второстепенную роль, а уровень + их реализации недостаточен, что позволяет взломщикам выполнять + снятие подобной защиты в автоматизированном или ручном режиме. + Еще одним слабым местом многих современных протекторов является + использование недокументированных функций Windows, что создает + ограничения для использования приложения в новых версиях + операционной системы или при включенном режиме DEP.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/terms.htm b/help/ru/terms.htm new file mode 100644 index 0000000..8d96a49 --- /dev/null +++ b/help/ru/terms.htm @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" + "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + <meta name="AppleIcon" content="VMProtect.help/logo.png" /> + <meta name="AppleTitle" content="VMProtect 3.0 Help" /> + + <title>Введение</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {align:center} + hr.c1 {height:1px;border-width:0;color:gray;background-color:gray} + /*]]>*/ + </style> +</head> + +<body> + <h1>Введение</h1> + + <p>Идеального способа защиты программного обеспечения от + несанкционированного использования и распространения не + существует. Ни одна существующая система не обеспечит абсолютную + защиту и не лишит потенциального взломщика самой возможности ее + нейтрализации. Однако использование качественной и эффективной + защиты может максимально усложнить процесс взлома программного + продукта, более того, сделать взлом нецелесообразным с точки + зрения потраченного на это времени и усилий. При создании защиты + программного продукта могут преследоваться различные цели и + решаться разнообразные задачи, однако основа любой схемы защиты - + защита приложения от изучения, так как именно устойчивость к + обратной инженерии определяет эффективность защиты в целом.</p> + + <ul> + <li><a href="dictionary.htm">Словарь терминов</a></li> + + <li><a href="software_protection.htm">Изучение, взлом и + защита программного обеспечения</a></li> + + <li><a href="about_vmprotect.htm">Что такое + VMProtect?</a></li> + + <li><a href="recommendations.htm">Рекомендации по + защите</a></li> + </ul> + + <div class=unhide_if_no_site style="visibility:hidden"> + <h2>См. также</h2> + + <ul> + <li><a href="http://vmpsoft.com/support/user-manual-v3/">Версию + этого руководства на сайте (самую актуальную)</a></li> + </ul> + </div> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/toolbar.htm b/help/ru/toolbar.htm new file mode 100644 index 0000000..2ff8dae --- /dev/null +++ b/help/ru/toolbar.htm @@ -0,0 +1,39 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Панель инструментов</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Панель инструментов</h1> + + <p>Панель инструментов состоит из следующих элементов:</p> + + <ul> + <li>Открытие проекта или защищаемого файла: <img src="images/button_open.png" /></li> + <li>Cохранение проекта: <img src="images/button_save.png" /></li> + <li>Название защищаемого файла: <br /> <img src="images/button_project.png" /></li> + <li>Компиляция проекта: <img src="images/button_compilation.png" /></li> + <li>Запуск оригинального/защищенного файла (нажатием на стрелочку можно задать параметры командной строки): <img src="images/button_execute.png" /></li> + <li>Часто используемая операция (зависит от выбранного раздела): <br /><img src="images/button_action.png" /></li> + <li>Cтрока быстрого поиска: <br /><img src="images/button_search.png" /></li> + </ul> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/use_map_file.htm b/help/ru/use_map_file.htm new file mode 100644 index 0000000..88c0fce --- /dev/null +++ b/help/ru/use_map_file.htm @@ -0,0 +1,55 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Использование MAP-файла</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Использование MAP-файла</h1> + + <p>Для создания MAP-файла необходимо включить соответствующую + опцию в настройках компилятора.</p> + + <h3>Visual Studio</h3> + + <p>Если для разработки приложения используется Visual Studio, эту + операцию выполняют следующим образом: используя главное меню IDE + Visual Studio, входят в свойства проекта (Project - Properties), + где на вкладке "Linker - Debugging" переводят переключатель + "Generate MAP File" в положение "Yes (/MAP)":</p> + <p><img src="images/visual_studio_map.png" /></p> + + <h3>Borland Delphi</h3> + + <p>Если для разработки приложения используется Borland Delphi, + эту операцию выполняют следующим образом: используя главное меню + IDE Delphi, входят в свойства проекта (Project - Options), где на + вкладке "Linker" переводят переключатель секции "MAP file" в + положение "Detailed":</p> + <p><img src="images/delphi_map.png" /></p> + + <p>После включения генерации MAP-файла необходимо полностью + перекомпилировать проект.</p> + + <p>При загрузке MAP-файла VMProtect сравнивает дату и время + модификации защищаемого файла и MAP-файла, и в случае их отличия + MAP-файл не будет загружен.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/use_markers.htm b/help/ru/use_markers.htm new file mode 100644 index 0000000..d86c80f --- /dev/null +++ b/help/ru/use_markers.htm @@ -0,0 +1,134 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Использование маркеров</title> + <style type="text/css"> +/*<![CDATA[*/ + div.c2 {text-align: center} + /*]]>*/ + </style> +</head> + +<body> + <h1>Использование маркеров</h1> + + <p>Для защиты отдельных участков кода, а также для защиты + строковых констант в текст программы вставляют маркеры, которые + представляют собой вызов импортируемых процедур, находящихся во + внешней DLL-библиотеке (для 32-разрядных приложений используется + VMProtectSDK32.dll, а для 64-разрядных - VMProtectSDK64.dll; для + защиты драйверов используются VMProtectDDK32.sys и + VMProtectDDK64.sys соответственно) - далее по тексту + VMProtectSDK. Процедуры и функции, находящиеся в VMProtectSDK, не + выполняют каких-либо действий и выступают лишь в роли меток, по + которым VMProtect определяет границы защищаемого кода. Начало и + конец защищаемого блока, соответственно, маркируется следующим + образом:</p> + + <ul> + <li><strong>Delphi</strong> + <pre class="code">uses VMProtectSDK; + +VMProtectBegin(НАЗВАНИЕ_МАРКЕРА); +... +VMProtectEnd; +</pre> + </li> + + <li><strong>C/C++</strong> + <pre class="code">#include "VMProtectSDK.h" + +VMProtectBegin(НАЗВАНИЕ_МАРКЕРА); +... +VMProtectEnd(); +</pre> + </li> + + <li><strong>MASM</strong> + <pre class="code">include VMProtectSDK.inc + +invoke VMProtectBegin,SADD(НАЗВАНИЕ_МАРКЕРА) +... +invoke VMProtectEnd +</pre> + </li> + + <li><strong>Visual Basic</strong> + <pre class="code">VMProtectBegin (StrPtr(НАЗВАНИЕ_МАРКЕРА)) +... +VMProtectEnd +</pre> + </li> + </ul> + + <p>Также вместо VMProtectBegin можно использовать маркеры с + предустановленными <a href= + "project_functions.htm#CompilationTypes">типами + компиляции</a>:</p> + + <ul> + <li>VMProtectBeginVirtualization - маркер будет использовать + тип компиляции "Виртуализация".</li> + + <li>VMProtectBeginMutation - маркер будет использовать тип + компиляции "Мутация".</li> + + <li>VMProtectBeginUltra - маркер будет использовать тип + компиляции "Ультра".</li> + </ul> + + <p>Обработка маркеров производится следующим образом: при анализе + кода защищаемого приложения VMProtect находит все вызовы процедур + и функций VMProtectSDK. Границы защищаемых блоков определяются по + парам маркеров + VMProtectBegin/VMProtectBeginVirtualization/VMProtectBeginMutation/VMProtectBeginUltra + и VMProtectEnd. В процессе обработки проекта с помощью VMProtect + из кода защищаемой программы удаляются как сами маркеры, так и + упоминание о библиотеках VMProtectSDK, поэтому нет необходимости + включать данные библиотеки в дистрибутив программы. Маркеры + удаляются независимо от того, были они включены в компиляцию или + нет. При использовании именованных маркеров их имена также + удаляются.</p> + + <p>Если задано название маркера, ему будет присвоено имя вида + "VMProtectMarker НАЗВАНИЕ_МАРКЕРА". Если название маркера не + задано, ему будет присвоено уникальное имя вида + "VMProtectMarker"+номер маркера по порядку. Однако использование + неименованных маркеров имеет один серьезный недостаток, + заключающийся в том, что при вставке в исходный код программы + нового маркера нумерация неименованных маркеров изменится, + поэтому при защите программ всегда целесообразно использовать + именованные маркеры.</p> + + <p>Важным моментом, который необходимо учитывать при работе с + маркерами, является то, что нельзя допускать переходы из + незащищенных участков внутрь маркера, что может произойти, + например, при пометке маркером только части цикла. В случае если + приложение после защиты с использованием маркеров стало + неработоспособным, адреса переходов из незащищенных участков + можно определить с помощью включения опции "Режим отладки". В + данном режиме, при работе защищенного приложения из-под + отладчика, на месте обнаружения переходов из незащищенного + участка кода в защищенный отладчик будет прерывать выполнение + программы. После обнаружения всех подобных переходов необходимо + изменить местоположение маркеров в коде программы либо, если это + невозможно, пометить эти адреса как внешние, используя + графическую версию VMProtect.</p> + + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/watermarks.htm b/help/ru/watermarks.htm new file mode 100644 index 0000000..248e3a4 --- /dev/null +++ b/help/ru/watermarks.htm @@ -0,0 +1,45 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Водяные знаки</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Водяные знаки</h1> + + <p>VMProtect предоставляет уникальную возможность добавления в + защищаемый файл скрытой информации о владельце файла. Водяной + знак представляет собой массив байт, который должен быть уникален + для каждого вашего пользователя. После включения водяных знаков в + защищаемый файл в дальнейшем (например, в случае распространения + взломанной программы) вы всегда сможете определить его владельца + и принять соответствующие меры. Файл базы данных с водяными файлами + хранится в файле "%ApplicationData%/VMProtect Software/VMProtect.dat" + для Windows и в файле "/Users/Shared/VMProtect Software/VMProtect.dat" + для Mac OS X.</p> + + <p>Диалоговое окно "Водяные знаки" содержит две вкладки:</p> + + <ul> + <li><a href="watermarks_setup.htm">Настройка</a></li> + <li><a href="watermarks_search.htm">Поиск</a></li> + </ul><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/watermarks_search.htm b/help/ru/watermarks_search.htm new file mode 100644 index 0000000..eeeba7f --- /dev/null +++ b/help/ru/watermarks_search.htm @@ -0,0 +1,65 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Поиск водяных знаков</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Поиск водяных знаков</h1> + + <p>Вкладка "Поиск" диалога "водяные знаки" служит для поиска водяных знаков в исполняемом + файле или в определенном процессе защищенного + приложения:</p> + <p><img src="images/watermarks_search.png" /></p> + + <ul> + <li><strong>Поиск в файле</strong> - искать в исполняемом файле + приложения. В поле "Имя файла" выберите файл, в котором + необходимо произвести поиск водяных знаков;</li> + + <li><strong>Поиск в модуле</strong> - искать в модуле + выбранного процесса. После выбора в выпадающем списке "Процесс" + нужного процесса в выпадающем списке "Модуль" выберите модуль + этого процесса, в котором необходимо произвести поиск водяных + знаков.</li> + </ul> + + <p>Результаты поиска водяных знаков отображаются в списке, + расположенном в нижней части окна:</p> + + <ul> + <li><strong>Название</strong> - название найденного водяного + знака;</li> + + <li><strong>Количество</strong> - количество копий найденного + водяного знака.</li> + </ul> + + <p><strong>Важно:</strong><br /> + При поиске водяных знаков в неупакованном исполняемом файле может + использоваться любой из этих режимов. Однако, если исполняемый + файл <a href="dictionary.htm#Pack">упакован</a>, то водяные знаки + следует искать только в запущенном приложении (режим "Поиск в + модуле"), так как их поиск в исполняемом файле не даст + каких-либо результатов, из-за того что водяные знаки, как и + остальной код и данные, хранятся в сжатом виде, а распаковка + осуществляется только после запуска приложения.</p><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/ru/watermarks_setup.htm b/help/ru/watermarks_setup.htm new file mode 100644 index 0000000..80cec4d --- /dev/null +++ b/help/ru/watermarks_setup.htm @@ -0,0 +1,49 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <link rel="Stylesheet" type="text/css" href="default.css" /> + <meta http-equiv="Content-Type" content= + "text/html; charset=utf-8" /> + + <title>Настройка водяных знаков</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Настройка водяных знаков</h1> + + <p>Вкладка "Настройка" диалога "Водяные знаки" служит для управления водяными + знаками:</p> + <p><img src="images/watermarks_setup.png" alt="Настройка водяных знаков" /></p> + + <p>Для добавления водяного знака служит одноименная кнопка. При этом откроется диалоговое + окно:</p> + <p><img src="images/watermarks_add.png" alt="Добавить водяной знак" /></p> + + <ul> + <li><strong>Название</strong> - название водяного знака;</li> + + <li><strong>Значение</strong> - значение водяного знака. При + помощи кнопки "Сгенерировать" можно задать случайное значение + водяного знака. Поле "Значение" состоит из двух столбцов: в + левом столбце можно ввести значение в Hex режиме, в правом + столбце - в виде текста. При вставке водяного знака в + защищаемый файл позиции, имеющие символ "?", будут иметь + случайные значения.</li> + </ul> + <p>Для удаления или переименования водяного знака используйте контекстное меню:</p> + <p><img src="images/watermarks_menu.png" alt="Меню водяного знака" /></p> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html>
\ No newline at end of file diff --git a/help/ru/work.htm b/help/ru/work.htm new file mode 100644 index 0000000..1d8f846 --- /dev/null +++ b/help/ru/work.htm @@ -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>Работа с VMProtect</title> + <style type="text/css"> + </style> +</head> + +<body> + <h1>Работа с VMProtect</h1> + + <p>Перед началом работы с VMProtect ознакомьтесь со следующими разделами:</p> + + <ul> + <li><a href="create_project.htm">Подготовка проекта</a></li> + <li><a href="main_window.htm">Главное окно</a></li> + <li><a href="mode_console.htm">Консольная версия</a></li> + </ul><br /> + <br /> + <br /> + <br /> + <br /> + <hr noshade="noshade" size="1" /> + + <div align="center"> + © 2006-2015 Copyright VMProtect Software + </div> +</body> +</html> diff --git a/help/struct.json b/help/struct.json new file mode 100644 index 0000000..52340c3 --- /dev/null +++ b/help/struct.json @@ -0,0 +1,89 @@ +{"root_title": "User Manual", "children": [ + {"file": "terms.htm", "title": "introduction", "children": [ + {"file": "dictionary.htm", "title": "glossary"}, + {"file": "software_protection.htm", "title": "analyzing-cracking-and-protecting-software"}, + {"file": "about_vmprotect.htm", "title": "what-is-vmprotect"}, + {"file": "recommendations.htm", "title": "protection-recommendations"}, + {"file": "history.htm", "title": "version-history"} + ]}, + {"file": "work.htm", "title": "working-with-vmprotect", "children": [ + {"file": "create_project.htm", "title": "preparing-a-project", "children": [ + {"file": "use_map_file.htm", "title": "using-a-map-file"}, + {"file": "use_markers.htm", "title": "using-markers"}, + {"file": "sdk_functions.htm", "title": "sdk-functions"} + ]}, + {"file": "main_window.htm", "title": "main-window", "children": [ + {"file": "main_menu.htm", "title": "main-menu", "children": [ + {"file": "menu_file.htm", "title": "file"}, + {"file": "menu_edit.htm", "title": "edit"}, + {"file": "menu_project.htm", "title": "project"}, + {"file": "menu_tools.htm", "title": "tools"}, + {"file": "menu_help.htm", "title": "help"} + ]}, + {"file": "toolbar.htm", "title": "toolbar"}, + {"file": "project.htm", "title": "project", "children": [ + {"file": "project_functions.htm", "title": "procedures-for-protection"}, + {"file": "manager/licenses.htm", "title": "license-management"}, + {"file": "project_files.htm", "title": "files"}, + {"file": "project_script.htm", "title": "script"}, + {"file": "project_options.htm", "title": "options", "children": [ + {"file": "project_options_external_addresses.htm", "title": "external-addresses"} + ]} + ]}, + {"file": "functions.htm", "title": "functions"}, + {"file": "info.htm", "title": "info", "children": [ + {"file": "info_directories.htm", "title": "directories"}, + {"file": "info_segments.htm", "title": "segments"}, + {"file": "info_imports.htm", "title": "imports"}, + {"file": "info_exports.htm", "title": "exports"}, + {"file": "info_resources.htm", "title": "resources"}, + {"file": "info_dump.htm", "title": "dump"} + ]} + ]}, + {"file": "mode_console.htm", "title": "command-line-version"} + ]}, + {"file": "manager/index.htm", "title": "software-licensing-system", "children": [ + {"file": "manager/features.htm", "title": "licensing-system-features"}, + {"file": "manager/howitworks.htm", "title": "how-does-licensing-system-work"}, + {"file": "manager/usage/index.htm", "title": "example-of-usage", "children": [ + {"file": "manager/usage/step11_app.htm", "title": "step-1-create-test-application"}, + {"file": "manager/usage/step12_code.htm", "title": "step-2-add-license-checking-code"}, + {"file": "manager/usage/step13_flags.htm", "title": "step-3-get-state-of-serial-number"}, + {"file": "manager/usage/step14_name.htm", "title": "step-4-get-user-name-and-e-mail"}, + {"file": "manager/usage/step15_exp.htm", "title": "step-5-check-serial-number-expiration-date"}, + {"file": "manager/usage/step16_time.htm", "title": "step-6-limit-application-running-time"}, + {"file": "manager/usage/step17_maxbuild.htm", "title": "step-7-limit-period-of-free-updates"}, + {"file": "manager/usage/step18_blacklist.htm", "title": "step-8-put-serial-number-to-black-list"}, + {"file": "manager/usage/step19_hwid.htm", "title": "step-9-lock-serial-number-to-hardware"}, + {"file": "manager/usage/step1A_userdata.htm", "title": "step-10-read-user-data-from-serial-number"}, + {"file": "manager/usage/step21_src.htm", "title": "step-1-create-new-test-application"}, + {"file": "manager/usage/step22_vmp.htm", "title": "step-2-create-vmprotect-project"}, + {"file": "manager/usage/step23_product.htm", "title": "step-3-first-run-of-protected-application"}, + {"file": "manager/usage/step24_test.htm", "title": "step-4-test-results"}, + {"file": "manager/usage/step25_codelock.htm", "title": "step-5-lock-code-to-serial-number"}, + {"file": "manager/usage/api.htm", "title": "licensing-module-api"} + ]}, + {"file": "manager/keygen/index.htm", "title": "serial-number-generators", "children": [ + {"file": "manager/keygen/keygen_dll.htm", "title": "dll-based-serial-number-generator"}, + {"file": "manager/keygen/keygen_net.htm", "title": "serial-number-generator-for-net-platform"}, + {"file": "manager/keygen/keygen_php.htm", "title": "php-based-serial-number-generator"}, + {"file": "manager/keygen/serial_format.htm", "title": "serial-number-format"}, + {"file": "manager/keygen/algorithms.htm", "title": "serial-number-encryption-algorithms"} + ]}, + {"file": "manager/activation.htm", "title": "activation-system", "children": [ + {"file": "manager/activation/vmprotect.htm", "title": "activation-support-in-vmprotect"}, + {"file": "manager/activation/weblm.htm", "title": "activation-support-in-web-license-manager"}, + {"file": "manager/activation/api.htm", "title": "activation-api"} + ]} + ]}, + {"file": "script.htm", "title": "using-scripts", "children": [ + {"file": "script_classes.htm", "title": "classes"}, + {"file": "script_functions.htm", "title": "built-in-functions"}, + {"file": "script_events.htm", "title": "events"} + ]}, + {"file": "watermarks.htm", "title": "watermarks", "children": [ + {"file": "watermarks_setup.htm", "title": "setup-tab"}, + {"file": "watermarks_search.htm", "title": "search-tab"} + ]}, + {"file": "faq.htm", "title": "frequently-asked-questions"} +]}
\ No newline at end of file diff --git a/help/sync.py b/help/sync.py new file mode 100644 index 0000000..8912894 --- /dev/null +++ b/help/sync.py @@ -0,0 +1,316 @@ +#!/usr/bin/python + +import pyblog, codecs, json, os, re, sys, time + +SRC_PATH = "." +STRUCT_FILE = sys.argv[1] + +########################################################################################## +# delete old pages + +def find_user_manual_id(root_title, all_pages): + for page in all_pages: + if page['page_title'] == root_title: + return int(page['page_id']) + raise Exception('Can\'t find user manual page') + +def find_children(all, root_id): + children = [] + prev = [root_id] + current = [] + while len(prev) > 0: + for p in all: + this_id = int(p['page_id']) + parent_id = int(p['page_parent_id']) + if prev.count(parent_id) > 0: + current.append(this_id) + children.extend(prev) + prev = current + current = [] + children.extend(prev) + children.remove(root_id) + return children + +def delete_pages(blog, pages): + for p in pages: + try: + blog.delete_page(p) + #time.sleep(8) + except pyblog.BlogError as text: + print ("warning while attempting to delete the page %d: %s" % (p, text)) + except xml.parsers.expat.ExpatError as text: + print ("xerror: %s" % (text)) + +########################################################################################## +# create new pages + +def load_structure(): + f = codecs.open(STRUCT_FILE, 'r', 'utf-8') + return json.load(f) + +def get_good_image_link(link): + parts = link.split('/') + return "/usermanual/" + parts[len(parts) - 1] + +def remove_newlines(text): + lines = text.splitlines() + nlines = [] + line = "" + in_pre = False + for l in lines: + if in_pre: + nlines.append(l) + if re.search("</pre", l): + in_pre = False + nlines.append("") + continue + + l = l.strip() + if re.search("<pre", l): + if line != "": + nlines.append(line) + line = "" + nlines.append("") + nlines.append(l) + in_pre = True + continue + + if l == "": + if line != "": + nlines.append(line) + line = "" + continue + + if line != "": + line = line + " " + line = line + l + + if line != "": + nlines.append(line) + + return "\n".join(nlines) + + +def filter_content(text): + # remove newlines + text = remove_newlines(text) + + # adjust images + images = set(re.findall('<img.*?src\s*=\s*"([^"]*)"', text, re.M + re.DOTALL)) + for l in images: + text = text.replace(l, get_good_image_link(l)) + + # remove footer + text = re.sub('([\r\n\s]*<br[^>]*>[\r\n\s]*)+<hr[^>]*>[\s\n\r]*<div.*Copyright.+$', '', text) + + # that's all + return text + + +def load_single_page(p): + print ("\nprocessing page %s" % (p['file'])) + content = codecs.open(os.path.join(SRC_PATH, p['file']), 'r', 'utf-8').read() + title = p['title'] + m_title = re.search('<title>(.*)</title>', content, re.M + re.DOTALL) + if m_title: + title = m_title.group(1) + title = title.replace('"', '"') + p['title'] = title + + m_content = re.search('<body>(.*)</body>', content, re.M + re.DOTALL) + if m_content: + content = m_content.group(1) + else: + content = "not found" + content = filter_content(content) + p['content'] = content + + +def load_pages_content(pages): + for p in pages: + load_single_page(p) + if 'children' in p: + load_pages_content(p['children']) + +def print_pages_content(pages): + for p in pages: + print ("file %s" % (p['file'])) + print ("page %s, title = %s, content:\n%s\n\n" % (p['file'], p['title'], repr(p['content']))) + if 'children' in p: + print_pages_content(p['children']) + + +def create_single_page(blog, title, content, parent, order): + print ("creating page: %s" % (title)) + try: + query = {'wp_page_parent_id': parent, 'title': title, 'description': content, 'mt_allow_comments': 0, 'mt_allow_pings': 0, 'publish': 1, 'wp_page_order': order} + return blog.new_page(query) + except pyblog.BlogError as text: + print ("error: %s" % (text)) + except xml.parsers.expat.ExpatError as text: + print ("xerror: %s" % (text)) + +def create_new_pages(blog, root, pages): + cnt = 0 + for p in pages: + title = p['title'] + file = p['file'] + content = p['content'] + id = create_single_page(blog, title, content, root, cnt) + #time.sleep(8) + wp_page = blog.get_page(id) + p['id'] = id + p['link'] = wp_page['link'] + if 'children' in p: + create_new_pages(blog, id, p['children']) + cnt = cnt + 1 + +def update_single_page(blog, page): + print ("updating page %s" % (page['title'])) + try: + query = {'title': page['title'], 'description': page['content']} + blog.edit_page(page['id'], query) + except pyblog.BlogError as text: + print ("error: %s" % (text)) + except xml.parsers.expat.ExpatError as text: + print ("xerror: %s" % (text)) + +def update_pages(blog, pages): + for p in pages: + update_single_page(blog, p) + time.sleep(10) + if 'children' in p: + update_pages(blog, p['children']) + +def find_page_in_all_exact(fname, all_pages): + for p in all_pages: + if fname == p['file']: return p['link'] + if 'children' in p: + res = find_page_in_all_exact(fname, p['children']) + if res: return res + return None + +def find_page_in_all_by_name(fname, all_pages): + for p in all_pages: + if os.path.basename(fname) == os.path.basename(p['file']): + return p['link'] + if 'children' in p: + res = find_page_in_all_by_name(fname, p['children']) + if res: return res + return None + +def find_target(fname, link, all_new_pages): + dir = os.path.dirname(fname) + tgt = os.path.join(dir, link) + tgt = os.path.normpath(tgt) + tgt = tgt.replace('\\', '/') + good_tgt = find_page_in_all_exact(tgt, all_new_pages) + if good_tgt: + return good_tgt + + good_tgt = find_page_in_all_by_name(tgt, all_new_pages) + if good_tgt: + return good_tgt + else: + return "--- unknown link ---" + +def process_links_on_page(page, all_new_pages): + text = page['content'] + links = re.findall('<a[^>]*href\s*=\s*"([^"#]*)', text, re.DOTALL) + for l in links: + if l == "": continue + nl = l.replace('\\', '/') + if re.match("(http|mailto):", nl): continue + nl = find_target(page['file'], nl, all_new_pages) + text = text.replace(l, nl) + page['content'] = text + +def process_links(pages, all_new_pages): + for p in pages: + process_links_on_page(p, all_new_pages) + if 'children' in p: + process_links(p['children'], all_new_pages) + +def get_list_of_pages(pages): + list = "\n<ul class=toc>\n" + for p in pages: + list = list + '<li><a href="' + p['link'] + '">' + p['title'] + '</a></li>\n' + if 'children' in p: + list = list + get_list_of_pages(p['children']) + return list + "</ul>\n" + +def update_main_page(blog, id, pages): + print ('updating the main user manual page') + + list = ''' + <h1>User Manual</h1> + + The table of contents: + + <style> ul.toc li { margin-left: 2em; } #content>ul { padding-left: 0; } </style> + + ''' + list = list + get_list_of_pages(pages) + + try: + query = {'description': list} + blog.edit_page(id, query) + except pyblog.BlogError as text: + print ("error: %s" % (text)) + + + +########################################################################################## +# main code + +print ("------------------") +test = ''' +one +<pre> +two + three + four</pre> + more + some text + <pre> + some text + one more + </pre> + + a + b + c +''' + +#print test +#test = remove_newlines(test) +#print "------------------" +#print test + +#quit() + +struct = load_structure() +new_pages = struct['children'] +load_pages_content(new_pages) + +#print_pages_content(new_pages) +#quit() + +# blog = pyblog.WordPress('http://test.vmpsoft.com/xmlrpc.php', 'admin', '12345') +blog = pyblog.WordPress('http://vmpsoft.com/xmlrpc.php', 'uploader', 'lcRn4F29Rr4S') +all_pages = blog.get_page_list() +user_manual_id = find_user_manual_id(struct['root_title'], all_pages) +print ("user manual page has id %d" % (user_manual_id)) +user_manual_children = find_children(all_pages, user_manual_id) +print ("user manual children pages are %s\ndeleting..." % (user_manual_children)) +delete_pages(blog, user_manual_children) # to trash +delete_pages(blog, user_manual_children) # from trash +print ("done, ready to create the new structure") + +create_new_pages(blog, user_manual_id, new_pages) + +process_links(new_pages, new_pages) + +update_pages(blog, new_pages) + +update_main_page(blog, user_manual_id, new_pages) diff --git a/help/syncVMProtect.bat b/help/syncVMProtect.bat new file mode 100644 index 0000000..aaeb5d3 --- /dev/null +++ b/help/syncVMProtect.bat @@ -0,0 +1,3 @@ +pushd %~dp0\en +py ..\sync.py ..\struct.json +popd
\ No newline at end of file |