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;
}

ORIG_EAX正確に何が、なぜ4*ORIG_EAXptrace呼び出しに渡されるのかについて疑問があります。私は当初、、、などがレジスタの値が格納される特定の構造へのオフセットであると想定してい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 に答える