gpt4 book ai didi

c++ - 代码中void(*)()是什么意思

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:05:05 34 4
gpt4 key购买 nike

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

(*(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;
}

最佳答案

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

 typedef void plainsig_t(void);

然后简单的写代码

 (*(plainsig_t*)shellcode) ();

对于函数指针,你不需要解引用它们,所以只写代码更短:

 ((plainsig_t*) shellcode) ();

基本上是调用机器码位于shellcode内存区的函数。

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

关于c++ - 代码中void(*)()是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18448204/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com