Если на первом этапе мы создавали несколько разных тестовых приложений для изучения API системы лицензирования, то на втором этапе приложение будет одно. Оно также будет консольным и в нем будет функция foo(), которая может работать только в зарегистрированной версии. Вот код нашего тестового приложения:
#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; }
Скомпилируем программу без отладочной информации, но в настройках линкера попросим создать MAP-файл, который потребуется для работы VMProtect. При запуске программы мы должны увидеть следующий текст:
serial number is bad state = SERIAL_STATE_FLAG_INVALID
В настоящий момент система лицензирования все еще работает в тестовом режиме, т.к. файл еще не был обработан VMProtect'ом и в него не был внедрен модуль лицензирования. На следующем шаге мы создадим проект VMProtect и попробуем защитить нашу программу.