ptrace可以在进入/退出syscall时获取寄存器和内存数据。但是,如果linux系统调用处理程序更改了一些内存,包括堆栈中的某个位置,我如何才能知道更改了哪些内存。
发布于 2017-05-22 17:33:38
您不能;但是例如strace (它使用ptrace)知道大多数(all?)的语义。系统调用并可以向您显示已更改的内存。
例如,如果syscall--syscall为0,则strace知道调用了read()-syscall,并且内核将写入第二个参数中指定的地址。写入的字节数等于syscall的返回值。
现在,可以使用PTRACE_PEEK*读取这些内存位置的内容并将其显示给您。
但是,当涉及到具有未知语义或不太严格的语义的自定义syscall时(例如,建议的syscall write_to_random_memory_location());一般情况下,您不能使用ptrace()确定内存更改(无论是从内核还是从用户空间)。
根据您需要实现的功能,一般的解决方案只能是利用某种类型的虚拟化(例如,valgrind在用户空间中执行的操作),并模拟/观察所有内存访问。
https://stackoverflow.com/questions/44109196
复制相似问题