ptrace更改系统调用号arm64
我正在尝试使用ptrace在linux arm64上将一个调用从一个系统调用更改为另一个系统调用 据我所知,系统调用号是x8,读取系统调用的寄存器可以证实这一点。我正在更改这个号码并调用SETREGSET,调用的是旧的系统调用,而不是新的系统调用。当我检查从syscall返回的寄存器时,x8被设置为我应该给他的syscall 更改同一系统调用的其他参数是有效的 我看到一些地方在使用PTRACE_SET_SYSCALL,但我找不到太多关于它的信息,我尝试过使用它,但它似乎在这个拱门中不受支持,它没有定义,并且因为不存在而写入数字失败 我做错了什么?为什么不起作用 下面是代码,为了简单起见,我删除了打印和验证,对于这个示例,我只是试图停止写系统调用:ptrace更改系统调用号arm64,c,linux,arm,arm64,ptrace,C,Linux,Arm,Arm64,Ptrace,我正在尝试使用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 = ®s;
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