void(*)()在代码中是什么意思

约翰·史密斯

我今天在一些fb个人资料中看到了此代码,但无法理解它是什么以及它是如何工作的:

(*(void(*)()) shellcode)()

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

下面的完整代码段:-

#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;
}
巴西勒·斯塔林凯维奇(Basile Starynkevitch)

它是对函数指针的强制转换(没有返回结果,也没有参数)。我更喜欢使用typedef定义此类功能的签名:

 typedef void plainsig_t(void);

然后简单地编码

 (*(plainsig_t*)shellcode) ();

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

 ((plainsig_t*) shellcode) ();

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章