145 lines
10 KiB
HTML
145 lines
10 KiB
HTML
|
<!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>
|