mirror of
				https://github.com/Obfuscator-Collections/VMProtect.git
				synced 2025-10-30 06:31:31 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			86 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			3.8 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>Шаг 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>
 |