1

这段代码写在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++代码?

4

2 回答 2

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 将其添加为有条件支持的功能。)

于 2012-08-23T17:55:01.263 回答
4

不是,__asm不是标准。

asm,然而,是。

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

asm 声明的形式为

asm-definition:

asm ( string-literal ) ;

asm 声明是有条件支持的;它的含义是实现定义的。[注意:通常它用于通过实现将信息传递给汇编器。——尾注]

于 2012-08-23T17:53:55.513 回答