此代码以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++
代码?
答案 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声明是有条件支持的;它的含义是实现定义的。 [注意:通常它习惯于 通过实现将信息传递给汇编程序。 - 后注]