Bonjour à tous,
Comme certains d'entre vous le savent déjà, il existe des méthodes simples pour compliquer le debug : par exemple l'utilisation de ptrace et de "faux-breakpoints".
J'ai voulu tenter leur utilisation mais ce serait trop beau si ça marchait du premier coup.
Pour illustrer, voici un résumé pratique de mon problème :
Le drame vient du fait que lorsqu'un programme est tracé, il se "met en pose" (statut "T" dans "ps") dès qu'il reçoit un signal (n'importe lequel) et le père doit appeler ptrace avec PTRACE_CONT pour relancer l'exécution.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 #include <stdio.h> #include <signal.h> #include <sys/ptrace.h> void sighandler(int signal) { if(signal == SIGTRAP) /* oui ça ne sert à rien, mais les warnings c'est le mal !! */ { } } int main() { /* on demande à notre programme de se tracer lui-même */ if(ptrace(PTRACE_TRACEME, 0, NULL, NULL) == -1) { /* ptrace renvoie une erreur donc le process est tracé par autre chose (strace / débugger / ...) */ return 1; } /* on utilise un signal handler qui ne fait rien : l'envoi de SIGTRAP sera transparent en exécution "normale" mais un débugger va breaker */ signal(SIGTRAP, sighandler); /* oui avec sigaction ce serait mieux etc */ /* on envoie un SIGTRAP à notre programme */ raise(SIGTRAP); puts("Je vais jamais être affiché T_T\n"); return 0; }
Dans le cas présent, puisque le programme se trace lui-même, pas moyen de le relancer...
On en arrive (enfin) à ma question : y-a-t'il moyen d'empêcher cela ? Par exemple en arrêtant le traçage si l'appel à ptrace ne renvoie pas d'erreur (et donc si oui, comment ?).
Merci d'avance.
Partager