ptrace PTRACE_PEEKTEXT 错误

ptrace PTRACE_PEEKTEXT 错误

为什么当我在 C 程序中使用 ptrace PTRACE_PEEKTEXT 时出现此错误?

我在其中使用 PTRACE_PEEKTEXT 的程序部分是:

static void read_file(pid_t child, char *file)
{
    char *child_addr;
    int i;

    child_addr = (char *) ptrace(PTRACE_PEEKUSER, child, sizeof(long)*RDI, 0);

    do {
        long val;
        char *p;

        val = ptrace(PTRACE_PEEKDATA, child, child_addr, NULL);
        if (val == -1) {
            fprintf(stderr, "PTRACE_PEEKTEXT error: %s", strerror(errno));
            exit(1);
        }
        child_addr += sizeof (long);

        p = (char *) &val;
        for (i = 0; i < sizeof (long); ++i, ++file) {
            *file = *p++;
            if (*file == '\0') break;
        }
    } while (i == sizeof (long));
}

(它是一部分这个程序

为什么会出现这个错误??

PTRACE_PEEKTEXT error: Input/output error[1]

答案1

根据手册页,EIO意味着:

无效,或者尝试读取或写入跟踪器或被跟踪者内存中的无效区域,或者存在字对齐违规,或者在重新启动请求期间指定了无效信号。

所以child_addr传递给的变量ptrace(PTRACE_PEEKDATA, ...)可能是不正确的。一个好的开始是检查ptrace(PTRACE_PEEKUSER, ...)错误的结果。

相关内容