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.

Другие вопросы по тегам