11

我在这里浏览了一篇文章,并尝试了我在下面复制的代码片段:-

#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <linux/user.h>   /* For constants
                                   ORIG_EAX etc */
int main()
{   pid_t child;
    long orig_eax;
    child = fork();
    if(child == 0) {
        ptrace(PTRACE_TRACEME, 0, NULL, NULL);
        execl("/bin/ls", "ls", NULL);
    }
    else {
        wait(NULL);
        orig_eax = ptrace(PTRACE_PEEKUSER,
                          child, 4 * ORIG_EAX,
                          NULL);
        printf("The child made a "
               "system call %ld\n", orig_eax);
        ptrace(PTRACE_CONT, child, NULL, NULL);
    }
    return 0;
}

我对传递给 ptrace 调用ORIG_EAX的确切内容和原因有疑问。4*ORIG_EAX我最初假设ORIG_EAX,EBXECX将是存储寄存器值的特定结构的偏移量。

所以我决定在等待之后通过使用打印 ORIG_EAX 的值printf("origeax = %ld\n", ORIG_EAX);。值为11。所以,我之前关于偏移量的假设是错误的。

我知道wait当孩子发生状态变化(在这种情况下,发出系统调用)时调用被终止,并且 ORIG_EAX 将包含系统调用号。

但是,为什么将 ORIG_EAX * 4 传递给 ptrace 调用?

4

1 回答 1

13

该参数是user_regs_struct的偏移量。请注意,其中每一个都是unsigned long,因此要获得第 11 个条目 ( orig_eax),字节偏移量为 44,(当然,前提是您在 x86 机器上)。

于 2012-06-19T13:02:34.560 回答