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

Issues related to VMProtect
Post Reply
Leonardo
Posts: 1
Joined: Wed Dec 12, 2012 10:32 am

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

Post by Leonardo »

Добрый день.

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

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

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

Post 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();
Post Reply