在内存中复制一个函数并执行它

标签 c memory copy execute

我想知道在 C 中如何将函数的内容复制到内存中并执行它?

我正在尝试做这样的事情:

typedef void(*FUN)(int *);
char * myNewFunc;

char *allocExecutablePages (int pages)
{
    template = (char *) valloc (getpagesize () * pages);
    if (mprotect (template, getpagesize (), 
          PROT_READ|PROT_EXEC|PROT_WRITE) == -1) {
        perror ("mprotect");
    } 
}

void f1 (int *v) {
    *v = 10;
}

// allocate enough spcae but how much ??
myNewFunc = allocExecutablePages(...)

/* Copy f1 somewere else
 * (how? assume that i know the size of f1 having done a (nm -S foo.o))
 */

((FUN)template)(&val);
printf("%i",val);

感谢您的回答

最佳答案

您似乎已经弄清楚了有关保护标志的部分。如果您知道函数的大小,现在您可以执行 memcpy() 并将 f1 的地址作为源地址传递。

一个重要的警告是,在许多平台上,您将无法从您正在复制的函数 (f1) 中调用任何其他函数,因为相对地址被硬编码到函数的二进制代码中,并移动它到不同的位置,内存会使这些相对地址变坏。

关于在内存中复制一个函数并执行它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4546071/

相关文章:

c - 对整数圆形数组进行排序,交换元素之间的元素为 1

c - 保护内存中的凭据

winapi - VirtualAlloc 和 HeapAlloc 有什么区别?

ios - IOS7和 "Terminated due to Memory Pressure"中的内存管理

iphone - 从后台返回后,iOS应用程序因内存警告而崩溃,但之前没有?

java - 传递一个字符串列表作为参数,更新其所有内容并将其数据保留到 Java 的主程序中

c - 使用popen的非阻塞管道?

c - union 和 structure 的 'Tag' 有什么作用?

java - Android中SdCard路径的正确路径?

c++ - undefined reference 复制ctor和ctor