1、實際上就是讓某個函數指針指向一堆已經翻譯好的機器碼,然後執行該函數。
#include <stdio.h>
/**
* code資料中儲存的一串資料,正好是機器碼指令編碼,CPU可以直接執行
* (1)對于計算機,一個資料既可以當作指令執行,也可以被當做一個資料
* (2)當這個資料被CS:IP段寄存器指向時,就可以當做代碼執行
**/
const unsigned char code[]="\x55\x89\xe5\x86\x45\x0c\x8b\x55\x08\x01\xd0\x5d\xc3";
int main(){
int a=5;
int b=3;
int (*fun)(int,int);//定義函數指針
fun=(void*)code;//初始化函數指針,将其指向code機器碼的入口
int r=fun(a,b);
printf("r=%d\n",r);
return 0;
}
2、code機器碼對應的彙編代碼如下
55 push %ebp
89 e5 mov %esp,%ebp
8b 45 0c mov 0xc(%ebp),%eax
8b 55 08 mov 0x8(%ebp),%edx
01 d0 add %edx,%eax
5d pop %ebp
c3 ret