【问题标题】:ptrace get changed memory by syscallptrace 通过系统调用获取更改的内存
【发布时间】:2017-05-22 09:20:18
【问题描述】:

ptrace 可以在进入/退出系统调用时获取寄存器和内存数据。但是,如果 linux 系统调用处理程序更改了一些内存,包括堆栈中的某个位置,我如何才能知道哪些内存已被更改。

【问题讨论】:

    标签: c linux system-calls ptrace


    【解决方案1】:

    你不能;但例如 strace(它又使用 ptrace)知道大多数(全部?)系统调用的语义,并且可以向您显示更改的内存。

    例如,如果 syscall-number 为 0,则 strace 知道调用了 read()-syscall,并且内核将写入第二个参数中指定的地址。写入的字节数等于系统调用的返回值。

    现在,这些内存位置的内容可以用PTRACE_PEEK* 读取并显示给您。

    但是,当涉及到语义未知或不太严格的自定义系统调用时(例如,提议的系统调用write_to_random_memory_location());通常,您无法使用 ptrace() 确定内存更改(无论是来自内核还是来自用户空间)。

    根据您需要实现的目标,一般的解决方案只能是利用某种虚拟化(例如,valgrind 在用户空间中所做的)并模拟/监视所有内存访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-26
      • 2012-08-14
      • 2013-12-24
      • 2017-01-03
      • 2017-04-09
      • 2011-06-09
      • 2012-11-05
      • 2016-01-30
      相关资源
      最近更新 更多