Выполнить кусок кода из раздела данных
Я хочу взять кусок кода, скопировать его в глобальный массив и выполнить его оттуда.
Другими словами, я пытаюсь скопировать кучу инструкций из секции кода в секцию данных, а затем установить счетчик программ, чтобы продолжить выполнение программы из секции данных.
Вот мой код:
#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
обеспечить выполнение только что скопированного кода.