Ответ SkepticalEmpiricist был правильным и решил проблему с компиляцией, поэтому я пометил ее как правильную.
Однако мне нужно было создать функцию для выделения исполняемой памяти с помощью VirtualAlloc
:
uint8_t* alloc_executable(uint32_t alloc_size)
{
if(!alloc_size)
return nullptr;
return reinterpret_cast<uint8_t*>(VirtualAlloc(NULL, alloc_size, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE));
}
Моя main
функция:
int main()
{
/*
* nop - 0x90
* ret - 0xC3
*/
uint8_t machinecode[] = {0x90, 0xC3};
uint32_t machinecode_size = ARRAYSIZE(machinecode);
uint8_t* exec_mem = alloc_executable(machinecode_size);
memcpy(exec_mem, bytecode, machinecode_size);
FlushInstructionCache(GetCurrentProcess(), exec_mem, machinecode_size);
auto func = reinterpret_cast<void(*)()>(exec_mem);
func();
return 0;
}
Процесс возвращает 0
без ошибок.
ТАКЖЕ: Очевидно, что это специфично для Windows. Моя target платформа x64 для Windows 10.