Page 1 of 2
Как защитить значения глобальных констант?
Posted: Tue May 04, 2010 8:47 am
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;
Re: Как защитить значения глобальных констант?
Posted: Tue May 04, 2010 8:58 am
by Admin
В данном случае вам нужно защищать не сами контсанты, а код который с ними работает. Для строковых констант можно предложить использовать VMProtectDecryptStringA/W:
Code: Select all
procedure TForm1.FormCreate(Sender: TObject);
begin
Caption:=VMProtectDecryptStringA(CONST_Author);
end;
Ну и ессно не забываем виртуализировать код, которому могут подсунуть другой указатель на строку.
Re: Как защитить значения глобальных констант?
Posted: Tue May 04, 2010 9:30 am
by igh0st
Тогда следующий вопрос, если
Admin wrote:Для строковых констант можно предложить использовать VMProtectDecryptStringA/W
то константы нужно сначала как-то зашифровать (Ecrypt)?
Re: Как защитить значения глобальных констант?
Posted: Tue May 04, 2010 9:39 am
by Admin
то константы нужно сначала как-то зашифровать (Ecrypt)?
Строковые константы будут автоматически зашифрованы после включения их в проект (в общем списке объектов они будут видны как
string "{43F8F289-7A20-11D0-8F06-00C04FC295E1}" и
string "Vasily Pupkin").
Re: Как защитить значения глобальных констант?
Posted: Tue May 04, 2010 10:14 am
by igh0st
Admin wrote:Строковые константы будут автоматически зашифрованы после включения их в проект (в общем списке объектов они будут видны как string "{43F8F289-7A20-11D0-8F06-00C04FC295E1}" и string "Vasily Pupkin").
У меня в списке только процедуры, подскажите пожалуйста, как добавить константу в список защищаемых объектов?
Re: Как защитить значения глобальных констант?
Posted: Tue May 04, 2010 10:30 am
by Admin
У меня в списке только процедуры, подскажите пожалуйста, как добавить константу в список защищаемых объектов?
Для этого константу нужно предварительно обернуть в VMProtectDecryptStringA/W:
Code: Select all
procedure TForm1.FormCreate(Sender: TObject);
begin
Caption:=VMProtectDecryptStringA(CONST_Author);
end;
Re: Как защитить значения глобальных констант?
Posted: Tue May 04, 2010 11:08 am
by igh0st
Всё получилось, большое спасибо. Последний вопрос - какой тип компиляции предпочтительнее для констант (по умолчанию стоит виртуализация)? Или это по большому счету не существенно?
Re: Как защитить значения глобальных констант?
Posted: Tue May 04, 2010 11:15 am
by Admin
Последний вопрос - какой тип компиляции предпочтительнее для констант (по умолчанию стоит виртуализация)? Или это по большому счету не существенно?
Если вы защищаете константу не только от нахождения её в ЕХЕ, но и от патча, то лучше использовать виртуализацию или ультру.
Re: Как защитить значения глобальных констант?
Posted: Thu May 06, 2010 6:05 am
by Cyber
Не могли бы вы в будуших версия для функций:
VMProtectDecryptStringA,VMProtectDecryptStringW добавить еще указание типа защиты, чтобы не использовать скрипт и GUI?
И еще вопрос. Я так понимаю что указатель на стринг где то алакается внутри вашей библиотеки защиты. Собственно из своей части программы я его освободить не могу, предусмотрен ли у вас механизм на этот случай?
Re: Как защитить значения глобальных констант?
Posted: Fri May 07, 2010 5:41 am
by Admin
Не могли бы вы в будуших версия для функций:
VMProtectDecryptStringA,VMProtectDecryptStringW добавить еще указание типа защиты, чтобы не использовать скрипт и GUI?
Такого в планах нет.
И еще вопрос. Я так понимаю что указатель на стринг где то алакается внутри вашей библиотеки защиты. Собственно из своей части программы я его освободить не могу, предусмотрен ли у вас механизм на этот случай?
Мы планируем добавить возможность уничтожения строки, указатель на которую получен через VMProtectDecryptStringA/W - скорее всего будет отдельная API типа VMProtectFreeString. В какой именно версии это будет сделано - не могу точно сказать.
Re: Как защитить значения глобальных констант?
Posted: Fri May 07, 2010 7:55 am
by Cyber
Такого в планах нет.
В общем то мне кажется что это было бы полезной фичей, тем более что все равно он может менятся вручную.
Мы планируем добавить возможность уничтожения строки, указатель на которую получен через VMProtectDecryptStringA/W - скорее всего будет отдельная API типа VMProtectFreeString. В какой именно версии это будет сделано - не могу точно сказать.
Тогда меня сейчас интерисует такой вопрос... считается ли что указатель который вернула VMProtectDecryptStringX уходит в утечку памяти?
Re: Как защитить значения глобальных констант?
Posted: Fri May 07, 2010 8:22 am
by Admin
Тогда меня сейчас интерисует такой вопрос... считается ли что указатель который вернула VMProtectDecryptStringX уходит в утечку памяти?
Выделение памяти под строку происходит в момент первого выхова VMProtectDecryptStringX. При последующем вызове VMProtectDecryptStringX выделения памяти не происходит и не совсем понятно что вы понимаете под утечкой.
Re: Как защитить значения глобальных констант?
Posted: Fri May 07, 2010 8:34 am
by Cyber
Выделение памяти под строку происходит в момент первого выхова VMProtectDecryptStringX. При последующем вызове VMProtectDecryptStringX выделения памяти не происходит и не совсем понятно что вы понимаете под утечкой.
Я имел в виду следующий случай:
в исходном бинарном модуле строка хранится в шифрованном виде (если я правильно понимаю идеологию использования этой функции). Когда я хочу получить к ней доступ я использую функцию VMProtectDecryptStringX, которая вернет мне указатель на уже расшифрованную строку. Тоесть в итоге у меня есть указатель на выделенную строку, которую я в своей программе никак не могу освободить, т.к. не знаю способа выделения памяти внутри ваших функций. Тоесть на момент завершения приложения (или на момент выхода из функции) я имею указатель на выделенную область памяти - что и подразумеваю под утечкой.
Re: Как защитить значения глобальных констант?
Posted: Mon May 10, 2010 2:52 pm
by Admin
Тоесть на момент завершения приложения (или на момент выхода из функции) я имею указатель на выделенную область памяти - что и подразумеваю под утечкой.
Если рассматривать случай с завершения приложения (актуально для DLL/SYS файлов), то действительно будем иметь утечку памяти в пределах процесса (для SYS - в системной памяти). Мы планируем в версии 2.06 (через одну версию) устранить все эти недостатки и предоставить пользователю возможность самому уничтожать декриптованные строки.
Re: Как защитить значения глобальных констант?
Posted: Sun May 16, 2010 7:41 pm
by Cyber
то действительно будем иметь утечку памяти в пределах процесса (для SYS - в системной памяти).
Плохо... Verifier будет ругатся BSOD-ом!!!
Да и еще было бы хорошо, если в будущем функция VMProtectDecryptStringX будет еще и возвращать длину раскриптованой строки.