void(*)()在代码中的含义是什么

Joh*_*ith 1 c c++ void shellcode

我今天在一些fb配置文件中看到了这段代码,并且无法理解这是什么以及它是如何工作的: -

(*(void(*)()) shellcode)()
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下,上面的代码是什么意思?

下面的完整代码片段: -

#include <stdio.h>
#include <string.h>

char *shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69"
          "\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";

int main(void)
{
fprintf(stdout,"Length: %d\n",strlen(shellcode));
(*(void(*)()) shellcode)();
return 0;
}
Run Code Online (Sandbox Code Playgroud)

Bas*_*tch 8

它是对函数指针的强制转换(没有返回结果且没有参数).我更喜欢typedef用来定义这些函数的签名:

 typedef void plainsig_t(void);
Run Code Online (Sandbox Code Playgroud)

然后简单地编码

 (*(plainsig_t*)shellcode) ();
Run Code Online (Sandbox Code Playgroud)

对于函数指针,您不需要取消引用它们,因此只需编写代码:

 ((plainsig_t*) shellcode) ();
Run Code Online (Sandbox Code Playgroud)

它基本上调用机器代码位于shellcode内存区域内的函数.

顺便说一句,这不是严格的可移植C.原则上,不能保证你可以将数据指针强制转换为函数指针.(在一些奇怪的处理器上 - 例如嵌入式微控制器,DSP,20世纪70年代的计算机 - ,代码和数据位于不同的地址空间,或者具有不同的指针大小等......).但是大多数常见的处理器和ABI(x86-64/Linux,ARM/Android,......)具有相同的代码和数据地址空间,并接受向数据指针的转换函数指针,反之亦然.

  • @Johnsmith没有结果意味着没有返回值。它确实已执行。 (2认同)

Jer*_*fin 6

这是C和C++不同的地方.

在C中,它表示指向函数的指针,该函数返回void并获取未指定数量的未指定类型的参数.

在C++中,它表示指向返回void且不带参数的函数的指针.

表达式作为一个整体获取地址shellcode,将其转换为指向函数类型的指针,然后调用该函数 - 即,执行该字符串中的操作码.


Ted*_*opp 5

void(*)()意思是“指向不带参数的 void 函数的指针”。线路

(*(void(*)()) shellcode)();
Run Code Online (Sandbox Code Playgroud)

正在转换shellcode为这样的函数指针,取消引用该指针(实际上不必要),然后调用该函数。