mprotect API в OS X Tiger

Я пытаюсь использовать API mprotect на MacOSX 10.4 (тигр), я пробовал все возможные известные мне способы, он всегда возвращает -1 с ошибкой 13, что означает «отказано в доступе», пока я пытаюсь добавить разрешение на запись в некоторый исполняемый код.

Тот же код точно работает на MacOS X 10.5 (leopard).

код довольно простой

int ret = mprotect((void*)pFunc, 4096, PROT_WRITE | PROT_EXEC);

где pFunc — адрес любой функции, загруженной в адресное пространство процесса. Я пытался удалить PROT_EXEC перед добавлением права доступа PROT_WRITE, но безуспешно. Я также попытался выровнять pFunc с размером страницы памяти, но тоже не повезло.

Любая идея, как заставить это работать?


person Community    schedule 27.02.2009    source источник
comment
+1, у меня была точно такая же проблема, и в конце концов я просто исключил OSX из списка поддерживаемых.   -  person Tim Post♦    schedule 27.02.2009
comment
Покажите полную программу, которая создает проблему.   -  person stepancheg    schedule 10.05.2009


Ответы (4)


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

person johnny    schedule 04.03.2009

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

person 1800 INFORMATION    schedule 27.02.2009
comment
vm_protect возвращает KERN_PROTECTION_FAILURE, так как новая защита повысила максимальную защиту по сравнению с существующей максимальной защитой. Я не знаю, как изменить максимальную защиту по умолчанию? - person ; 02.03.2009
comment
выполняя vmmap для обработки, я вижу, что страница виртуальной памяти, содержащая pFunc, имеет максимальное разрешение rx, в то время как я вижу, что другие исполняемые страницы виртуальной памяти имеют разрешение rwx, есть идеи, как изменить это для моих исполняемых страниц? Спасибо за аванс - person ; 02.03.2009

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

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

person John Zwinck    schedule 28.02.2009
comment
У меня есть разрешение на запись в исполняемые области леопарда (что более безопасно и т. д.). Я пытаюсь сделать что-то похожее на то, что Microsoft делает в Windows. - person ; 02.03.2009

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

Чтобы писать в него, пометьте его как WRITE, но не EXEC.

person Zan Lynx    schedule 08.05.2009