[LINUX] Essayez de jouer avec l'uprobe qui prend directement en charge Systemtap

Cet article est l'article du 10ème jour du Linux Advent Calendar 2016.

Aperçu

Uprobes utilisables depuis ftrace, eBPF / bcc, Systemtap, etc. Je ne trouve pas d'exemple (module du noyau) qui puisse être exécuté par des uprobes seuls comme kprobes. Donc, Noël est proche, donc cette fois, je vais vous présenter un échantillon d'uprobes que tout le monde peut facilement utiliser (je ne dis pas que vous devriez vous sentir libre de faire un module de noyau). L'explication détaillée de l'implémentation est omise, mais l'instruction correspondante est réécrite en 0xcc et ignorée.

environnement

Distribution: Ubuntu 16.04 Noyau utilisé pour l'investigation et la vérification: 4.4.0-45-generic

API uprobes

uprobes est un mécanisme du noyau Linux qui sonde les processus utilisateur à partir de l'espace noyau. Les uprobes sont généralement utilisés à partir d'interfaces configurables dans l'espace utilisateur telles que ftrace Un module du noyau qui utilise des uprobes est généré à partir d'un script unique comme Systemtap, et y est utilisé.

Puisque Noël approche de cette heure, j'écrirai un module noyau pour un contact direct avec les uprobes.

Tout d'abord, jetons un coup d'œil à l'API côté noyau pour utiliser le mécanisme uprobes.

/*
 * uprobe_register - register a probe
 * @inode: the file in which the probe has to be placed.
 * @offset: offset from the start of the file.
 * @uc: information on howto handle the probe..
 *
 * Apart from the access refcount, uprobe_register() takes a creation
 * refcount (thro alloc_uprobe) if and only if this @uprobe is getting
 * inserted into the rbtree (i.e first consumer for a @inode:@offset
 * tuple).  Creation refcount stops uprobe_unregister from freeing the
 * @uprobe even before the register operation is complete. Creation
 * refcount is released when the last @uc for the @uprobe
 * unregisters.
 *
 * Return errno if it cannot successully install probes
 * else return 0 (success)
 */
int uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *uc)

On peut voir que les informations qui doivent être définies sont à peu près l'inode du fichier cible de la sonde, le décalage de la cible de la sonde du fichier de la cible de la sonde et le gestionnaire à exécuter lorsque la sonde est effectuée.

Ensuite, regardons la structure uprobe_consumer qui définit la fonction au moment de la sonde.

struct uprobe_consumer {
        int (*handler)(struct uprobe_consumer *self, struct pt_regs *regs);
        int (*ret_handler)(struct uprobe_consumer *self,
                                unsigned long func,
                                struct pt_regs *regs);
        bool (*filter)(struct uprobe_consumer *self,
                                enum uprobe_filter_ctx ctx,
                                struct mm_struct *mm);

        struct uprobe_consumer *next;
};

A partir de la définition de la structure uprobe_consumer, on peut voir que la structure pt_regs est passée via le gestionnaire au moment de la sonde.

échantillon

Cette fois, exécutez l'exemple d'application C approprié ci-dessous pour analyser l'appel de fonction debuggee_func.

#include <stdio.h>

int debuggee_func(int a, int b)
{
        int result;
        result = a + b;
        return result;
}

void main()
{
        int result;
        result = debuggee_func(1, 2);
        printf("result: %d", result);
}

Ensuite, l'exemple de module de noyau qui utilise des uprobes est placé ci-dessous. Veuillez vérifier l'exemple de code ci-dessous pour un traitement tel que la conversion du chemin du fichier en inode.

https://github.com/kentaost/uprobes_sample/blob/master/uprobes_sample.c

Le DEBUGGEE_FILE suivant dans cet exemple de module de noyau uprobes représente le fichier à déboguer et DEBUGGEE_FILE_OFFSET représente le décalage. Le décalage est obtenu à partir de l'adresse de la fonction cible et de l'adresse de début du segment de texte pour le binaire cible en utilisant readelf ou analogue. Dans mon environnement, la fonction debuggee_func était 0x526 (0x400526 --0x400000), j'ai donc intégré cette valeur et l'ai créée.

#define DEBUGGEE_FILE "/home/kentaost/debuggee_app"
#define DEBUGGEE_FILE_OFFSET (0x526)

Après avoir insmodé cet exemple de module de noyau, exécutez l'exemple d'application et regardez dmesg, et vous verrez des preuves de sondage comme indiqué ci-dessous.

…
[xxxx.xxxxxx] handler is executed
[xxxx.xxxxxx] ret_handler is executed

Comme vous pouvez le voir dans la fonction uprobe_register, ce n'est pas un mécanisme pour définir la sonde pour chaque processus utilisateur. Par exemple, on peut voir que même si le même programme est lancé plusieurs fois, il sera sondé.

En passant, si vous faites de votre mieux, vous pouvez préparer une trace de la pile de l'espace utilisateur comme le robinet Système ci-dessous. (Systemtap prépare le tapset pour que vous n'ayez pas à travailler dur, donc utilisez généralement Systemtap et tapset)

http://qiita.com/kentaost/items/a2e882d2978fba9e17d3

Résumé

Bien que cette fois-ci omis, si vous comprenez également l'implémentation interne des uprobes, vous pouvez comprendre le comportement lors de l'analyse d'un processus utilisateur avec Systemtap etc. (lors de l'utilisation d'uprobes). Il n'y a aucune utilité pour une utilisation directe, mais vous devez utiliser ftrace et Systemtap docilement sauf pour Noël.

Recommended Posts

Essayez de jouer avec l'uprobe qui prend directement en charge Systemtap
Essayez de résoudre le problème du fizzbuzz avec Keras
Essayez de résoudre le diagramme homme-machine avec Python
Je voulais jouer avec la courbe de Bézier
Comment essayer l'algorithme des amis d'amis avec pyfof
Essayez de résoudre le livre des défis de programmation avec python3
Visualisons la pièce avec tarte aux râpes, partie 1
Essayez de résoudre le problème d'affectation du médecin de formation avec Python
Essayez d'obtenir le contenu de Word avec Golang
[Neo4J] ④ Essayez de gérer la structure du graphe avec Cypher
Essayez de créer une forme d'onde (spectre audio) qui se déplace en fonction du son avec python
Essayez de défier le sol par récursif
Essayez d'automatiser le fonctionnement des périphériques réseau avec Python
Essayez d'extraire les mots-clés populaires dans COTOHA
L'histoire de la définition de la clé privée à 600 avec chmod
Essayez de visualiser les nutriments des flocons de maïs que le champion de M-1 Milkboy a dit avec Python
Essayez de déchiffrer les caractères déformés dans le nom du fichier joint avec Python
Essayez d'extraire les caractéristiques des données de capteur avec CNN
Essayez de générer une image de veste de type death metal avec DCGAN + grattez le site de base de données de métaux pour cela
Essayez de résoudre le problème N Queen avec SA de PyQUBO
Ecrire un programme qui abuse du programme et envoie 100 e-mails
Essayez de résoudre l'itinéraire le plus court avec les données sociales Python + NetworkX +
Du «dessin» à «l'écriture» du diagramme de configuration: essayez de dessiner le diagramme de configuration AWS avec des diagrammes
Essayez d'exploiter Facebook avec Python
Essayez de profiler avec ONNX Runtime
Essayez d'introduire le thème sur Pelican
Essayez Cython dans les plus brefs délais
Essayez de brouiller l'image avec opencv2
Essayez de produire de l'audio avec M5 STACK
Le moyen le plus rapide d'essayer EfficientNet
La façon la plus simple d'essayer PyQtGraph
Comment appeler une requête POST prenant en charge le japonais (Shift-JIS) avec des requêtes
Mettez Cabocha 0.68 dans Windows et essayez d'analyser la dépendance avec Python
Essayez d'imaginer les données d'élévation du National Land Research Institute avec Python
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (théorie)
Essayez de ne faire réagir que le carbone en bout de chaîne avec SMARTS
Convertissez un programme qui importe la bibliothèque cliente de Google en .exe avec pyinstaller
Correction d'un bug où node.surface ne pouvait pas être obtenu avec python3 + mecab
Essayez de séparer l'arrière-plan et l'objet en mouvement de la vidéo avec OpenCV
[Introduction à WordCloud] Jouez avec le scraping ♬
Essayez de reproduire un film couleur avec Python
Essayez de vous connecter à qiita avec Python
Essayez de faire face à la somme partielle
Ajustez le module ui de pythonista3
Essayez l'algorithme Variational-Quantum-Eigensolver (VQE) avec Blueqat
Essayez d'utiliser l'appareil photo avec OpenCV de Python
Fractal pour faire et jouer avec Python
Je veux jouer avec aws avec python
Essayez de prédire les fleurs de cerisier avec XG Boost
Essayez de convertir en données ordonnées avec les pandas
Essayez rapidement de visualiser votre ensemble de données avec des pandas
Python amateur tente de résumer la liste ①
Premier YDK à essayer avec Cisco IOS-XE
Essayez de réécrire le fichier avec la commande less
Alignez la barre de couleurs sur la figure avec matplotlib
Jouez avec Dajare en utilisant l'API COTOHA
Essayez de générer une image avec aliénation
La route de la compilation vers Python 3 avec Thrift
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (code Python)