#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
/*
首先我们要知道生成的所谓机器码到底是神马东西。一行看上去只是处理几个数字的代码,蕴含着的就是机器码。
unsigned char[] macCode = {0x48, 0x8b, 0x07};
macCode对应的汇编指令就是:
mov (%rdi),%rax
其实可以看出机器码就是比特流,所以将它加载进内存并不困难。而问题是应该如何执行。
好啦。下面我们就模拟一下执行新生成的机器码的过程。一个求和函数的机器码:
long add(long num) {
return num + 1;
}
//对应的机器码
0x48, 0x83, 0xc0, 0x01,
0xc3
动态的在内存上创建函数之前,我们需要在内存上分配空间。具体到模拟动态创建函数,其实就是将对应的机器码映射到内存空间中。这里我们使用c语言做实验,利用mmap函数来实现这一点。
头文件
#include <unistd.h>
#include <sys/mman.h>
定义函数
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offsize)
函数说明
mmap()用来将某个文件内容映射到内存中,对该内存区域的存取即是直接对该文件内容的读写。
代表映射区域的保护方式,有下列组合:
PROT_EXEC 映射区域可被执行;
PROT_READ 映射区域可被读取;
PROT_WRITE 映射区域可被写入;
*/
//分配内存
void* create_space(size_t
机器码运行
最新推荐文章于 2025-07-03 16:26:58 发布