Bonjour je connais PTRACE pour detecter les syscalls, mais je me demandais comment peut on detecter les appels aux fonctions internes du programme ?
EDIT: en regardant le man intel je me demande si c'est pas en detectant l'opcode E8 dans EIP.
Merci
Version imprimable
Bonjour je connais PTRACE pour detecter les syscalls, mais je me demandais comment peut on detecter les appels aux fonctions internes du programme ?
EDIT: en regardant le man intel je me demande si c'est pas en detectant l'opcode E8 dans EIP.
Merci
ptrace te permet effectivement de détecter les appels systèmes. C'est un programme qui lance ton programme.
Ton idée à base de EIP, il me semble, nécessite que tu instrumentes (modifie) ton code...
Tu peux aussi lancer gdb et faire "(gdb) rbreak file.c:." ...
Il faudrait que tu expliques un peu plus ton cas d'usage.
Le cas d'usage est de coder un programme qui a pour but de detecter tous les appels aux fonctions interne du programme.
J'ai essaye en detectant la valeur E8 dans EIP mais je detecte trop de fonction par rapport a objdump en analysant les call.
Merci de votre aide.
C'est le programme qui se surveille lui même ? C'est ça ? Vous voulez vous même coder une fonction qui fasse quelque chose de particulier qui sera appelée à chaque appel de fonction "locale" au programme.
Du coup il faut surveiller tous les appels de fonctions du programme sauf les appels systèmes et l'appel au handler de la surveillance.
Je ne suis toujours pas sûr d'avoir compris si vous voulez faire un programme qui surveille n'importe quel autre process, ou un programme qui surveille sa propre exécution...
C'est un programme qui surveille n'importe quel autre programme.
J'arrive a detecter les syscall en forkant le programme cible puis regarde si il y a 0xcd 0x80 dans EIP mais pour les appels aux fonctions internes c'est plus compliques...
Merci.
Est-ce que tu as la main sur le code source du programme à surveiller ? Cela permettrait d'avoir la possibilité de contrôler la génération de l'exécutable (on pourrait ensuite regarder comment fonctionne les profiler et s'en inspirer par exemple)
Salut,
C'est tout a fait normal, objdump ne te montre que le code de l'exécutable mais pas celui des bibliothèques partagées (.so) auquelles il fait appel. Donc ton programme va également detecter les calls qui seront fait dans celles-ci.Citation:
J'ai essaye en detectant la valeur E8 dans EIP mais je detecte trop de fonction par rapport a objdump en analysant les call.
D'ailleurs les premiers calls que tu va "catcher" à la suite de ton execve seront ceux effectués par le code du loader (ld.so) avant même que le point d'entrée du programme soit atteint.
Sinon tu l'as sans doute remarqué mais 0xe8 n'est pas le seul opcode permetant de faire des calls. Et 0xcd 0x80 n'est pas le seul moyen de faire des appels system.
Donc si tu veux tout gérer tu auras un peu plus de boulot ;)