- Загрузка кода в память.
- Либо создайте указатель функции на эту память и вызовите его (
void (*foo)(void) = mmap(...)
, foo();
), либо используйте встроенную сборку для "jmp" кода.
Обратите внимание, что в более новых системах вам необходимо убедиться, что вы запросили память, в которой НЕ установлен бит NX (без выполнения).Если установлен NX, переход к вашему коду вызовет исключение процессора, и ваш процесс будет остановлен.
В Linux это флаг mmap, в Windows есть другие способы запросить незащищенную DEP память.
Ваш код также не должен полагаться на фиксированные адреса, то есть он должен быть независимым от позиции.Вы не можете гарантировать тот же адрес загрузки.
Если ваш код должен вызываться в вашей программе, лучше всего предоставить ему таблицу через вызов функции, где он может разрешить адреса функций вашего исполняемого файла или библиотеки C, или попытаться использовать системный компоновщик (вывозможно, вам повезет с использованием функциональности ld.so
в Linux, но это, конечно, непереносимо).