我有一个用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进行了加密:)
谢谢, 本雅明
答案 0 :(得分:5)
在GCC上,您可以使用__attribute__((section("text")))
将某些内容放入特定部分;有关文档,请参阅here。 Visual C ++有__declspec(allocate("section"))
;有关文档,请参阅here。
答案 1 :(得分:3)
除了Jeremiah Willcock关于使用编译器属性的建议之外,你可以mmap
一点内存并请求它的执行权限,然后在调用之前将数据复制到那里。
您将交换平台可移植性(Posix / Windows)以实现编译器可移植性(gcc / ...),因为它不依赖于特定的编译器,而是依赖于标准的Posix函数。