mirror of
				https://github.com/Obfuscator-Collections/VMProtect.git
				synced 2025-10-30 03:41:31 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			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>
 |