모든 시스템 호출 수와 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 비트입니다. 어떤 아이디어?
['wait (2)'] (http://linux.die.net/man/2/wait)의 반환 값을 비교하기 위해 번호 1407을 하드 코딩해서는 안됩니다. . 대신, while (WIFSTOPPED (wait_val) && WSTOPSIG (wait_val) == SIGTRAP)'을 테스트해야합니다. –
감사합니다. 교수님은 while 회 돌이 조건에 대한 해설 코드를 주셨습니다. 좀 더 일반적인 방법이 있다는 느낌이 들었습니다. –