【发布时间】:2015-10-26 07:32:40
【问题描述】:
我正在开发一个项目,其中在运行时将动态库 (.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 返回之前,是否可以禁用进程中的其他任务?如果没有,您建议如何解决这个问题?
【问题讨论】:
-
查看锁、信号量、条件变量 :)
-
@TheBroessor 只有当您可以明确识别需要排除的代码时,这些才有效。当那是“除此代码之外的所有内容”时将不起作用。
-
取决于你如何定义临界区,你可以实现,对吧?更多关于抢占的信息:en.wikipedia.org/wiki/Preemption_(computing)
-
您希望您的库将受保护的内容放入一个单独的进程中。这是唯一有意义的方法。
-
谢谢@DavidSchwartz。这可能真的是唯一可行的解决方案。我们希望有一种方法可以避免使用跟踪器进程,因为这会增加很多开销,例如,由于上下文切换。
标签: c++ c linux multithreading mprotect