実験として、実行時にコードを生成できる次のプログラムを作成しようとしています。つまり、私は次のことを行います:
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のvirtualAllocとvirtualProtectによって提供されます。
私はネット上の 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()
思います。