Page 1 of 1

Метки кода и оптимизиция

Posted: Wed Dec 12, 2012 10:45 am
by Leonardo
Добрый день.

Мы рассматриваем ваш продукт как возможный вариант для защиты нашего ПО.
Нас интересует более тонкая и плотная интеграция нашего ПО с вашей защитой, поэтому мы пробуем использовать метки кода для выделения критических блоков кода.
Как и указано в документации и примерах, мы используем пары: VMProtectBegin(имя) + VMProtectEnd.
В Debug-сборке все в порядке, все помеченные блоки отлично определяются и обрабатываются защитой.
Однако в Release-сборке возникают проблемы с определением границ выделенных блоков кода. Мы уверены, что это связано с оптимизацией, так как в ваших примерах используются конструкции #pragma optimize("g", off) для отключения оптимизации.

Скажите пожалуйста, есть ли возможность "победить" компилятор MSVC в том плане, чтобы он не искажал границы блоков кода при включенной оптимизации? Нам бы очень не хотелось принудительно отключать оптимизацию ради этого.

Re: Метки кода и оптимизиция

Posted: Fri Dec 14, 2012 5:17 am
by Admin
Основная причина непарных маркеров в том, что компилятор вместо линейного кода может делать несколько веток со своим VMProtectEnd(). Для х32 в целом можно победить оптимизацию если добавить перед VMProtectEnd() ассемблерную вставку:

Code: Select all

	_asm _emit 0x90 // nop
	VMProtectEnd();
Для х64 невозможно использование директивы _asm, поэтому немного поэкспериментировав с доступным список асмовых команд получилось вот такое решение:

Code: Select all

#ifdef _WIN64
	int cpu[4];
	__cpuid(cpu, 0);
#else
	_asm _emit 0x90 // nop
#endif
	VMProtectEnd();