#cpp #c #ассемблер
Подскажите, можно ли как-то передать управление программы на C/C++ в произвольный доступный участок памяти? Сделал тестовый пример (mingw, Windows), но не работает, программа аварийно завершается при вызове pw3(5). #includeusing namespace std; void work1(int value){ cout << "work1 " < Ответы
Ответ 1
Можно или нельзя это сделать зависит не только от "правильности" конвертации указателей, но и от свойств подлежащей платформы. Ни одна современная [интерактивная] ОС не позволит вам просто так передавать управление в область данных. Это один из столпов обеспечения безопасности системы. Защита подобного рода (Data Execution Prevention) реализована как на уровне ОС, так и на уровне процессора. Возможно, ваша ОС предоставляет средства для отключения этой защиты. Без отключения этой защиты вам необходимо ОС-зависимыми средствами пометить ваши данные, как выполняемый код, и только после этого передавать туда управление. Но для доступа к соответствующему API ваша программа должна обладать необходимыми (весьма высокими) привилегиями. Отдельно стоит заметить, что вам никто не обещал, что код функции располагается в памяти неким компактным непрерывным образом. Т.е. ваше верование в то, что ваш цикл for копирует в массив funcData именно код функции, ничем не обосновано. Также нет гарантии, что код функции является позиционно-независимым. Если вы специально не обеспечили генерации позиционно-независимого кода, то может получится, что даже в случае успешного копирования кода функции в массив funcData, это код на новом месте все равно не будет вести себя так, как вы ожидаете.
Комментариев нет:
Отправить комментарий