代码之家  ›  专栏  ›  技术社区  ›  Jay Conrod

在给定受保护内存时,如何使系统调用调用我的SIGSEGV处理程序?

  •  2
  • Jay Conrod  · 技术社区  · 15 年前

    我正在开发一个内存跟踪库,我们使用 mprotect 删除对程序大部分内存的访问,并使用SIGSEGV处理程序在程序接触单个页面时恢复对它们的访问。这在大多数情况下都很有效。

    我的问题是当程序调用一个系统调用(比如 read )对于我的库标记为no access的内存,系统调用只返回-1并设置 errno EFAULT . 这会以奇怪的方式改变正在测试的程序的行为。我希望能够在系统调用真正进入内核之前,恢复对它的访问。

    fread 将呼叫 直接使用我的包装)。有没有更好的办法?怎么可能有这种行为?

    1 回复  |  直到 15 年前
        1
  •  5
  •   DaveR    15 年前

    你可以用 ptrace(2) 为了实现这一点。它允许您监视流程,并在发生某些事件时得到通知。出于您的目的,请查看 PTRACE_SYSCALL 它允许您在进入和退出syscall时停止进程。

    ptrace 操作时,父进程监视子进程,而就子进程而言,它不知道监视事件发生的时间。话虽如此,您应该能够按照以下思路做一些事情:

    • 设置ptrace父级和子级,监控(至少) PTRACE_系统调用 .
    • 子进程执行系统调用;并通知家长。
    • PTRACE_GETREGS PTRACE_SETREGS 更改子状态,而不是调用syscall;子进程调用“内存取消保护”例程。
    • 孩子不保护自己的记忆;然后提出 SIGUSR1 或者类似于告诉控制父级内存工作已完成。
    • 父母捕获 SIGUSR ,使用 PTRACE_SETREGS 恢复先前保存的系统调用信息并恢复子系统。
    • 子系统恢复并执行原始系统调用。
    推荐文章