我开始使用vmprotect sdk来保护我的应用程序,但我遇到了一些问题,最大的问题是编译器优化 - 它正在优化我的标记,看一看示例:
void *CaptureInterface( char *pszInterfaceName )
{
VMProtectBeginMutation( "capture_interface" );
void* ptr = 12345;
...
...
...
VMProtectEnd( );
return ptr;
}
我尝试了各种组合,VMProtectEnd在返回之前,之后,但编译器一直在优化VMProtectEnd函数,因此在反汇编中看不到调用,因此标记开始不配对,我无法保护我的应用程序。有没有办法为1或2个函数转换优化相关的东西?或者有没有其他方法告诉编译器不要触摸该标记但继续优化其他标记?
答案 0 :(得分:2)
您正在寻找#pragma optimize
预处理程序指令。
请参阅,例如https://msdn.microsoft.com/en-us/library/chh3fb0k.aspx
答案 1 :(得分:2)
这些事情无论如何都无济于事,我个人担心,如果他们能够做到这样一个基本的事情,那么他们将对你的代码做什么呢?真的> em>调试很有趣。
但无论如何,如果你想避免他们优化代码,我可能会做一些内联汇编来进行调用:
static void foo() {
}
void test() {
std::cout << "Hello World\n";
foo();
std::cout << "Goodbye world\n";
}
void test2() {
std::cout << "Hello World\n";
__asm {
call foo;
}
std::cout << "Goodbye world\n";
}
在VS2015中使用/ O2不会优化对test2中foo的调用。但是,这仅限于x86代码,因为据我所知,微软不再支持x64的内联汇编。
如果对函数的调用不仅仅是对运行时的提示,而是调用本身是重要的,那么你可以使用函数指针以便携方式实现这一点。 。我对使用过的图书馆的内部空间了解不多,但不知道是否属于这种情况。