В комментарии не хватило места. Joe_Muc правильно. Вы не должны вставлять в память код, полученный с помощью malloc
или new
. Вы столкнетесь с проблемами, если измените свойства страниц страниц, которые выделяет Windows.
Это не проблема, поскольку использование VirtualAlloc () и связанных с ним API-интерфейсов WIn32 очень просто: вызовите VirtualAlloc () и установите для flProtect
значение [PAGE_EXECUTE_READWRITE][2]
Обратите внимание, что вам, вероятно, следует выполнить три выделения: одну защитную страницу, страницы, необходимые для вашего кода, а затем еще одну защитную страницу. Это даст вам небольшую защиту от плохого кода.
Также переносите вызовы в ваш сгенерированный код с помощью структурированной обработки исключений .
Далее, Windows X86 ABI (соглашения о вызовах) недостаточно хорошо документированы (я знаю, я посмотрел). Здесь есть некоторая информация , здесь , здесь Лучший способ увидеть, как все работает, - посмотреть на код, сгенерированный компилятором. Это легко сделать с помощью переключателей \FA
(их четыре).
Вы можете найти 64-битные соглашения о вызовах здесь .
Кроме того, вы все равно можете получить Microsoft Macro Assembler MASM здесь . Я рекомендую записать ваш машинный код в MASM и посмотреть на его вывод, а затем заставить ваш генератор машинного кода делать подобные вещи.
Руководства для процессоров Intel и от AMD - хорошие справочные материалы - получите их, если у вас их нет.