我想知道是否有可能将一大块编译后的代码存储为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操作码存储在内存中,声明一个指向内存的函数指针,然后像调用其他函数一样调用它。