有没有比parsing/ proc / self / maps找出内存保护更好的方法?

在Linux(或者Solaris)上,有没有比parsing/proc/self/maps反复更好的方法来判断你是否可以读,写或者执行存储在内存中一个或多个地址的内容?

例如,在Windows中你有VirtualQuery

在Linux中,我可以通过mprotect来改变这些值,但是我不能读回它们。

此外,还有什么方法可以知道这些权限何时改变(例如,当某人在我背后的文件上使用mmap时),而不是进行非常有ptrace ,并在进程中的所有线程上使用ptrace ,并拦截任何尝试进行syscall影响内存映射?

更新:

不幸的是,我在JIT里面使用了这个,它只有很less的关于正在执行的代码的信息来获得一个常量的近似值。 是的,我意识到我可以有一个可变数据的常量映射,就像Linux使用的vsyscall页面一样。 我可以放心地假设,任何不包含在初始parsing中的东西都是可变的和危险的,但我并不完全满意这个选项。

现在我所做的是读取/proc/self/maps并构build一个结构体,我可以通过二进制search来获得给定地址的保护。 任何时候我需要了解一些不在我的结构中的页面,我会重新读取/ proc / self / maps,假设它已经被添加了,或者我将要进行段错误。

这似乎是parsing文本来获取这些信息,而不知道什么时候改变是非常重要的。 ( /dev/inotify/proc几乎不起作用)

Solutions Collecting From Web of "有没有比parsing/ proc / self / maps找出内存保护更好的方法?"

我不知道在Linux上相当于VirtualQuery 。 但是其他一些可能或不可行的方法是:

  • 你设置一个信号处理程序捕获SIGBUS / SIGSEGV并继续你的读或写。 如果内存被保护,你的信号捕获代码将被调用。 如果不是你的信号陷阱代码不被调用。 无论哪种方式,你赢了。

  • 您可以在每次调用mprotect并建立相应的数据结构,以帮助您了解某个区域是读取还是写入保护。 如果你有权访问所有使用mprotect的代码,这是很好的。

  • 您可以通过将您的代码与重新定义函数mprotect的库链接来监视进程中的所有mprotect调用。 然后,您可以构建必要的数据结构,以了解区域是读取还是写入保护,然后调用系统mprotect来真正设置保护。

  • 您可以尝试使用/dev/inotify并监视文件/proc/self/maps以进行任何更改。 我猜这个不行,但应该值得一试。

有sorta是/ pro / / [pid | self] / pagemap,在内核的文档,注意这里: https : //lkml.org/lkml/2015/7/14/477所以它不是完全无害的.. 。