API mprotect на OS X Tiger
Я пытаюсь использовать mprotect API на MacOSX 10.4 (тигр), я пробовал все возможные способы, которые я знаю, он всегда возвращает -1, с errno 13, что означает "отказано в разрешении", когда я пытаюсь добавить разрешение на запись в некоторый исполняемый код.
Тот же код точно работает на MacOS X 10.5 (леопард).
код довольно прост
int ret = mprotect((void*)pFunc, 4096, PROT_WRITE | PROT_EXEC);
где pFunc - адрес любой функции, загруженной в адресное пространство процесса. Я пытался удалить PROT_EXEC перед добавлением права доступа PROT_WRITE, но безуспешно. Я также попытался выровнять pFunc с размером страницы памяти, не повезло, ни..
Есть идеи, как заставить это работать?
4 ответа
Память, которую вы пытаетесь изменить mmap'd из исполняемого файла? Страница man для mprotect (в Linux), похоже, указывает, что это помешает вам изменить (PROT_WRITE) расположение в памяти.
У вас нет разрешения на запись в исполняемые регионы. Во всяком случае, почему ты должен?
Я уверен, что это работает на некоторых платформах, но не на всех. Что ты пытаешься сделать?
Я ничего не знаю о OSX. Тем не менее, вы можете использовать функцию Маха vm_protect?
Вот еще одна идея. Попробуйте пометить его EXEC без ЗАПИСИ. Я думаю, что отказ от записи +exec может быть функцией безопасности.
Затем, чтобы написать в него, пометьте его как ПИСЬМО, но не EXEC.