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