【发布时间】:2010-09-21 02:58:29
【问题描述】:
在 Linux(或 Solaris)上,有没有比手动解析 /proc/self/maps 更好的方法来确定您是否可以读取、写入或执行存储在内存中一个或多个地址的任何内容?
例如,在 Windows 中,您有 VirtualQuery。
在 Linux 中,我可以 mprotect 更改这些值,但我无法将它们读回。
此外,有没有办法知道这些权限何时更改(例如,当有人在我背后的文件上使用 mmap 时)除了做一些非常侵入性的事情并在进程中的所有线程上使用 ptrace 并拦截任何尝试创建可能影响内存映射的syscall?
更新:
不幸的是,我在 JIT 中使用了它,它几乎没有关于它正在执行的代码的信息来获得常量的近似值。是的,我意识到我可以拥有可变数据的常量映射,例如 Linux 使用的 vsyscall 页面。我可以安全地回过头来假设初始解析中未包含的任何内容都是可变且危险的,但我对这个选项并不完全满意。
现在我要做的是阅读/proc/self/maps 并构建一个结构,我可以通过二进制搜索来获得给定地址的保护。每当我需要了解一个不在我的结构中的页面时,我都会重新阅读 /proc/self/maps 假设它已同时添加,否则我将要进行段错误。
似乎解析文本以获取此信息并且不知道它何时更改是非常笨拙的。 (/dev/inotify 在/proc 中几乎没有任何作用)
【问题讨论】:
标签: c linux system-calls mprotect virtualquery