ptrace可以在进入/退出系统调用时获取寄存器和内存数据。但是如果linux系统调用处理程序更改某些内存包含堆栈中的某个位置,我怎样才能知道哪个内存已被更改。
答案 0 :(得分:0)
你不能;但是例如strace(它反过来使用ptrace)知道大多数(所有?)系统调用的语义,并且可以显示更改的内存。
例如,如果syscall-number为0,则strace知道调用了read()
- syscall,并且内核将写入第二个参数中指定的地址。在那里写入的字节数等于系统调用的返回值。
现在,可以使用PTRACE_PEEK*
读取这些内存位置的内容并显示给您。
但是,当涉及具有未知或不太严格的语义的自定义系统调用时(例如建议的系统调用write_to_random_memory_location()
);您无法通过ptrace()
确定内存更改(无论是来自内核还是来自用户空间)。
根据您需要实现的目标,通用解决方案只能是利用某种虚拟化(例如,valgrind在用户空间中执行的操作)以及模拟/监视所有内存访问。