110 lines
4.0 KiB
HTML
110 lines
4.0 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.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>
|