复制内存中的函数并执行它

Eli*_*ton 6 c memory copy execute

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

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

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);
Run Code Online (Sandbox Code Playgroud)

谢谢你的回答

Eug*_*ith 6

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

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

  • 总是可以从`.o`文件执行重定位.尽管编写自己的链接器很有乐趣.:-) (2认同)
  • 通过使用函数的名称,可以轻松获得函数的起始地址.函数的*length*是另一回事. (2认同)