ptrace更改系统调用号arm64

ptrace更改系统调用号arm64,c,linux,arm,arm64,ptrace,C,Linux,Arm,Arm64,Ptrace,我正在尝试使用ptrace在linux arm64上将一个调用从一个系统调用更改为另一个系统调用 据我所知,系统调用号是x8,读取系统调用的寄存器可以证实这一点。我正在更改这个号码并调用SETREGSET,调用的是旧的系统调用,而不是新的系统调用。当我检查从syscall返回的寄存器时,x8被设置为我应该给他的syscall 更改同一系统调用的其他参数是有效的 我看到一些地方在使用PTRACE_SET_SYSCALL,但我找不到太多关于它的信息,我尝试过使用它,但它似乎在这个拱门中不受支持,它没

我正在尝试使用ptrace在linux arm64上将一个调用从一个系统调用更改为另一个系统调用

据我所知,系统调用号是x8,读取系统调用的寄存器可以证实这一点。我正在更改这个号码并调用SETREGSET,调用的是旧的系统调用,而不是新的系统调用。当我检查从syscall返回的寄存器时,x8被设置为我应该给他的syscall

更改同一系统调用的其他参数是有效的

我看到一些地方在使用PTRACE_SET_SYSCALL,但我找不到太多关于它的信息,我尝试过使用它,但它似乎在这个拱门中不受支持,它没有定义,并且因为不存在而写入数字失败

我做错了什么?为什么不起作用

下面是代码,为了简单起见,我删除了打印和验证,对于这个示例,我只是试图停止写系统调用:

ptrace(PTRACE_ATTACH, pid, NULL, NULL);

int status;
waitpid(pid, &status, 0);
while (ptrace(PTRACE_SYSCALL, pid, NULL, NULL) == 0)
{
    waitpid(pid, &status, 0);

    struct user_pt_regs regs;
    struct iovec io;
    io.iov_base = &regs;
    io.iov_len = sizeof(regs);

    ptrace(PTRACE_GETREGSET, pid, (void*)NT_PRSTATUS, &io);

    // reg[7] is 0 before syscall and 1 after
    if (regs.regs[7] == 0)
    {
        // Change write syscall
        if (regs.regs[8] == 64)
        {
            // Change the syscall to getpid (doesn't matter)
            regs.regs[8] = 172;

            ptrace(PTRACE_SETREGSET, pid, (void*)NT_PRSTATUS, &io);
        }
    }
}
至于tracee,一个简单的hello世界,用睡眠书写

char buf[] = "hello world\n";
while(1)
{
    write(1, buf, sizeof(buf));
    sleep(5);
}
虽然程序运行时没有错误,并且打印正确的寄存器,但是系统调用没有改变,并且一直打印hello world