如何解决ptrace更改系统调用号arm64
我正在尝试使用ptrace将调用从一个系统调用更改为Linux arm64上的另一个系统调用。
据我了解,系统调用号在x8中,读取系统调用的寄存器可以确认这一点。即时通讯更改此号码并调用SETREGSET,将调用旧的syscall而不是新的syscall。当我检查系统调用x8的返回值上的寄存器设置为系统调用时,我按应有的方式给了他。
更改同一系统调用的其他参数即可。
我看到了一些使用PTRACE_SET_SYSCALL的地方,但是我找不到很多东西,我尝试使用它,但是好像它在此拱门中不受支持,它没有定义,并且写数字反而因为不存在而失败。 / p>
我在做什么错?为什么不起作用?
这里是代码,为简单起见,我删除了打印和验证,对于本示例,我只是试图停止写系统调用:
ptrace(PTRACE_ATTACH,pid,NULL,NULL);
int status;
waitpid(pid,&status,0);
while (ptrace(PTRACE_SYSCALL,NULL) == 0)
{
waitpid(pid,0);
struct user_pt_regs regs;
struct iovec io;
io.iov_base = ®s;
io.iov_len = sizeof(regs);
ptrace(PTRACE_GETREGSET,(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,&io);
}
}
}
关于示踪,一个简单的打招呼的世界;
char buf[] = "hello world\n";
while(1)
{
write(1,buf,sizeof(buf));
sleep(5);
}
尽管程序运行没有错误并且可以打印正确的寄存器,但syscall不会改变,并且可以继续打印问候世界
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。