程序能否捕获对进程内存某些区域的内存访问?

程序能否捕获对进程内存某些区域的内存访问?

我正在寻找一种在访问程序内存的特定只读部分时触发和捕获事件的方法。具体来说,如果我有一段程序内存包含许多常量值(只读),并且我想在访问这些值中的任何一个时捕获一个事件,其中事件处理程序可以执行一些处理(某种增强)到数据)并返回增强值。所以,我有几个问题:

  1. 这可能吗?
  2. 如果是这样,人们会如何去做呢?
  3. 需要什么样的权限(不需要访问另一个进程的内存)?
  4. 有没有关于可以使用的技术的文档?

更新1:

这里有更多信息,但我仍在尝试弄清楚具体细节。

我想要做的是以编程方式或在编译/链接期间,标记一个内存区域(可能是一个页面或更多),在访问时,将触发一个事件,这将导致我编写的事件处理程序被调用并允许我“修复”导致事件的问题并返回尝试访问的值。目标是能够让代码正在执行,并且当它尝试访问有问题的内存时,将调用事件处理程序并可以解析访问并返回到原始代码,并纠正/修复访问权限,以便原来的代码不用修改。比如说 printf 格式字符串,我希望能够调用事件并调整或替换格式字符串,并且 printf 代码继续其快乐的方式。

那有意义吗?

答案1

  1. 是的

  2. 可能通过使用链接描述文件将变量放入单独的内存页中。用于mprotect将页面标记为no access。用于sigaction设置 SIGSEGV 的处理程序,指定 SA_SIGINFO 以便您获得有关所涉及地址的信息。

  3. 不需要特殊特权。

  4. 这已经做过很多次了。最初的 Bourne shell 捕获 SIGSEGV 来进行内存处理,但那是在 sigaction 出现之前。在您的处理程序中,您可以执行任何需要的操作来修复问题并返回。通常,这需要对访问模式和生成的机器代码有一定的了解。

相关内容