当前位置: 首页 > 面试题库 >

是否有比解析/ proc / self / maps更好的方法来确定内存保护?

丁业
2023-03-14
问题内容

在Linux(或Solaris)上,有没有比/proc/self/maps重复进行手动分析更好的方法,以弄清您是否可以读取,写入或执行存储在内存中一个或多个地址上的内容?

例如,在Windows中,您拥有VirtualQuery

在Linux中,我可以mprotect更改这些值,但是无法读回。

此外,mmap除了做一些极具侵害性的事情并ptrace进程中的所有线程上使用并拦截任何syscall可能影响内存的尝试外,是否有其他方法可以知道这些权限何时发生更改(例如,某人使用我背后的文件)地图?

更新:

不幸的是,我在一个JIT内部使用了它,它几乎没有关于它正在执行的代码的信息,以获得近似的常量。是的,我意识到我可以拥有不变的可变数据映射,例如Linux使用的vsyscall页面。我
可以 放心地认为,初始解析中未包含的任何内容都是易变且危险的,但是我对该选项并不完全满意。

现在我要做的是阅读/proc/self/maps并构建一个结构,可以对指定地址的保护进行二进制搜索。每当我需要了解某个不在我的结构中的页面时,我都会重新读取/
proc / self / maps,前提是假设该页面已在此期间添加,否则无论如何我都会进行段错误。

似乎解析文本以获取此信息而又不知道它何时更改是非常棘手的。(/dev/inotify在几乎没有任何作用/proc


问题答案:

我不知道VirtualQueryLinux上的等效功能。但是,其他可行或不可行的方法是:

  • 您设置了捕获SIGBUS / SIGSEGV的信号处理程序,然后继续进行读取或写入。如果内存受到保护,则将调用您的信号捕获代码。如果不是,则不调用您的信号捕获代码。无论哪种方式,您都会赢。

  • 您可以在每次调用时进行跟踪,mprotect并建立相应的数据结构,以帮助您了解某个区域是否受读或写保护。如果您可以访问所有使用的代码,那么这很好mprotect

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

  • 您可以尝试使用/dev/inotify和监视文件/proc/self/maps中的任何更改。我想这是行不通的,但值得尝试。



 类似资料:
  • 问题内容: 一直困扰我的是Javascript中的方法多么不可预测。 根据我的经验,在很多情况下计时器都非常不准确。所谓不准确,是指实际延迟时间或多或少地相差250-500ms。尽管这不是很长的时间,但是使用它来隐藏/显示UI元素时,时间显然是显而易见的。 是否有任何技巧可以确保准确执行(无需借助外部API),或者这是一个失败的原因? 问题答案: 是否有任何技巧可以确保准确执行(无需借助外部API

  • 问题内容: 考虑这两个例子… 我很想知道这些方法是否更好。我一直使用第一个示例,但是看到很多人在此站点上使用第二个示例。 那么,哪个更好?快点?意图更清晰? 问题答案: 速度更快,但与并不相同。 即使值是,也仅检查密钥是否存在。 而 将返回如果该键存在和价值。

  • 我正在尝试使用bokeh数据表来显示网页中嵌入的数据。它工作得很好。 有没有办法从显示的数据表中保存表格内容?其他bokeh图有用于包括保存在内的各种功能的工具栏,但DataTable似乎没有附带。我对bokeh数据表使用的javascript或slickgrid知之甚少。想知道是否可以做到。 谢谢 编辑-我原来的问题似乎不够清楚。希望以下图片可以帮助说明: Bokeh plot具有关联的工具栏:

  • 问题内容: 我想解析,但是安全吗? 我应该如何打开文件并从中读取文件,不要害怕其他一些进程(或操作系统本身)会在同一时间对其进行更改? 问题答案: 一般来说,没有。 (因此,这里的大多数答案都是错误的。)根据您想要的属性,它 可能 是安全的。但是,如果您过多地假设中的文件一致性,则很容易在代码中导致错误。例如,请查看此错误,该错误来自假设它是一致的快照。 例如: 有人在另一个答案中提到过,这 完全

  • Edit:是我现在正在做的事情,但是由于只是返回,所以这似乎是对Map的误用。另外,它读起来并不像是商业逻辑。 最后编辑:我接受了@Holger的回答。不能期望处理流上的所有元素,因为它不是终端操作。也是如此。即使您可能已经终止了您的流,以保证它将处理所有操作,您也不应该编写期望每个用户都这样做的代码。因此,要进行处理,您应该在上使用,然后根据需要再次开始对进行流式处理。

  • 问题内容: 我试图了解嵌入式Linux应用程序的内存使用情况。该实用程序/文件似乎是查看详细信息的好资源。不幸的是,我不理解所有的列和条目。 匿名索引节点0条目是什么意思?这些似乎是一些较大的内存段。 问题答案: 中的每一行都描述了进程或线程中连续虚拟内存的区域。每行都有以下字段: 地址 -这是进程地址空间中区域的开始和结束地址 权限 -描述如何访问区域中的页面。有四种不同的权限:读取,写入,执行