这段代码用C
编写:
int main(){
char Demoshellcode[] ="\xEB\x5D\x5F\x8B\xF7\x80\x3F";
void* addr=0;
addr=&Demoshellcode[0];
__asm call addr
return 0;
}
我们可以将其也视为标准的
C++
代码吗?如果不是,需要进行哪些修改才能使其成为标准的C++
代码? 最佳答案
我将采用“标准”来排除扩展,但不排除实现定义的行为(无论如何都很难避免)或有条件支持的功能。
不,该示例不是标准的,因为__asm
是扩展。您必须使用标准的asm(...)
(具有实现定义的行为),但是VC++不支持asm()
。
您还可以将指针转换为函数指针(在C++ 11中有实现定义的行为有条件地支持该指针)并进行调用。
int main() {
char Demoshellcode[] ="\xEB\x5D\x5F\x8B\xF7\x80\x3F";
void (*func_ptr)(void) = reinterpret_cast<void (*)(void)>(&Demoshellcode);
func_ptr();
}
我实际上不知道上述行为是否在任何实现上都符合预期。在现代系统上,您必须处理NX位(该位允许标记内存,使得无法执行该内存中存储的指令)。
(将对象指针转换为函数指针是C++ 03的扩展,但C++ 11将其添加为有条件支持的功能。)
关于c++ - 它是标准的C++吗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12097407/