Добрый день.
Мы рассматриваем ваш продукт как возможный вариант для защиты нашего ПО.
Нас интересует более тонкая и плотная интеграция нашего ПО с вашей защитой, поэтому мы пробуем использовать метки кода для выделения критических блоков кода.
Как и указано в документации и примерах, мы используем пары: VMProtectBegin(имя) + VMProtectEnd.
В Debug-сборке все в порядке, все помеченные блоки отлично определяются и обрабатываются защитой.
Однако в Release-сборке возникают проблемы с определением границ выделенных блоков кода. Мы уверены, что это связано с оптимизацией, так как в ваших примерах используются конструкции #pragma optimize("g", off) для отключения оптимизации.
Скажите пожалуйста, есть ли возможность "победить" компилятор MSVC в том плане, чтобы он не искажал границы блоков кода при включенной оптимизации? Нам бы очень не хотелось принудительно отключать оптимизацию ради этого.
Метки кода и оптимизиция
Re: Метки кода и оптимизиция
Основная причина непарных маркеров в том, что компилятор вместо линейного кода может делать несколько веток со своим VMProtectEnd(). Для х32 в целом можно победить оптимизацию если добавить перед VMProtectEnd() ассемблерную вставку:
Для х64 невозможно использование директивы _asm, поэтому немного поэкспериментировав с доступным список асмовых команд получилось вот такое решение:
Code: Select all
_asm _emit 0x90 // nop
VMProtectEnd();
Code: Select all
#ifdef _WIN64
int cpu[4];
__cpuid(cpu, 0);
#else
_asm _emit 0x90 // nop
#endif
VMProtectEnd();