VMProtect/help/ru/manager/usage/step25_codelock.htm
VNGhostMans 5ec92ee05e first commit
Version 3.x.x
2023-05-14 20:21:09 +07:00

145 lines
10 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/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 &amp;&amp;</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&gt;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>