从数据部分执行一段代码

时间:2014-08-14 15:26:47

标签: c compiler-construction compilation executable program-counter

我想获取一段代码,将其复制到全局数组中并从那里执行。

换句话说,我试图将一堆指令从代码部分复制到数据部分,然后设置程序计数器以继续从数据部分执行程序。

这是我的代码:

#include <stdio.h>
#include <string.h>

typedef void(*func)();

static void code_section_func()
{
    printf("hello");
}

#define CODE_SIZE 73
// I verified this size in the disassembly of 'code_section_func'

static long long data[(CODE_SIZE-1)/sizeof(long long)+1];
// I am using 'long long' in order to obtain the maximum alignment

int main()
{
    func data_section_func = (func)data;
    memcpy((void*)data_section_func,(void*)code_section_func,CODE_SIZE);
    data_section_func();
    return 0;
}

我可能天真地认为它可以工作,所以我很乐意得到解释为什么它没有。

例如,在程序加载到内存后,MMU是否将指令读取限制在进程的内存地址空间内的特定区域(即程序的代码段)?

对于协议,我使用VS2013编译器通过64位操作系统和基于x64的处理器对此进行了测试。

由于

1 个答案:

答案 0 :(得分:4)

Windows(以及许多其他现代操作系统)默认将数据部分设置为读/写/不执行,因此尝试“调用”数据对象将失败。

相反,您应VirtualAlloc PAGE_EXECUTE_READWRITE保护{{1}}一块内存。注意,可能需要使用FlushInstructionCache来确保执行新复制的代码。