作爲一個試驗,我正在嘗試編寫下面的程序,它允許我在運行時生成代碼。即我做到以下幾點:VS-2010中的函數指針(+虛擬Alloc調用)
1.用我要執行的指令的操作碼填充一個緩衝區。
2.聲明一個函數指針並使其指向緩衝區的開始位置。
3.使用上面的func-ptr調用函數。
的代碼如下:(已更新按照下面AndreyT的說明書)
#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(visual-studio-2010)。
AFAIK,MMAP功能由的VirtualAlloc和窗戶VirtualProtect的提供。
我已經通過網絡上的MSDN和其他文檔,
,但我仍然無法找到一種方法讓此程序在Windows上的VS-2010上運行。
UPDATE:
@AndreyT謝謝。它現在似乎在工作。雖然我得到以下錯誤:
1>MSVCRTD.lib(crtexew.obj) :
error LNK2019: unresolved external symbol [email protected] referenced in function ___tmainCRTStartup
1>file.exe : fatal error LNK1120: 1 unresolved externals
Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped
我想我現在需要用virtualAlloc()
來交換mmap()
電話。
非常感謝大家。接下來我需要深入挖掘MSDN的virtualAlloc()
我猜。
2600Hertz:你得到的錯誤是什麼? – 2010-09-15 04:13:58