这段代码写在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++
代码?
这段代码写在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 将其添加为有条件支持的功能。)
不是,__asm
不是标准。
asm
,然而,是。
另请注意,它是实现定义的:
asm 声明的形式为
asm-definition:
asm ( string-literal ) ;
asm 声明是有条件支持的;它的含义是实现定义的。[注意:通常它用于通过实现将信息传递给汇编器。——尾注]