Правильно ли я защищаю программу?

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

Правильно ли я защищаю программу?

Post by DIMMUA »

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

У меня есть плеер, который в процедуре «FormCreate» загружает в себя данные, и уже с помощью процедур «Vverx», «Vniz», «Vlevo», «Vpravo» листает списки на экране.

Процедура «FormCreate» большая, поэтому защищаю её частями, используя маркеры.
В начале «FormCreate» у меня есть такой код, он защищен режимом «Ультра», этот код загружает серийник и проверяет его:

Code: Select all

  if not FileExists(extractfilepath(Application.ExeName) + 'serial.txt') then
  begin
    ShowMessage('В папке с программой не найден файл serial.txt Загрузка программы невозможна.');
    Halt;
  end;

  // Загружаю код
  sN := '';
  Memo1.Lines.LoadFromFile(extractfilepath(Application.ExeName) + 'serial.txt');
  for i := 6 to Memo1.Lines.Count - 1 do
    sN := sn + Memo1.Lines[i];
  Memo1.Lines.Clear;

  nState := VMProtectSetSerialNumber(pansichar(sN));

  if nState and SERIAL_STATE_FLAG_CORRUPTED <> 0 then
  begin
    ShowMessage('Система лицензирования повреждена.');
    Halt;
  end;

  if nState and SERIAL_STATE_FLAG_INVALID <> 0 then
  begin
ShowMessage('Серийный номер некорректен. Cистема лицензирования не может расшифровать серийный номер.');
    Halt;
  end;

  if nState and SERIAL_STATE_FLAG_BLACKLISTED <> 0 then
  begin
ShowMessage('Серийный номер подходит к продукту, однако занесен в черный список.');
    Halt;
  end;

  if nState and SERIAL_STATE_FLAG_BAD_HWID <> 0 then
  begin
    ShowMessage('Идентификатор оборудования не совпадает с тем, что записан в серийном номере.');
    Halt;
  end;

  if nState and SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED <> 0 then
  begin
    ShowMessage('Серийный номер устарел и не предназначен для работы с этой версией программы.)';
    Halt;
  end;
После этого я, периодически, в программе вставляю такие кусочки кода:

Code: Select all

if VMProtectGetSerialNumberState <> 0 then Halt;
подобные строки тоже защищена маркером «Ультра».

Процедуры «Vverx», «Vniz», «Vlevo», «Vpravo» защищены режимом «Ультра» с привязкой к коду.

Я понятия не имею как взламываются программы, где, как правило находятся слабые места. Достаточно ли моих действий для адекватной защиты? Заранее спасибо.
V.I.R.U.S.
Posts: 24
Joined: Sun Apr 03, 2011 5:12 am

Re: Правильно ли я защищаю программу?

Post by V.I.R.U.S. »

В целом правильно, но...
Лучше в защищаемых процедурах вставить инициализацию важнейших переменных:

var
Engine: TEngine = nil;

procedure Super;
begin
if VMProtectGetSerialNumberState <> 0 then Halt;

Engine:= TEngine.Create;
end;
DIMMUA
Posts: 3
Joined: Mon Nov 03, 2014 6:56 pm

Re: Правильно ли я защищаю программу?

Post by DIMMUA »

Спасибо за ответ. Немного не понял сути. Не получается ни куда "nil" применить. У меня Delphi 7:

Code: Select all

var
Engine: TEngine = nil;
Получилось на свой лад написать в глобальных переменных:

Code: Select all

var
a: string = '';
b: integer = 0;
c: TStringList = а как это описывать?
Скажите, это важно делать предопределение значений глобальных переменных?
Лучше в защищаемых процедурах вставить инициализацию важнейших переменных:
Вот это я вроде понял... Получается, в процедуре "FormCreate" я расширю маркеры, так чтобы важные переменные создавались или инициализировались в защищенной области, например "a:= TstringList.Create" или "b=5";

Подскажите:
1. Нормально ли, что я только 1 раз делаю считывание кода? "nState := VMProtectSetSerialNumber(pansichar(sN))" от этого стойкость защиты не страдает?
2. Обязательно ли все проверки кода "if VMProtectGetSerialNumberState <> 0 then Halt" защищять маркерами? В некоторых процедурах, как мне кажется падает производительность, но я бы все равно хотел впихнуть туда хоть какую-то проверку. Или это опасно без маркеров, по принципу "Прочность цепи определяется по ее самому слабому звену". Т.е. если будет часть маркеров без защиты, то от этого может пострадать всё приложение?
3. При проверке кода, нужно ли увеличивать защищаемую область, например:

Code: Select all

VMProtectBegin
// мой код...
if VMProtectGetSerialNumberState <> 0 then Halt
// мой код
VMProtectEnd();
т.е. я вместе с проверкой кода, запихиваю часть своего кода, чтобы хакеру было сложнее найти саму проверку кода? Или это бесполезная идея? Она только увеличивает время выполнения процедуры.
Post Reply