【发布时间】:2021-07-06 18:09:44
【问题描述】:
我们有一个学校项目,我们需要重新编码“strace”。
我们只需要拦截像写和读这样的系统调用,但我们不能使用PTRACE_SYSCALL。我正在寻找一种使用PTRACE_SINGLESTEP 的方法,我已经编写了一种打印系统调用的方法,当我使用PTRACE_SYSCALL 它工作正常,但是当我使用PTRACE_SINGLESTEP 我不能找到一种只打印系统调用的方法。
这是我使用的代码,也许有人可以帮我找出问题所在:
pid_t child;
long orig_eax;
user_regs_struct regs;
child = fork();
if (child == 0) {
ptrace(PTRACE_TRACEME, 0, 0, 0);
execve("/home/architek/a.out", {"/home/architek/a.out", NULL}, envp);
} else {
waitpid(child, &status, 0);
while (WIFSTOPPED(status)) {
orig_eax = ptrace(PTRACE_PEEKUSER, child, 8 * ORIG_RAX, NULL);
ptrace(PTRACE_GETREGS, child, NULL, ®s);
call_printer(®s, child);
ptrace(PTRACE_SINGLESTEP, child, 0, 0);
waitpid(child, &status, 0);
}
}
【问题讨论】:
-
您是否阅读了ptrace(2) 的所有(神秘)文档?另见Advanced Linux Programming 和syscalls(2)。顺便说一句,
strace是开源的,你可以研究它的源代码。请提供一些minimal reproducible example -
您可能需要查看内部
/usr/include/x86_64-linux-gnu/sys/user.h -
我已经阅读了 ptrace(2) 并且我没有发现任何可能有用的请求,或者我没有看到它如何有用,我找到了“PTRACE_SYSEMU”,但它是也被这个主题所禁止,我已经阅读了一些 strace 源代码,会阅读更多,也许我会发现一些有用的东西;至于
user.h中的结构,我找不到可以帮助我确定被跟踪者是否在系统调用上停止的东西