代码之家  ›  专栏  ›  技术社区  ›  TheCodeArtist

VS-2010中的函数指针(+虚拟分配调用)

  •  1
  • TheCodeArtist  · 技术社区  · 14 年前

    作为一个实验,我正在尝试编写下面的程序,它允许我在运行时生成代码。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() 现在。
    虚拟语言() 我想是吧。

    1 回复  |  直到 11 年前
        1
  •  2
  •   AnT stands with Russia    14 年前

    您得到这个错误是因为您试图声明 ptr 在街区中间。

    经典的ansic语言(C89/90)不允许在块的中间声明。声明必须位于块的开头。只有在C99中才允许在中间声明变量。

    GCC编译器,即使在C89/90模式下,也允许在中间声明变量作为非标准扩展。MSVC编译器是一个严格的C89/90编译器,它不允许这样的声明。