1

実験として、実行時にコードを生成できる次のプログラムを作成しようとしています。つまり、私は次のことを行います:

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) に移行しています。

私の知る限り、mmap機能は、 WindowsのvirtualAllocvirtualProtectによって提供されます。

私はネット上の MSDN やその他のドキュメントを調べてきました
が、このプログラムを Windows 上の VS-2010 で実行する方法をまだ見つけられていません。


アップデート:

@AndreyTありがとう。それは今働いているようです。次のエラーが表示されますが:

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()います。
どうもありがとうございました。次に、MSDN を掘り下げる必要があるとvirtualAlloc()思います。

4

1 に答える 1

2

ptrブロックの途中で宣言しようとしているため、このエラーが発生しています。

従来の ANSI C 言語 (C89/90) では、ブロックの途中で宣言を行うことはできません。宣言はブロックの先頭に置く必要があります。途中で変数を宣言することは、C99 でのみ許可されています。

GCC コンパイラは、C89/90 モードであっても、途中で変数を非標準拡張として宣言できます。MSVC コンパイラは厳密な C89/90 コンパイラであり、そのような宣言は許可されていません。

于 2010-09-15T04:25:26.347 に答える