Как лучше защитить DEMO версию программы?

Issues related to VMProtect
Post Reply
DIMMUA
Posts: 3
Joined: Mon Nov 03, 2014 6:56 pm

Как лучше защитить DEMO версию программы?

Post by DIMMUA »

С защитой обычной версии программы проблем нет –важные процедуры я защитил в режиме «Ультра», да и еще и с привязкой к серийному номеру. (моя цель – это привязка программы к коду оборудованию).

А вот как правильно распространять ДЕМО версию программы? Я считаю, что её тоже нужно «обрабатывать» VMProtect, а то мало ли, чего люди увидят, копаясь в ней, а может это им поможет во взломе? Еще, где-то читал, что хороший вариант - это исключать из на этапе компиляции некоторые процедуры, тем самым создавая «урезанную версию ДЕМО приложения».

Но у меня почти нет процедур, которые я бы исключил из компиляции, создавая ДЕМО версию. Как делаю я сейчас:

1. Во всех процедурах снимаю галочку «Привязать к серийному номеру», т.к. ни какого серийника в демо-версии нет.
2. Весь код проверки серийника у меня пишется примерно так:

Code: Select all

{$IFDEF DEMO}
{$ELSE}
  if VMProtectGetSerialNumberState <> 0 then Halt;
{$ENDIF}
Т.е. при создании ДЕМО любые проверки кода убираются.

3. Для создания demo я использую условную компиляцию, чтобы вырезать часть кода процедур, например:

Code: Select all

procedure TForm1.Vniz;
begin
{$IFDEF DEMO}
  Application.ProcessMessages();
{$ELSE}
  k := k + 1;
  if k > 100 then
    k := 1;
  MyProc(k);
  Application.ProcessMessages();
{$ENDIF}
end;

procedure TForm1.Vverx;
begin
  k := k -1;
  if k < 1 then
    k := 100;
  MyProc(k);
  Application.ProcessMessages();
end;
Получается, если создаю нормальное приложение, то в него попадают две процедуры, а если DEMO, то процедура «Vniz» как-бы урезается.

Вот, примерно, таким образом, происходит создание демо-версии. Это нормальный способ?

Меня беспокоит, вот что:

1. Может ли хакер как-бы «дописать» процедуру Vniz? Она же вроде такая простая – просто передает параметр «k» продуре «MyProc»? А как тогда лучше быть?

2. Как-то однотипно у меня «VMProtectGetSerialNumberState <> 0 then Halt» может надо разнообразить, чтобы усложнить взлом? Например «VMProtectGetSerialNumberState <> 0 then k:=k*100» тем самым я испорчу значение переменной, приложение дальше не сможет нормально работать.

3. Как часто нужно проверять VMProtectGetSerialNumberState ? Вот есть у меня блок кода накрытый маркером, скажем 1000 строк, которые выполняются за 300-400 мс. Я думаю 2-3 проверок вполне достаточно?

Пока писал пост возникла идея, а что если распространять demo версию, в которой вырезаны части кода (на примере процедуры «Vniz») с серийным номером, но в этом номере не будет привязки к оборудованию, т.е. запускай программу где хочешь и тестируй. Используя такой способ, мне не придется снимать галочку «Привязать к сейриному номеру», да я варианты проверки кода можно будет упростить:

Code: Select all

{$IFDEF DEMO} // убрать условную компиляцию при проверке кода
{$ELSE}
  if VMProtectGetSerialNumberState <> 0 then Halt;
{$ENDIF}
Спасибо, что прочли весь текст.
Admin
Site Admin
Posts: 2585
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Как лучше защитить DEMO версию программы?

Post by Admin »

Есть 2 подхода к реализации демо версии:
1. Вырезаем "продвинутый" функционал на уровне исходников (в этом случае будет отдельно собиратся демо версия и полная версия для покупателей)
2. Ограничиваем "продвинутый" функционал (а также добавляем всякие водяные знаки в картинки, отчеты, вводим ограничения на количество доступных объектов/записей в БД и т.п.). При этом демо версия и версия для покупателей будет одна и та же. Демо версия превращается в полнофункциональную путем регистрации программы ключем:

Code: Select all

function Foo();
begin
  if VMProtectGetSerialNumberState <> 0 then 
   begin
    MessageBox("Фукционал доступен только в зарегистрированной версии");
    exit;
   end;
  // работа без ограничений
end;
Foo() добавляем в проект. Также можно добавлять функции с автоматической привязкой к серийному номеру, но при этом нужно учитывать чтобы они не могли вызываться в демо режиме, т.к. программа автоматически закроется при отсутствии ключа.
TeelXp
Posts: 3
Joined: Fri Jul 20, 2012 8:29 am

Re: Как лучше защитить DEMO версию программы?

Post by TeelXp »

У меня во многом аналогичный вопрос. Не хотелось бы форкать приложение на демо-версию и основную. Хотелось бы иметь один exe файл который при вводе ключа превращается в полнофункциональное приложение. Но тут есть проблема - функции которые я бы хотел заблокировать в демо режиме критичны к производительности, т. е. нет возможности навесить на них виртуальную машину с привязкой к ключу. Можно ли как то защитить такие функции ключом, что бы теоретически нельзя было бы вскрыть эти функции без наличия хотя бы одной купленной лицензии. Насколько я понимаю, сдампить код который просто накрыт VMProtect без дополнительных защит виртуальной машиной не является сейчас сверх сложной задачей. Мне бы не хотелось, чтобы при установке демо версии можно было бы получить доступ к коду функций, которые не должны поддерживаться данной версией приложения. Что можете посоветовать?
Admin
Site Admin
Posts: 2585
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Как лучше защитить DEMO версию программы?

Post by Admin »

Делаете полноценный ЕХЕ-ник, в котором продвинутый (недоступный в демо функционал) привязывается к ключу - этот функционал невозможно будет физически запустить без наличия ключа. Дополнительно к этому различные функции приложения (которые будут доступны как в демо так и в зарегистрированной версии) добавляете код, который будет проверять состояние серийника. В зависимости от состояния вводить ограничения в основной функционал программы:

Code: Select all

 
if (VMProtectGetSerialNumberState() != 0) {
   MessageBox("Внимание! Вы работаете в демо версии. Хотите приобрести полную версию?");
   ...
}
В ветке с MessageBox можно делать вообще все что угодно (зависит только от фантазии разработчика) - проверка общего количества записей в базе, добавление всяких ватермарок при печати и т.п. Ессно весь этот код придется накрыть виртуализацией без привязки к ключу.
TeelXp
Posts: 3
Joined: Fri Jul 20, 2012 8:29 am

Re: Как лучше защитить DEMO версию программы?

Post by TeelXp »

Admin wrote:Делаете полноценный ЕХЕ-ник, в котором продвинутый (недоступный в демо функционал) привязывается к ключу - этот функционал невозможно будет физически запустить без наличия ключа.
Как я понимаю, возможность привязки к ключи есть только у функций накрытых виртуально машиной. Но, как я уже написал выше, данный вариант мне не подходит, так как функции которые я желаю защитить критичны к производительности. Я понимаю что впоследствии без виртуализации мне не добиться должной защиты данных функций. Но сейчас такой задачи и не стоит, я всего лишь хочу, что бы данные функции не были доступны ни в каком виде без ввода ключа.
Post Reply