作为一个实验,我正在尝试编写下面的程序,它允许我在运行时生成代码。i、 e.我做以下工作:
用我要执行的指令的操作码填充缓冲区。
2
声明一个函数指针并使其指向缓冲区的开始。
三。
代码如下:
(根据以下安德烈的指示进行了更新。)
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
//#include <sys/mman.h>
int main(int argc, char *argv[])
{
int u32;
int (*ptr)(void);
uint8_t *buf = malloc(1000);
//uint8_t *buf = mmap(NULL, 1000, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
buf[0] = 0xb8;
u32= 42;
memcpy(buf + 1, &u32, 4);
buf[5] = 0xc3;
ptr = (int (*)(void)) buf;
printf("return is %d\n", ptr());
return 0;
}
这段代码在使用gcc的linux机器上编译得很好。
现在我将它迁移到windows(visualstudio-2010)。
mmap公司
功能由提供
和
在窗户上。
我在网上查过MSDN和其他文件,
但是我仍然无法找到一种方法让这个程序在windows上的VS-2010上运行。
更新:
@安德烈谢谢你。它现在似乎起作用了。虽然我得到以下错误:
1>MSVCRTD.lib(crtexew.obj) :
error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
1>file.exe : fatal error LNK1120: 1 unresolved externals
Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped
mmap()
virtualAlloc()
现在。
虚拟语言()
我想是吧。