在 Linux(或 Solaris)上,有没有比/proc/self/maps
反复手动解析更好的方法来确定您是否可以读取、写入或执行存储在内存中一个或多个地址的任何内容?
例如,在 Windows 中,您有VirtualQuery
.
在 Linux 中,我可以mprotect
更改这些值,但我无法将它们读回。
此外,除了做一些非常侵入性的事情并在进程中的所有线程上使用并拦截任何可能影响内存的尝试之外,还有什么方法可以知道这些权限何时更改(例如,当有人mmap
在我背后使用文件时)地图?ptrace
syscall
更新:
不幸的是,我在 JIT 内部使用了它,它几乎没有关于它正在执行的代码的信息来获得常量的近似值。是的,我意识到我可以拥有可变数据的常量映射,例如 Linux 使用的 vsyscall 页面。我可以放心地假设初始解析中未包含的任何内容都是可变且危险的,但我对该选项并不完全满意。
现在我要做的是阅读/proc/self/maps
并构建一个结构,我可以通过二进制搜索来获得给定地址的保护。任何时候我需要了解一个不在我的结构中的页面,我会重新阅读 /proc/self/maps 假设它已经被同时添加,否则我将要进行段错误。
似乎解析文本以获取此信息并且不知道它何时更改是非常笨拙的。(/dev/inotify
几乎对任何东西都不起作用/proc
)