MPROTECT:如何获取导致保护冲突的指令



我正在使用mprotect将一些内存页设置为写保护。当在该内存区域中尝试任何写入时,程序会获得 SIGSEGV 信号。从信号处理程序中,我知道尝试写入的内存地址,但我不知道如何找出导致写入保护违规的指令。因此,在信号处理程序中,我正在考虑读取程序计数器(PC)寄存器以获取错误的指令。有没有简单的方法可以做到这一点?

如果使用带有 SA_SIGINFO 标志的 sigaction 安装信号处理程序,则信号处理程序的第三个参数的类型为 void *,但指向类型 ucontext_t 的结构,而该结构又包含类型 mcontext_t 的结构。mcontext_t的内容是实现定义的,通常特定于 CPU 体系结构,但您可以在此处找到保存的程序计数器。

编译器的内置函数(我认为__builtin_return_address具有非零参数)以及展开表也有可能能够跟踪信号处理程序。虽然这在某些方面更通用(它不是明显的特定于 cpu-arch),但我认为它也更脆弱,它是否实际工作可能是特定于 cpu-arch 和 ABI 的。

最新更新