在Linux(或Solaris)上,有一种比手动解析更好的方法/proc/self/maps
来确定您是否可以读取,写入或执行存储在内存中一个或多个地址的任何内容?
例如,在Windows中你有VirtualQuery
.
在Linux中,我可以mprotect
更改这些值,但我无法读回它们.
此外,是否有任何方法可以知道这些权限何时发生变化(例如,当有人使用mmap
我背后的文件时),而不是做一些非常具有侵略性的事情并ptrace
在进程中的所有线程上使用并拦截任何syscall
可能影响内存的尝试地图?
更新:
不幸的是,我在JIT中使用它,它几乎没有关于它正在执行的代码的信息,以获得常量的近似值.是的,我意识到我可以有一个可变数据的常量映射,比如Linux使用的vsyscall页面.我可以放心地假设任何未包含在初始解析中的内容都是可变且危险的,但我对这个选项并不完全满意.
现在我所做的是阅读/proc/self/maps
并构建一个结构,我可以通过二进制搜索来获得给定地址的保护.每当我需要了解一些不在我的结构中的页面时,我会重新阅读/ proc/self/maps,假设它已经同时添加,或者我将要进行段错误.
它似乎解析文本以获取此信息,而不知道它何时更改是非常苛刻的.(/dev/inotify
几乎不适用于任何事情/proc
)
我不知道VirtualQuery
Linux上的等价物.但是其他一些可能或可能不起作用的方法是:
你设置了一个信号处理程序捕获SIGBUS/SIGSEGV并继续你的读或写.如果内存受到保护,将调用您的信号捕获代码.如果不是,则不会调用您的信号捕获代码.无论哪种方式,你赢了.
您可以在每次调用时跟踪mprotect
并构建相应的数据结构,以帮助您了解区域是读还是写保护.如果您可以访问所有使用的代码,这是很好的mprotect
.
您可以mprotect
通过将代码与重新定义函数的库链接来监视流程中的所有调用mprotect
.然后,您可以构建必要的数据结构,以了解区域是读还是写保护,然后调用系统mprotect
以实际设置保护.
您可以尝试使用/dev/inotify
和监视文件/proc/self/maps
以进行任何更改.我想这个不起作用,但值得尝试.