|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Membre éclairé
![]() Marc Ingénieur sécurité Inscription : novembre 2009 Messages : 282 ![]() |
Bonjour,
j'essaye de mettre en place une méthode d'anti-debugging très connu, la détection du ptrace. J'arrive à le faire lorsque je n'ai qu'une seule occurrence, mais je n'arrive pas à me détacher, donc lorsque je refais un appel à ptrace, celui-ci me renvoie une erreur. Un petit bout de code pour montrer ce que j'aimerai faire : Code :
Code :
Dans un premier temps j'ai pensé à un problème de timer, et j'ai tenté d'ajouter un wait, mais pas plus de résultat. Quelqu'un aurait-il une idée, mon objectif est juste de savoir si je suis déjà "ptracer" (du verbe ptrace). Et de pouvoir le faire x fois de suite. Merci |
||||
|
|
00
|
|
|
#2 | |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 696 ![]() |
Je découvre ptrace en lisant le manuel : http://man.developpez.com/man2/ptrace.2.php
PTRACE_TRACEME est pour démarrer la surveillance, dans le processus fils. PTRACE_KILL est pour envoyé au fils un signal SIGKILL. Cet appel doit être fait dans le père et non dans le fils comme tu le fais. Ton processus n'a rien à tuer, et ça doit être la cause de son plantage. De plus, tu ne crées pas de processus fils dans ce code exemple, ce que le man indique comme procéder classique d'utilisation de ptrace : Citation:
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
|
10
|
|
|
#3 | |||||
|
Membre éclairé
![]() Marc Ingénieur sécurité Inscription : novembre 2009 Messages : 282 ![]() |
Oui ça confirme ce que j'avais lu en anglais, mais j'étais pas à 100% sûr de moi
Donc voila la partie suivante, je me suis dis tiens, pourquoi ne pas utiliser attach. Mais je n'arrive à rien. Le manuel dit : Citation:
Code :
Et la sortie : Code :
Quelqu'un aurait une idée ? |
|||||
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 696 ![]() |
Euh.... Si j'ai bien compris, ptrace permet à un processus père de suivre un processus fils. Dans ton code, je ne vois pas de processus fils et donc je vois pas comment ça pourrait marcher. Il faut que ton processus en cours crée un processus fils, avec fork() puis établir le lien ptrace entre le père et son fils, en :
prctl() est a appelé dans le processus à suivre si ce processus n'est pas le fils du suiveur. C'est le cas à partir de Ubuntu 10.10 mais ça peut différer avec un autre OS. Que souhaites-tu faire en fait ? Tu souhaites débugguer un programme que tu as écrit ? Des tâches plus complexes ?
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
00
|
|
|
#5 |
|
Membre éclairé
![]() Marc Ingénieur sécurité Inscription : novembre 2009 Messages : 282 ![]() |
En faite la technique de détection du debugging (technique faible d'ailleurs) est de regarder si un processus est déjà en cours de débug. Car la plupart des débugger utilise la librairie ptrace pour effectuer celui-ci.
L'idée est la suivante, tu essayes de te debugger, si il te renvoie une erreur c'est que tu es déjà sous débug. J'arrive à le faire une fois sans problème, mais ensuite je n'arrive pas à le détacher (c'est ce que je fais avec ptrace_me. Maintenant j'aimerai le faire avec attach pour pouvoir le détacher. C'est pour cela que je veux être mon propre père-fils dans un seul programme. Comme ça je peux me détacher-rattacher quand je le souhaite. J'essayerai de le faire avec un fork la semaine prochaine, mais je pensais que je pouvais le faire sans créer de processus fils. |
|
|
00
|
|
|
#6 | ||
|
Membre éclairé
![]() Marc Ingénieur sécurité Inscription : novembre 2009 Messages : 282 ![]() |
J'ai fais quelques essaie, mais c'est vraiment la misère
Je ne trouve aucun moyen pour faire ce que je veux, c'est à dire voir si je suis déjà sous ptrace, et revenir à un état ou je peux ré-effectuer ce test. Si j'utilise un fork, cela ne sert à rien car je contrôle si le fork est sous ptrace et non si le processus père l'est. J'ai voulu tenter une autre approche : 1. Je fais un ptraceme sur mon processus. 2. Si retour -1 exit (je suis déjà sous debugger). Sinon, je crée un fork, qui va s'attacher à son père et se détacher (j'espère que cela annule le ptraceme). 3. je ferme mon fork. 4. J'effectue les phases 1-3 à nouveau. Le problème c'est que je n'arrive pas à m'attacher sur mon processus père : Code :
Merci |
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com