这段代码用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/

10-11 22:51
查看更多