ptrace通过系统调用来改变内存

时间:2017-05-22 09:20:18

标签: c linux system-calls ptrace

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

1 个答案:

答案 0 :(得分:0)

你不能;但是例如strace(它反过来使用ptrace)知道大多数(所有?)系统调用的语义,并且可以显示更改的内存。

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

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

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

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