它是标准的C++

Aan*_*Aan 1 c++

此代码编写于C:

int main(){
char Demoshellcode[] ="\xEB\x5D\x5F\x8B\xF7\x80\x3F";
void* addr=0;
addr=&Demoshellcode[0];
__asm call addr
return 0;
}
Run Code Online (Sandbox Code Playgroud)

我们还可以将它视为标准C++代码吗?如果没有,需要进行哪些修改才能使其成为标准C++代码?

bam*_*s53 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();
}
Run Code Online (Sandbox Code Playgroud)

我实际上并不知道上述行为是否符合任何实现的要求.在现代系统中,您必须处理NX位(允许对内存进行标记,以便无法执行存储在该内存中的指令).

(将对象指针转换为函数指针是对C++ 03的扩展,但C++ 11将其添加为有条件支持的功能.)