Appel du système Ptrace dans C

Appel du système Ptrace dans C
L'appel du système PTRACE () est généralement utilisé pour déboguer les points d'arrêt et le traçage des appels système. L'appel système PTRACE () «Trace Trace» est fréquemment utilisé à des fins de débogage. C'est la principale façon dont les débuggeurs indigènes suivent. Les traces peuvent être interrompues, les registres et la mémoire peuvent être inspectés et définis, les appels système peuvent être surveillés, et même les appels système peuvent être interceptés à l'aide de l'appel système PTRACE. Le tracee doit d'abord être connecté au traceur. Dans un processus multithread, chaque thread peut être attaché séparément à un traceur éventuellement distinct ou laissé sans attache et donc non débugé. En conséquence, «Tracee» fait toujours référence à «un processus potentiellement multithread, jamais ou peut-être multithread un processus.

Tous les signaux fournis au processus tracé, à l'exception de celui-ci, le font s'arrêter, quel que soit son traitement de signal enregistré, et offrez un événement au processus de traçage, qui peut être identifié à l'aide de la fonction Système d'attente (). Le signal Sigkill est une exception, car il est livré instantanément et accomplit le comportement attendu. Il n'y a jamais eu de norme pour l'appel du système PTRACE. Son interface est comparable entre les systèmes d'exploitation, notamment en termes de fonctionnalités essentielles, mais elle diffère légèrement d'un système à l'autre.

Les appels système peuvent être tracés à l'aide de l'édition Linux de Ptrace. La demande Ptrace Syscall redémarre le processus de l'enfant de la même manière que le SUR PTRACE, mais il s'arrête pour qu'il s'arrête à la prochaine entrée d'appel système ou sortie. Cela évoque beaucoup de nouvelles opportunités. Pour les demandes PTRACE PEEK, PTRACE () renverra les données souhaitées; il retournera zéro pour toutes les autres demandes. Toutes les demandes qui échouent renvoient -1, avec Errno réglé sur la valeur optimale. Dans le cas des demandes PTRACE PEEK, -1 peut être une valeur de retour légitime; Le programme est chargé de déterminer s'il s'agit d'une situation d'erreur ou d'une valeur de retour valide. Ce guide vous expliquera la fonctionnalité de l'appel du système PTRACE () dans le langage C avec un exemple.

Exemple pour comprendre l'appel du système ptrace () dans le langage C

Pour comprendre l'appel du système PTRACE () dans le langage C, nous utilisons Ubuntu 20.04 Système Linux pour implémenter son exemple. Le compilateur GCC a déjà été installé dans notre système pour l'exécution du code. Vous pouvez l'installer en utilisant l'instruction ci-dessous dans le shell terminal de l'Ubuntu 20.04 Système Linux.

$ sudo apt install gcc

Maintenant, commençons par notre exemple. Créez un fichier avec l'un de vos noms souhaités avec le .C extension dans le terminal en utilisant l'instruction nano. Vous pouvez créer directement le fichier en accédant à n'importe quel répertoire domestique ou en utilisant également la commande «Touch». Le but de l'utilisation de Nano Instruction est d'ouvrir directement l'éditeur GNU sur le terminal. Maintenant, exécutez les instructions ci-dessous dans le shell terminal de l'Ubuntu 20.04 Système Linux.

$ nano q.c

GNU nano 4.8 apparaîtra sur votre écran. Maintenant, écrivez le code affiché dans l'image ci-dessous.

Dans le code ci-dessus, nous avons utilisé certaines bibliothèques standard. Ptrace Traceme spécifie que le parent de ce processus devrait être capable de le suivre. Si son parent ne s'attend pas à le suivre, un processus ne doit tout simplement pas soumettre cette demande. Le PID, l'addr et les données ne sont pas réservés. Le Tracee est le seul à utiliser l'appel Ptrace Traceme; Le traceur utilise uniquement les autres demandes. Le processus parent alimente le processus d'un enfant et le surveille dans le scénario ci-dessus. Le sous-processus exécute la fonction PTRACE avec Ptrace Traceme comme premier paramètre avant d'invoquer la fonction Exec, qui informe le noyau: le processus de l'enfant contrôle ensuite le processus parent après l'appel Execve ().

Le processus parent utilisait la fonction attend () pour attendre les alertes du noyau, et maintenant qu'il a été informé, il peut observer ce que les processus enfants ont fait, comme l'inspection des valeurs de registre. Le noyau enregistre toutes les fonctionnalités du registre «EAX», qui saisit le nombre d'appels système chaque fois que l'appel système se produit. Ptrace Peekuser Lire un mot de la section utilisateur de la tracee, qui contient les registres du processus et autres données (SYS / User.h>). En raison de l'appel ptrace (), la chaîne est retournée. Le décalage doit généralement être aligné par mot, bien que cela puisse varier en fonction de l'architecture.

Ptrace Cont reprend le processus Tracee s'il a été interrompu. Si les données ne sont pas nulles, elles sont comprises comme le nombre de signaux à envoyer à la tracee; Ensuite, aucun signal n'est envoyé. Le traceur, par exemple, peut réguler si un signal envoyé à la tracee est transmis ou non. La compilation et l'exécution peuvent être effectuées en exécutant les instructions ci-dessous dans le shell terminal de l'Ubuntu 20.04 Système Linux.

$ gcc q.c
$ ./un.dehors

La sortie réussie a été montrée dans l'image ci-dessus.

Conclusion

L'appel système PTRACE () a été largement utilisé dans le langage de programmation C, mais il peut identifier et modifier un programme en cours d'exécution; La fonction PTRACE peut sembler bizarre. Les débuggeurs et les systèmes appellent les trackers utilisés couramment cette technique. À la fin de l'utilisateur, il permet aux programmeurs de faire des choses plus intéressantes. Cet article a fourni la compréhension et la mise en œuvre de base de l'appel du système PTRACE (). L'exemple de code peut être modifié si nécessaire /