我正在寻找一种在访问程序内存的特定只读部分时触发和捕获事件的方法。具体来说,如果我有一段程序内存包含许多常量值(只读),并且我想在访问任何这些值时捕获一个事件,事件处理程序可以在其中执行一些处理(某种增强到数据)并返回增加的值。所以,我有几个问题:
- 这可能吗?
- 如果是这样,人们将如何去做呢?
- 需要什么样的权限(不需要访问另一个进程的内存)?
- 是否有任何关于可以使用的技术的文档?
更新 1:
这里有更多信息,但我仍在努力弄清楚具体细节。
我正在尝试做的是以编程方式或在编译/链接时,标记一个内存区域(可能是一个页面或更多),当访问时,将触发一个事件,这将导致我编写的事件处理程序被调用并允许我“修复”导致事件的问题并返回试图访问的值。目标是能够拥有正在执行的代码,并且当它尝试访问有问题的内存时,将调用事件处理程序并可以解决访问并返回到原始代码,访问更正/修复,以便不必修改原始代码。比如说一个 printf 格式字符串,我希望能够调用该事件并调整或替换格式字符串,并且 printf 代码继续其愉快的方式。
那有意义吗?
是的
可能通过使用链接描述文件将变量放入单独的内存页面。用于
mprotect
将页面标记为no access
。用于sigaction
为 SIGSEGV 设置处理程序,指定 SA_SIGINFO 以便您获得有关所涉及地址的信息。不需要特殊特权。
这已经做过很多次了。最初的 Bourne shell 捕获 SIGSEGV 来进行内存处理,但那是在 sigaction 出现之前。在你的处理程序中,你可以做任何需要修复和返回的事情。通常,这需要对访问模式和生成的机器代码有一定的了解。