它是标准的C ++

时间:2012-08-23 17:52:36

标签: c++

此代码以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++代码?

2 个答案:

答案 0 :(得分:7)

我会采用'标准'来排除扩展但不是实现定义的行为(这几乎是不可能避免的)或有条件支持的功能。

不,该示例不是标准的,因为__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将其添加为有条件支持的功能。)

答案 1 :(得分:4)

不是,__asm不是标准。

然而,

asm是。

另请注意,它是实现定义的:

  

asm声明的格式为

     

asm-definition:

     

asm ( string-literal ) ;

     

asm声明是有条件支持的;它的含义是实现定义的。 [注意:通常它习惯于    通过实现将信息传递给汇编程序。 - 后注]