API mprotect на OS X Tiger - PullRequest
       18

API mprotect на OS X Tiger

3 голосов
/ 27 февраля 2009

Я пытаюсь использовать 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 ]

1 голос
/ 04 марта 2009

Память, которую вы пытаетесь изменить mmap'd из исполняемого файла? Страница man для mprotect (в Linux), похоже, указывает, что это помешает вам изменить (PROT_WRITE) расположение в памяти.

0 голосов
/ 08 мая 2009

Вот еще одна идея. Попробуйте пометить его EXEC без ЗАПИСИ. Я думаю, что отказ от записи + exec может быть функцией безопасности.

Чтобы написать в него, пометьте его как ЗАПИСЬ, но не EXEC.

0 голосов
/ 28 февраля 2009

У вас нет разрешения на запись в исполняемые регионы. В любом случае, почему ты должен?

Я уверен, что это работает на некоторых платформах, но не на всех. Что ты пытаешься сделать?

0 голосов
/ 27 февраля 2009

Я ничего не знаю о OSX. Тем не менее, вы можете использовать функцию Маха vm_protect ?

...