1

作爲一個試驗,我正在嘗試編寫下面的程序,它允許我在運行時生成代碼。即我做到以下幾點: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()我猜。

+0

2600Hertz:你得到的錯誤是什麼? – 2010-09-15 04:13:58

回答

2

由於您試圖在塊的中間聲明ptr,所以出現此錯誤。

傳統的ANSI C語言(C89/90)不允許在塊的中間聲明。聲明必須駐留在塊的開頭。在C99中只允許在中間聲明變量。

即使在C89/90模式下,GCC編譯器也允許在中間聲明變量作爲非標準擴展。 MSVC編譯器是一個嚴格的C89/90編譯器,它不允許這樣的聲明。

+0

謝謝:)現在挖掘到MSDN的virtualAlloc調用語法和參數。非常感謝!! – TheCodeArtist 2010-09-15 04:42:01