我正在编写一个模拟器,我需要将机器代码直接写入内存,然后跳转到(调用)它。我用mmap分配内存,然后将代码写入其中。除了“ret”或“nop”指令之外的任何其他段落。我知道mmap返回时没有错误,我已经在一个示例中将问题隔离开来,以便说明问题。
#include <stdio.h>
#include <sys/mman.h>
#include <stdint.h>
int main()
{
uint8_t *data = mmap(NULL, 3 * sizeof(uint8_t), PROT_EXEC|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0), *p;
p = data;
if(data) {
*p++ = 0xb8; //mov $1, %eax
*p++ = 0x01;
*p++ = 0xC3; //ret
} else
perror("mmap");
uint8_t (*fp)();
fp = (void*) (data);
printf("%u\n",(uint8_t) fp());
return 0;
}
该示例产生问题。帮助
编辑:我应该提到我在Linux 2.6,x86上。
答案 0 :(得分:5)
您的操作码不正确,这有效:
if(data) {
*p++ = 0xb8; //mov $1, %eax
*p++ = 0x01;
*p++ = 0x00;
*p++ = 0x00;
*p++ = 0x00;
*p++ = 0xC3; //ret
}
0xb8将32位立即移入eax,因此您必须指定所有4个字节。