Главная

Программы

OSProtector

Реализация
Примеры
OSa

Активация

Контакт

Ссылки


Пример использования протектора - создание слоев, проверка серийных номеров.


     Программа-пример написана в среде разработки Microsoft Visual Studio 2005, на языке C++. Пример показывает, как интегрировать в защищаемый бинарный файл код, исполняемый на стековой машине, проверять целостность кода в нескольких слоях. Исходный код данной консольной программы находится в каталоге Examples\Visual C++ в дистрибутиве протектора.


#include "stdafx.h"

#include "..\\..\\Include\\OSProtectorSDK.h"
#include <conio.h>
#include <string.h>
#include <Windows.h>

#pragma pack (push, 1)
typedef struct _TMyStruct
{
  //Input fields
  char *Message;
  char *Caption;
  int a;
  int b;
  float c;

  //Output fields
  float result;
} TMyStruct;
#pragma pack(pop)

void testFunc1()
{
  CreateOSProtectorMarker("m1");
  printf("test1\n");
}

void testFunc2()
{
  testFunc1();
  CreateOSProtectorMarker("m2");
  printf("test2\n");
}

void testFunc3()
{
  testFunc1();
  CreateOSProtectorMarker("m2");
  printf("test3\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
  CreateOSProtectorMarker("m0");
  testFunc1();
  testFunc2();
  testFunc3();
  TMyStruct MyStruct;

  MyStruct.a = 10;
  MyStruct.b = 15;
  MyStruct.c = 0.5;

  MyStruct.Caption = "Test caption";
  MyStruct.Message = "Hello world";

  MyStruct.result = 0;

  CreateOSFunctionCall(&MyStruct);

  printf("result = %f", MyStruct.result);

  getch();

  return 0;
}

     Для защиты от модификации тестовой программы создадим три слоя. Каждый слой будем ассоциировать с функциями, содержащими маркеры m0, m1 и m2 соответственно. После защиты функции второго и третьего слоя будут изменены и начнут проверять неизменность предыдущих слоев. В функции _tmain есть вызов процедуры CreateOSFunctionCall из заголовочного файла OSProtectorSDK.h. Данной процедуре передается адрес структуры, через которую и передаются входные (выходные) данные, используемые стековой машиной.


     Перед генерацией исполняемого файла попросим компилятор (в настройках проекта) создать map-файл.

     Используемый нами компилятор является довольно оптимизирующим. В релизной версии он вполне может, для обеспечений дополнительного быстродействия, вставлять не вызовы функций, а их тела. Для тестового примера это будет излишним. Заставим его инлайнить только явно указанные функции.

     Откомпилировав программу, загрузим бинарный файл в протектор.

     Необходимые нам функции были корректно дизассемблированы. Создаем слои. С первым слоем ассоциируем все функции, в которых содержится маркер m0 (для данного примера это функция _tmain). Со вторым слоем все функции, содержащие маркер m1 (в нашем примере это функция testFunc1) . И наконец, с третьим слоям ассоциируем функции testFunc2 и testFunc3, т.к. они содержат маркер m2.

     Теперь определимся с OS-функцией. Прежде всего, создадим ее с именем "Test OS-Function". Размер стека оставим по умолчанию.

     Листинг тела OS-функции: 

     struct TMyStruct
     {
     //Input fields
     char *Message;
     char *Caption;
     int a;
     int b;
     float c;

     //Output fields
     float result;
     };

     void main(TMyStruct* x){
          void * user32 = GetModuleHandle("user32.dll");
          if (user32==NULL)
               user32 = LoadLibrary("user32.dll");
          unsigned int MessageBox(void*, char*, char*, unsigned int) = GetProcAddress(user32, "MessageBoxA");
          MessageBox(NULL, x->Caption, x->Message, 0);
          x->result = (x->a * x->b + 0.33) / x->c;
     }

     После трансляции ассоциируем вызов функции CreateOSFunctionCall с созданной нами OS-функцией "Test OS-Function".

     Защитим тестовую программу.

     После защиты можем увидеть, что протектор изменил все функции, ассоциированные со вторым и последующими слоями, заменил функции, вызываемые из OSProtectorSDK.h. Теперь программа защищена и позволяет исполнять алгоритм на своей стековой машине.

© 2009—2011 «OS-Lab.ru»