Как защитить значения глобальных констант?

Issues related to VMProtect
igh0st
Posts: 40
Joined: Tue May 04, 2010 8:32 am

Как защитить значения глобальных констант?

Post by igh0st »

Подскажите пожалуйста, как защитить с помощью VMProtect константы в следующем модуле (маркерами в данном случае воспользоваться не представляется возможным):

Code: Select all

unit GlobalConsts;
interface
uses
    Dialogs;
const

    // Вот эти константы необходимо защитить
    //*************************************************************
    CONST_ProgID        = '{43F8F289-7A20-11D0-8F06-00C04FC295E1}';
    CONST_TotalRunCount = 100;
    CONST_Author        = 'Vasily Pupkin';
    //*************************************************************

implentation
end;
Admin
Site Admin
Posts: 2686
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Как защитить значения глобальных констант?

Post by Admin »

В данном случае вам нужно защищать не сами контсанты, а код который с ними работает. Для строковых констант можно предложить использовать VMProtectDecryptStringA/W:

Code: Select all

procedure TForm1.FormCreate(Sender: TObject);
begin
  Caption:=VMProtectDecryptStringA(CONST_Author);
end;
Ну и ессно не забываем виртуализировать код, которому могут подсунуть другой указатель на строку.
igh0st
Posts: 40
Joined: Tue May 04, 2010 8:32 am

Re: Как защитить значения глобальных констант?

Post by igh0st »

Тогда следующий вопрос, если
Admin wrote:Для строковых констант можно предложить использовать VMProtectDecryptStringA/W
то константы нужно сначала как-то зашифровать (Ecrypt)?
Admin
Site Admin
Posts: 2686
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Как защитить значения глобальных констант?

Post by Admin »

то константы нужно сначала как-то зашифровать (Ecrypt)?
Строковые константы будут автоматически зашифрованы после включения их в проект (в общем списке объектов они будут видны как string "{43F8F289-7A20-11D0-8F06-00C04FC295E1}" и string "Vasily Pupkin").
igh0st
Posts: 40
Joined: Tue May 04, 2010 8:32 am

Re: Как защитить значения глобальных констант?

Post by igh0st »

Admin wrote:Строковые константы будут автоматически зашифрованы после включения их в проект (в общем списке объектов они будут видны как string "{43F8F289-7A20-11D0-8F06-00C04FC295E1}" и string "Vasily Pupkin").
У меня в списке только процедуры, подскажите пожалуйста, как добавить константу в список защищаемых объектов?
Admin
Site Admin
Posts: 2686
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Как защитить значения глобальных констант?

Post by Admin »

У меня в списке только процедуры, подскажите пожалуйста, как добавить константу в список защищаемых объектов?
Для этого константу нужно предварительно обернуть в VMProtectDecryptStringA/W:

Code: Select all

procedure TForm1.FormCreate(Sender: TObject);
begin
  Caption:=VMProtectDecryptStringA(CONST_Author);
end;
igh0st
Posts: 40
Joined: Tue May 04, 2010 8:32 am

Re: Как защитить значения глобальных констант?

Post by igh0st »

Всё получилось, большое спасибо. Последний вопрос - какой тип компиляции предпочтительнее для констант (по умолчанию стоит виртуализация)? Или это по большому счету не существенно?
Admin
Site Admin
Posts: 2686
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Как защитить значения глобальных констант?

Post by Admin »

Последний вопрос - какой тип компиляции предпочтительнее для констант (по умолчанию стоит виртуализация)? Или это по большому счету не существенно?
Если вы защищаете константу не только от нахождения её в ЕХЕ, но и от патча, то лучше использовать виртуализацию или ультру.
Cyber
Posts: 48
Joined: Mon Feb 08, 2010 3:29 pm

Re: Как защитить значения глобальных констант?

Post by Cyber »

Не могли бы вы в будуших версия для функций:

VMProtectDecryptStringA,VMProtectDecryptStringW добавить еще указание типа защиты, чтобы не использовать скрипт и GUI?

И еще вопрос. Я так понимаю что указатель на стринг где то алакается внутри вашей библиотеки защиты. Собственно из своей части программы я его освободить не могу, предусмотрен ли у вас механизм на этот случай?
Admin
Site Admin
Posts: 2686
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Как защитить значения глобальных констант?

Post by Admin »

Не могли бы вы в будуших версия для функций:

VMProtectDecryptStringA,VMProtectDecryptStringW добавить еще указание типа защиты, чтобы не использовать скрипт и GUI?
Такого в планах нет.
И еще вопрос. Я так понимаю что указатель на стринг где то алакается внутри вашей библиотеки защиты. Собственно из своей части программы я его освободить не могу, предусмотрен ли у вас механизм на этот случай?
Мы планируем добавить возможность уничтожения строки, указатель на которую получен через VMProtectDecryptStringA/W - скорее всего будет отдельная API типа VMProtectFreeString. В какой именно версии это будет сделано - не могу точно сказать.
Cyber
Posts: 48
Joined: Mon Feb 08, 2010 3:29 pm

Re: Как защитить значения глобальных констант?

Post by Cyber »

Такого в планах нет.
В общем то мне кажется что это было бы полезной фичей, тем более что все равно он может менятся вручную.
Мы планируем добавить возможность уничтожения строки, указатель на которую получен через VMProtectDecryptStringA/W - скорее всего будет отдельная API типа VMProtectFreeString. В какой именно версии это будет сделано - не могу точно сказать.
Тогда меня сейчас интерисует такой вопрос... считается ли что указатель который вернула VMProtectDecryptStringX уходит в утечку памяти?
Admin
Site Admin
Posts: 2686
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Как защитить значения глобальных констант?

Post by Admin »

Тогда меня сейчас интерисует такой вопрос... считается ли что указатель который вернула VMProtectDecryptStringX уходит в утечку памяти?
Выделение памяти под строку происходит в момент первого выхова VMProtectDecryptStringX. При последующем вызове VMProtectDecryptStringX выделения памяти не происходит и не совсем понятно что вы понимаете под утечкой.
Cyber
Posts: 48
Joined: Mon Feb 08, 2010 3:29 pm

Re: Как защитить значения глобальных констант?

Post by Cyber »

Выделение памяти под строку происходит в момент первого выхова VMProtectDecryptStringX. При последующем вызове VMProtectDecryptStringX выделения памяти не происходит и не совсем понятно что вы понимаете под утечкой.
Я имел в виду следующий случай:

в исходном бинарном модуле строка хранится в шифрованном виде (если я правильно понимаю идеологию использования этой функции). Когда я хочу получить к ней доступ я использую функцию VMProtectDecryptStringX, которая вернет мне указатель на уже расшифрованную строку. Тоесть в итоге у меня есть указатель на выделенную строку, которую я в своей программе никак не могу освободить, т.к. не знаю способа выделения памяти внутри ваших функций. Тоесть на момент завершения приложения (или на момент выхода из функции) я имею указатель на выделенную область памяти - что и подразумеваю под утечкой.
Admin
Site Admin
Posts: 2686
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Как защитить значения глобальных констант?

Post by Admin »

Тоесть на момент завершения приложения (или на момент выхода из функции) я имею указатель на выделенную область памяти - что и подразумеваю под утечкой.
Если рассматривать случай с завершения приложения (актуально для DLL/SYS файлов), то действительно будем иметь утечку памяти в пределах процесса (для SYS - в системной памяти). Мы планируем в версии 2.06 (через одну версию) устранить все эти недостатки и предоставить пользователю возможность самому уничтожать декриптованные строки.
Cyber
Posts: 48
Joined: Mon Feb 08, 2010 3:29 pm

Re: Как защитить значения глобальных констант?

Post by Cyber »

то действительно будем иметь утечку памяти в пределах процесса (для SYS - в системной памяти).
Плохо... Verifier будет ругатся BSOD-ом!!!

Да и еще было бы хорошо, если в будущем функция VMProtectDecryptStringX будет еще и возвращать длину раскриптованой строки.
Post Reply