【发布时间】:2019-03-07 16:35:06
【问题描述】:
作为练习,我一直在尝试使用 Rust 的 nix::sys::ptrace::ptrace(与 C 的 ptrace 几乎相同)通过读取 RAX/RBX/RCX/ 的内容来模拟 strace 的系统调用日志记录功能。 RDX 在每次系统调用时注册。我想要的输出类似于:
Found syscall: 4
Arg1: 1
Arg2: Hello World!
从我在网上找到的示例看来,PTRACE_PEEKUSER 和 PTRACE_PEEKDATA 的组合最适合完成此任务(也许 PTRACE_GETREGS 也是?),但我很难理解如何以满足我需要传递给这些函数以使其工作的第三个参数。
ptrace 的手册页列出了这个示例,展示了正确的用法:
ptrace(PTRACE_PEEKTEXT/PEEKDATA/PEEKUSER, pid, addr, 0);
手册页只是说:“在被跟踪者的内存中读取地址addr 的单词。”但是addr 应该是什么?如何确定满足这个论点的正确地址?
我在网上找到的例子都有这样的:
ptrace(PTRACE_PEEKUSER, pid, sizeof(long)*ORIG_EAX, 0);
或
ptrace(PTRACE_PEEKUSER, pid, somenumber*RAX, 0)
如何在运行时查找/计算这些寄存器的偏移量? (在 Rust 中!)
【问题讨论】: