该论文中描述的步骤是正确的。在arm64架构下实现单步追踪需要用到ptrace系统调用,并设置PTRACE_SINGLESTEP选项。以下为代码示例:
#include
#include
#include
#include
int main()
{
pid_t child_pid;
long orig_r0;
child_pid = fork();
if (child_pid == 0) {
// 子进程
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
execl("/bin/ls", "ls", NULL);
} else {
// 父进程
wait(NULL);
// 设置单步追踪
ptrace(PTRACE_SETOPTIONS, child_pid, 0, PTRACE_O_EXITKILL | PTRACE_O_TRACEEXEC | PTRACE_O_TRACECLONE | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACESECCOMP | PTRACE_O_TRACEEXIT | PTRACE_O_TRACEVFORKDONE | PTRACE_O_TRACESYSCALL | PTRACE_O_MASK) == -1);
// 执行单步追踪
while(1) {
ptrace(PTRACE_SINGLESTEP, child_pid, NULL, NULL);
waitpid(child_pid, NULL, 0);
orig_r0 = ptrace(PTRACE_PEEKUSER, child_pid, 8 * REG_R0, NULL);
printf("Child executed a system call! Orig_r0 = %ld\n", orig_r0);
if (orig_r0 == __NR_exit)
break;
}
}
return 0;
}