В качестве эксперимента я пытаюсь написать следующую программу, которая позволяет мне генерировать код во время выполнения.то есть я делаю следующее:
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;
}
Этот код прекрасно компилируется на linux-машине с использованием gcc.
Теперь я переношу его в windows (visual-studio-2010).
AFAIK, mmap Функциональность обеспечивается virtualAlloc и virtualProtect в Windows.
Я прошел через MSDN и другую документацию в сети,
но я все еще не могу найти способ заставить эту программу работать на VS-2010 в Windows.
ОБНОВЛЕНИЕ:
@ 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()
я думаю.