Bonjour,
je souhaite utiliser la fonction ptrace pour faire un simple recode de strace or je me suis rapidement heurté à un problème, je pense suivre la bonne démarche pourtant je n'obtiens pas les même résultat que strace.
Je tente pour l'instant de n'afficher que le nom des syscall du programme que je passe en paramètre ( qui ne contient q'un write(1, "TOTO\n", 5)) or je ne retombe pas du tout sur les même syscall que strace.
output strace ./a.out :
output ./my_strace ./a.out :execve("./a.out", ["./a.out"], [/* 85 vars */]) = 0
brk(0) = 0x602000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fda30568000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/usr/lib64/mpi/gcc/openmpi/lib64/tls/x86_64/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/mpi/gcc/openmpi/lib64/tls/x86_64", 0x7fffc4dd3360) = -1 ENOENT (No such file or directory)
open("/usr/lib64/mpi/gcc/openmpi/lib64/tls/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/mpi/gcc/openmpi/lib64/tls", 0x7fffc4dd3360) = -1 ENOENT (No such file or directory)
open("/usr/lib64/mpi/gcc/openmpi/lib64/x86_64/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
...
Dans mon programme, je fork, dans le fils je trace puis j'exec mon prog passé en paramètre et dans le père grosso modo je wait sur PTRACE_SYSCALL et je boucle sur ceci :execve
execve
chdir
link
mount
fork
write
fork
write
fork
...
Quelque chose vous choque t-il ? Ma démarche ne vous parait-elle pas bonne ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 struct user_regs_struct regs; ptrace(PTRACE_GETREGS, child_pid, NULL, ®s)); printf("%s\n", SYSCALL_NAMES[regs.orig_rax]);
Je vérifie toutes mes fonctions système ainsi que mon tableau SYSCALL_NAMES qui me sert à faire la correspondance entre le numéro du syscall et son nom.
Merci d'avance pour votre aide !
Partager