# Шаг 2.1: Создаем новое защищенное приложение

Если на первом этапе мы создавали несколько разных тестовых приложений для изучения 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 и попробуем защитить нашу программу.

© 2006-2015 Copyright VMProtect Software