Как я могу запустить машинный код из моей программы - PullRequest
2 голосов
/ 30 декабря 2010

Как мне запустить машинный код из моей программы на C?

Допустим, у меня есть инструкция 'B2', как я могу ее выполнить?(обратите внимание, что инструкции будут меняться во время выполнения)

1 Ответ

5 голосов
/ 30 декабря 2010
  1. Загрузка кода в память.
  2. Либо создайте указатель функции на эту память и вызовите его (void (*foo)(void) = mmap(...), foo();), либо используйте встроенную сборку для "jmp" кода.

Обратите внимание, что в более новых системах вам необходимо убедиться, что вы запросили память, в которой НЕ установлен бит NX (без выполнения).Если установлен NX, переход к вашему коду вызовет исключение процессора, и ваш процесс будет остановлен.

В Linux это флаг mmap, в Windows есть другие способы запросить незащищенную DEP память.

Ваш код также не должен полагаться на фиксированные адреса, то есть он должен быть независимым от позиции.Вы не можете гарантировать тот же адрес загрузки.

Если ваш код должен вызываться в вашей программе, лучше всего предоставить ему таблицу через вызов функции, где он может разрешить адреса функций вашего исполняемого файла или библиотеки C, или попытаться использовать системный компоновщик (вывозможно, вам повезет с использованием функциональности ld.so в Linux, но это, конечно, непереносимо).

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