0
ptrace的得到改变内存可以得到寄存器和存储器中的数据时进入/退出系统调用。但是,如果linux系统调用处理程序更改某些内存包含堆栈中的某个位置,如何才能知道哪些内存已更改。通过的ptrace系统调用
ptrace的得到改变内存可以得到寄存器和存储器中的数据时进入/退出系统调用。但是,如果linux系统调用处理程序更改某些内存包含堆栈中的某个位置,如何才能知道哪些内存已更改。通过的ptrace系统调用
你不能;但例如strace的(并且是使用ptrace的)发现,大多数(全部?)系统调用的语义,并且可以告诉你更改了内存。
例如,如果系统调用号为0,strace知道,调用了read()
-syscall,并且内核将写入第二个参数中指定的地址。写入的字节数等于系统调用的返回值。现在
,这些存储单元的内容可以用PTRACE_PEEK*
被读取并显示给你。
然而,当涉及到与未知或较少严格语义定制系统调用(例如,提出的系统调用write_to_random_memory_location()
);一般来说,您不能通过ptrace()
确定内存更改(无论是从内核还是从用户空间)。
根据需要实现什么,一般的解决办法只能是利用某种虚拟化技术(例如,在用户空间所做的valgrind)和模拟/观看所有内存访问。