我正在尝试在MacOSX 10.4(老虎)上使用mprotect API,我尝试了所有可能的方式,我知道,它总是返回-1,错误13,这意味着“权限被拒绝”,而我正在尝试添加写一些可执行代码的权限。
相同的代码完全适用于MacOS X 10.5(leopard)。
代码非常简单
int ret = mprotect((void*)pFunc, 4096, PROT_WRITE | PROT_EXEC);
其中pFunc是进程地址空间中加载的任何函数的地址。我在添加PROT_WRITE访问权限之前尝试删除PROT_EXEC,但没有运气。我也尝试将pFunc与内存页面大小对齐,没有运气..
知道如何使其正常工作吗?
答案 0 :(得分:1)
您尝试修改mmap的内存是否来自可执行文件? mprotect的手册页(在Linux上)似乎表明这会阻止你修改(PROT_WRITE)内存位置。
答案 1 :(得分:0)
我对OSX一无所知。那就是说,你能使用Mach函数vm_protect吗?
答案 2 :(得分:0)
您无权写入可执行区域。无论如何,你为什么要这样做?
我确信这适用于某些平台,但不是全部。你想做什么?
答案 3 :(得分:0)
这是另一个想法。尝试在没有WRITE的情况下将其标记为EXEC。我认为否认write + exec可能是一个安全功能。
要写入,然后将其标记为WRITE但不是EXEC。