运行定义为变量的函数

时间:2011-03-15 19:09:43

标签: c

我有一个用C编写的程序,它包含2个函数,一个函数是main(),另一个函数是预编译函数,它存储为字节数组(让我们称之为varFunc())。指向数组的指针在main函数中转换为函数指针,然后从main函数调用它。 (见下面的代码)

现在,我知道有些操作系统和一些处理器不允许从数据部分执行代码,我的varFunc应该就在那里......

有没有办法使用C语言让C编译器在代码/文本部分添加一些变量?如果没有,有没有办法在大多数编译器中通过编译器强制执行?

    char varFuncArr[] = { 0xDE, 0x67, 0x6F, 0x6F, 0xAC, 0x13, 0x05, 0x01, 0xDA, 0xF0, 0xBD, 0x79, 0xA9, 0x10, 0x00, 0x00, 0xB8, 0x74, 0x00, 0x00, 0x00, 0x3F, 0x58, 0x13, 0xEA, 0x0A, 0x2E, 0xEE, 0xC7, 0x01, 0x05, 0xD0, 0x6E, 0xB8, 0x9E};

    typedef unsigned long (*funcPtr)(void* d[]);

    int main(int argc, char** argv)
    {
        unsigned int ra[8];
        funcPtr varFunc;
        for (i=0; i<8; i++)
             ra[i] = 0;
        varFunc = (funcPtr)varFuncArr;
        return varFunc(ra);
    }

注1:我知道这是一个非常笨拙的方式来调用一个函数,它也使它成为超级平台和编译器,但我展示这个例子使其更简单,实际使用包括一个加密函数而不是varFuncArr()

注2:不要尝试运行此代码,在此示例中对varFuncArr进行了加密:)

谢谢, 本雅明

2 个答案:

答案 0 :(得分:5)

在GCC上,您可以使用__attribute__((section("text")))将某些内容放入特定部分;有关文档,请参阅here。 Visual C ++有__declspec(allocate("section"));有关文档,请参阅here

答案 1 :(得分:3)

除了Jeremiah Willcock关于使用编译器属性的建议之外,你可以mmap一点内存并请求它的执行权限,然后在调用之前将数据复制到那里。

您将交换平台可移植性(Posix / Windows)以实现编译器可移植性(gcc / ...),因为它不依赖于特定的编译器,而是依赖于标准的Posix函数。