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 = &regs;
    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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...