C:将预编译的代码块存储为char[],然后执行



我想知道是否有可能将一大块编译后的代码存储为char[],然后以某种方式执行它。

unsigned char my_code[5] = {124,231,75,123,0};
asm("jal my_code");
  • 这可能吗?
  • 这个奇怪的东西有名字吗,有没有文章解释它?

谢谢

在标准C中,答案是不,代码不是数据

也就是说,如果字符数组包含完整的可执行文件,您可以将其写入文件,然后执行该文件(例如使用system())。如果它不是一个完整的可执行文件(只有一些指令),你可以把它变成一个完整的可执行文件。

这在过去比较容易,编译器接受

char main[] = { 42, 68, 0xcb, 0xdd, 0, 4, 74, 59 }; /* not a real program */

并创建了一个可执行程序:-)

是有可能的。例如,许多框架使用这种技术来实现代码。诀窍是确保分配的内存块被标记为可执行的。在Windows上,这意味着用VirtualAlloc()分配内存,然后用VirtualProtect()授予PAGE_EXECUTE权限。您可以将CPU操作码存储在内存中,声明一个指向内存的函数指针,然后像调用其他函数一样调用它。

相关内容

  • 没有找到相关文章

最新更新