Указатели функций в VS-2010 (+ вызов Virtual Alloc) - PullRequest
1 голос
/ 15 сентября 2010

В качестве эксперимента я пытаюсь написать следующую программу, которая позволяет мне генерировать код во время выполнения.то есть я делаю следующее:

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() я думаю.

1 Ответ

2 голосов
/ 15 сентября 2010

Вы получаете эту ошибку, потому что вы пытаетесь объявить ptr в середине блока.

Классический язык ANSI C (C89 / 90) не разрешает объявления в середине блока. Объявления должны находиться в начале блока. Объявление переменных в середине разрешено только в C99.

Компилятор GCC, даже в режиме C89 / 90, позволяет объявлять переменные в середине как нестандартное расширение. Компилятор MSVC является строгим компилятором C89 / 90, он не допускает таких объявлений.

...