0

我想寫一個生成x86機器代碼的程序,但代碼只能運行在32位winxp上。它說「tiny.exe中的0x776315ee未處理的異常:0xC0000005:訪問衝突。」在win7 64bit上,爲什麼?爲什麼我的代碼只能在windows xp 32bit系統上運行?[代碼生成]

#include <stdio.h> 
#include <stdlib.h> 
#include <memory.h> 

int main() 
{ 
    char *code = (char *)malloc(1024); 
    memset(code, 0, 1024); 

    char opcode = 0xB8; 
    memcpy(code, &opcode, sizeof(char)); 

    int oprand = 2; 
    memcpy(code + sizeof(char), &oprand, sizeof(int)); 

    char opret = 0xC3; 
    memcpy(code + sizeof(char) + sizeof(int), &opret, sizeof(char)); 

    typedef void (* func_t)(void); 
    func_t func = (func_t)code; 

    func(); 

    return 0; 
} 

回答

2

在堆上分配的內存不受DEP的影響。它可能在你的XP機器上被禁用,或者它可能是其他的東西,但不管是什麼原因:不是malloc(),你必須調用VirtualAlloc()(至少)PAGE_EXECUTE_READWRITE作爲flProtect來動態分配可以執行代碼的內存。

+0

但請注意,與'malloc'不同,'VirtualAlloc'將大小舍入到頁邊界(可能爲4 KiB)。 – 2015-02-07 12:44:53

相關問題