2012-04-15 5 views
1

모든 시스템 호출 수와 ptrace를 사용하여 제공 프로그램에서 호출 한 시스템 호출 수를 검색하려고합니다. 필자는 64 비트 시스템을 사용하고 있으므로 ORIG_RAX * 8을 사용하여 ptrace를 사용하는 시스템 호출을 찾습니다. 현재는 첫 번째 시스템 호출 만 검색 할 수 있으며 샘플 실행 결과는 아래에 있습니다. 어떤 아이디어?Ptrace를 사용하여 시스템 호출을 검색하여 첫 번째 이후에 중지

감사합니다.

출력 : griffinm의 @ 물론 $ g ++ mystrace.cc

~/cs153/assn2 
[email protected] $ 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 %ld\n", 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 : %lld\n", 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: 

[email protected] $ 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 비트입니다. 어떤 아이디어?

+0

['wait (2)'] (http://linux.die.net/man/2/wait)의 반환 값을 비교하기 위해 번호 1407을 하드 코딩해서는 안됩니다. . 대신, while (WIFSTOPPED (wait_val) && WSTOPSIG (wait_val) == SIGTRAP)'을 테스트해야합니다. –

+0

감사합니다. 교수님은 while 회 돌이 조건에 대한 해설 코드를 주셨습니다. 좀 더 일반적인 방법이 있다는 느낌이 들었습니다. –

답변

0

PTRACE_SINGLESTEP 대신 PTRACE_SYSCALL을 사용하여 단일 명령이 아닌 다음 시스템 호출까지 실행하는 것이 좋습니다. 그런 다음 PTRACE_PEEKUSER을 다시 사용하여 시스템 콜이 무엇인지 확인할 수 있습니다.

+0

나는 그것을 시도하고 내 원래의 질문에 업데이트 된 결과를 올렸다. –

관련 문제