Выполнить кусок кода из раздела данных

Я хочу взять кусок кода, скопировать его в глобальный массив и выполнить его оттуда.

Другими словами, я пытаюсь скопировать кучу инструкций из секции кода в секцию данных, а затем установить счетчик программ, чтобы продолжить выполнение программы из секции данных.

Вот мой код:

#include <stdio.h>
#include <string.h>

typedef void(*func)();

static void code_section_func()
{
    printf("hello");
}

#define CODE_SIZE 73
// I verified this size in the disassembly of 'code_section_func'

static long long data[(CODE_SIZE-1)/sizeof(long long)+1];
// I am using 'long long' in order to obtain the maximum alignment

int main()
{
    func data_section_func = (func)data;
    memcpy((void*)data_section_func,(void*)code_section_func,CODE_SIZE);
    data_section_func();
    return 0;
}

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

Например, после загрузки программы в память MMU ограничивает выбор инструкций определенной областью в адресном пространстве памяти процесса (т. Е. Секцией кода программы)?

Для протокола я проверил это с помощью компилятора VS2013 для 64-битной ОС и процессора на базе x64.

Спасибо

1 ответ

Решение

Windows (и многие другие современные операционные системы) по умолчанию устанавливают раздел данных для чтения / записи / отсутствия выполнения, поэтому попытка "вызвать" объект данных не удастся.

Вместо этого вы должны VirtualAlloc кусок памяти с PAGE_EXECUTE_READWRITE защита. Обратите внимание, это может быть необходимо использовать FlushInstructionCache обеспечить выполнение только что скопированного кода.

Другие вопросы по тегам