我正在开发一个项目,其中动态库(.so
)在运行时(动态检测)注入到某个目标程序中。该库使用mmap/munmap
. 出于安全原因,要求库中的某些映射区域只能通过库中公开的 API 写入。
我们所做的是在库函数的序言/结尾处使用和切换内存区域的写入标志,例如:mprotect
PROT_WRITE
void foo(void) {
mprotect(addr, PAGE_SIZE, PROT_READ | PROT_WRITE);
...
...
mprotect(addr, PAGE_SIZE, PROT_READ);
}
这适用于单线程应用程序。对于多线程应用程序,如果在设置后发生上下文切换(到同一进程中的不同任务)PROT_WRITE
(因此内存是可写的)和在它被清除之前。
所以,问题是:是否可以在foo
返回之前禁用进程中的其他任务?如果没有,你建议如何解决这个问题?