有没有办法获取函数的大小并为其复制和执行分配内存?
Is there a way to obtain size of function and allocate memory for it to be copied and executed?
在C或C++中,是否可以获取函数占用的大小,为它动态分配内存malloc()
,复制一份,然后用函数指针强制转换执行?
我只是对此感到好奇,这里是一个不起作用的例子:
#include <stdio.h>
int main(void)
{
void *printf_copy = malloc(sizeof(printf));
((int(*)(const char *, ...))printf_copy)("%s\n", "hello, world");
return 0;
}
首先,您无法通过这种方式获取函数使用的代码的大小,因为没有 C 运算符或函数。唯一的方法是从 ELF headers 等获取它。注意一个函数可能会调用其他函数,因此您通常需要某种链接......并且该函数代码可能不是相对的!
其次,获得一些可执行内存的唯一方法是通过 mmap
,malloc
只给你堆内存,通常不是进程的可执行部分 space。
除非代码是自修改的(如果是的话,你是一个非常糟糕的开发者),复制一个函数是没有意义的,即使你可以安全地这样做 - 复制的总是看起来和原来的一模一样,那为什么要这样做呢?正如其他人所解释的那样,有很多理由避免尝试。
如果你想通过指针执行一个函数,就在它所在的地方调用它。如果你想让它自己执行,把它线程化。
在C或C++中,是否可以获取函数占用的大小,为它动态分配内存malloc()
,复制一份,然后用函数指针强制转换执行?
我只是对此感到好奇,这里是一个不起作用的例子:
#include <stdio.h>
int main(void)
{
void *printf_copy = malloc(sizeof(printf));
((int(*)(const char *, ...))printf_copy)("%s\n", "hello, world");
return 0;
}
首先,您无法通过这种方式获取函数使用的代码的大小,因为没有 C 运算符或函数。唯一的方法是从 ELF headers 等获取它。注意一个函数可能会调用其他函数,因此您通常需要某种链接......并且该函数代码可能不是相对的!
其次,获得一些可执行内存的唯一方法是通过 mmap
,malloc
只给你堆内存,通常不是进程的可执行部分 space。
除非代码是自修改的(如果是的话,你是一个非常糟糕的开发者),复制一个函数是没有意义的,即使你可以安全地这样做 - 复制的总是看起来和原来的一模一样,那为什么要这样做呢?正如其他人所解释的那样,有很多理由避免尝试。
如果你想通过指针执行一个函数,就在它所在的地方调用它。如果你想让它自己执行,把它线程化。