使用 Ptrace 检索系统调用,在第一次调用后停止

Retrieving system calls with Ptrace, stopping after first one

本文关键字:调用 第一次 Ptrace 检索 系统调用 使用      更新时间:2023-10-16

我正在尝试检索所有系统调用的数量,并最终检索使用 ptrace 的 give 程序调用的系统调用的名称。 我在 64 位系统上,所以我使用 ORIG_RAX * 8 使用 ptrace 查找系统调用。我目前只能检索第一个系统调用,示例运行的输出如下。有什么想法吗?

谢谢!

输出: griffinm@well $ g++ mystrace.cc

~/cs153/assn2
griffinm@well $ a.out ls
Please wait
The child made a system call 59
a.out  mystrace.cc  mystrace.cc~
Number of machine instructions : 252376
~/cs153/assn2

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <errno.h>
#define ORIG_RAX 120 
int main( int argc, char* argv[])
{
        long long counter = 0;  /*  machine instruction counter */
        int wait_val;           /*  child's return value        */
        int pid; 
    long orig_eax;               /*  child's process id          */
        puts("Please wait");
    switch (pid = fork()) {
    case -1:
            perror("fork");
            break;
    case 0:
            ptrace(PTRACE_TRACEME, 0, 0, 0);
            execvp(argv[1],  NULL);
            break;
    default:
            wait(&wait_val); 
    orig_eax = ptrace(PTRACE_PEEKUSER,
                      pid, ORIG_RAX,
                      NULL);
    printf("The child made a "
           "system call %ldn", orig_eax);
            while (wait_val == 1407 ) {
                    counter++;
                    if (ptrace(PTRACE_SINGLESTEP, pid, 0, 0) != 0)
                            perror("ptrace");
                    wait(&wait_val);
            }
    }
    printf("Number of machine instructions : %lldn", counter);
    return 0;

}

Update Default Case:
Default:     
            wait(&wait_val); 

            while (wait_val == 1407 ) {
                    counter++;
                    if (ptrace(PTRACE_SYSCALL, pid, 0, 0) != 0)
                            perror("ptrace");
         orig_eax = ptrace(PTRACE_PEEKUSER,
                      pid, 8*ORIG_RAX,
                      NULL);
        cout<<orig_eax<<endl;
                    wait(&wait_val);
            }
    }

编辑:

Output:
griffinm@well $ a.out pwd
Please wait
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
/home/csmajs/griffinm/cs153/assn2
-1
-1
-1
-1
-1
-1

我认为 8*Orig_RAX 是问题所在,机器就像我说的一样是 64 位。有什么想法吗?

您可能希望使用PTRACE_SYSCALL而不是PTRACE_SINGLESTEP来运行子项到下一个系统调用,而不仅仅是单个指令。 然后,您可以再次使用该PTRACE_PEEKUSER来查看它是什么系统调用。

相关文章: