(ORIG_EAX*4)在ptrace调用中

7 c linux ptrace systems-programming

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

我怀疑究竟ORIG_EAX是什么以及为什么4*ORIG_EAX传递给ptrace调用.我最初假设ORIG_EAX,EBX,ECX等.将偏移到其中寄存器的值将被存储在特定的结构.

所以我决定在等待之后使用打印ORIG_EAX的值printf("origeax = %ld\n", ORIG_EAX);.价值是11.所以,我之前关于补偿的假设是错误的.

我知道wait当孩子进行状态更改(在这种情况下,发出系统调用)并且ORIG_EAX将包含系统调用号码时,调用将终止.

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

Mat*_*all 10

该参数是user_regs_struct的偏移量.请注意,每个都是一个unsigned long,所以要获得第11个条目(orig_eax),以字节为单位的偏移量为44,(假设你当然是在x86机器上).

  • 32 位和 64 位之间的差异如何?我们不应该编译时案例吗? (2认同)