[LINUX] Versuchen Sie, mit dem Uprobe zu spielen, der Systemtap direkt unterstützt

Dieser Artikel ist der Artikel zum 10. Tag des Linux-Adventskalenders 2016.

Überblick

Uprobes, die von ftrace, eBPF / bcc, Systemtap usw. verwendet werden können. Ich kann kein Beispiel (Kernelmodul) finden, das von Uprobes allein wie kprobes ausgeführt werden kann. Da Weihnachten kurz vor der Tür steht, werde ich eine Auswahl von Urobes vorstellen, die jeder leicht verwenden kann (ich sage nicht, dass Sie sich frei fühlen sollten, ein Kernelmodul zu erstellen). Die ausführliche Erklärung zur Implementierung wird weggelassen, aber die entsprechende Anweisung wird in 0xcc umgeschrieben und übersprungen.

Umgebung

Verbreitung: Ubuntu 16.04 Kernel zur Untersuchung und Verifizierung: 4.4.0-45-generic

Uprobes API

uprobes ist ein Linux-Kernelmechanismus, der Benutzerprozesse aus dem Kernelraum abfragt. Uprobes werden normalerweise über konfigurierbare Benutzeroberflächen wie ftrace verwendet Ein Kernelmodul, das Uprobes verwendet, wird aus einem eindeutigen Skript wie Systemtap generiert und darin verwendet.

Da Weihnachten kurz vor dieser Zeit steht, werde ich ein Kernelmodul für den direkten Kontakt mit Urobes schreiben.

Schauen wir uns zunächst die kernelseitige API für die Verwendung des Uprobes-Mechanismus an.

/*
 * 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)

Es ist ersichtlich, dass die Informationen, die eingestellt werden müssen, ungefähr der Inode der Sondenzieldatei, der Sondenzielversatz der Sondenzieldatei und der Handler sind, der ausgeführt werden soll, wenn die Sonde ausgeführt wird.

Schauen wir uns als nächstes die uprobe_consumer-Struktur an, die die Funktion zum Zeitpunkt der Prüfung festlegt.

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;
};

Aus der Definition der uprobe_consumer-Struktur ist ersichtlich, dass die pt_regs-Struktur zum Zeitpunkt der Prüfung über den Handler übergeben wird.

Stichprobe

Führen Sie dieses Mal die entsprechende C-Beispiel-App aus, um den Funktionsaufruf debuggee_func zu testen.

#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);
}

Als nächstes wird das Beispiel-Kernelmodul, das Uprobes verwendet, unten platziert. Bitte überprüfen Sie den folgenden Beispielcode für die Verarbeitung, z. B. die Konvertierung vom Dateipfad zum Inode.

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

Das folgende DEBUGGEE_FILE in diesem Beispiel-Kernelmodul für das Uprobes repräsentiert die zu debuggende Datei, und DEBUGGEE_FILE_OFFSET repräsentiert den Offset. Der Versatz wird aus der Adresse der Zielfunktion und der Startadresse des Textsegments für die Zielbinärdatei unter Verwendung von readelf oder dergleichen erhalten. In meiner Umgebung war die Funktion debuggee_func 0x526 (0x400526 --0x400000), daher habe ich diesen Wert eingebettet und erstellt.

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

Nachdem Sie dieses Beispielkernelmodul modifiziert haben, führen Sie die Beispiel-App aus und sehen Sie sich dmesg an. Sie werden Hinweise auf die Prüfung sehen, wie unten gezeigt.

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

Wie Sie der Funktion uprobe_register entnehmen können, handelt es sich nicht um einen Mechanismus zum Festlegen der Sonde für jeden Benutzerprozess. Beispielsweise ist ersichtlich, dass die Sonde auch dann geprüft wird, wenn dasselbe Programm mehrmals gestartet wird.

Abgesehen davon können Sie, wenn Sie Ihr Bestes geben, einen User Space Stack Trace wie den folgenden Systemtipp vorbereiten. (Systemtap bereitet Tapset so vor, dass Sie nicht hart arbeiten müssen. Verwenden Sie daher normalerweise Systemtap und Tapset.)

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

Zusammenfassung

Wenn Sie diesmal auch die interne Implementierung von Uprobes verstehen, können Sie das Verhalten beim Prüfen eines Benutzerprozesses mit Systemtap usw. (bei Verwendung von Uprobes) verstehen. Es gibt keine Verwendung für die direkte Verwendung, aber Sie sollten ftrace und Systemtap gehorsam verwenden, außer zu Weihnachten.

Recommended Posts

Versuchen Sie, mit dem Uprobe zu spielen, der Systemtap direkt unterstützt
Versuchen Sie, das Fizzbuzz-Problem mit Keras zu lösen
Versuchen Sie, das Mensch-Maschine-Diagramm mit Python zu lösen
Ich wollte mit der Bezier-Kurve spielen
So testen Sie den Friends-of-Friends-Algorithmus mit pyfof
Versuchen Sie, das Programmier-Herausforderungsbuch mit Python3 zu lösen
Stellen wir uns den Raum mit Raspeltorte vor, Teil 1
Versuchen Sie, das Problem der Zuweisung von Schulungsärzten mit Python zu lösen
Versuchen Sie, den Inhalt von Word mit Golang zu erhalten
[Neo4J] ④ Versuchen Sie, die Diagrammstruktur mit Cypher zu handhaben
Versuchen Sie, mit Python eine Wellenform (Audiospektrum) zu erstellen, die sich entsprechend dem Klang bewegt
Versuchen Sie, den Boden durch Rekursion herauszufordern
Versuchen Sie, den Betrieb von Netzwerkgeräten mit Python zu automatisieren
Versuchen Sie, die in COTOHA beliebten Schlüsselwörter zu extrahieren
Die Geschichte, den privaten Schlüssel mit chmod auf 600 zu setzen
Versuchen Sie, die Nährstoffe von Cornflakes zu visualisieren, die M-1-Champion Milkboy mit Python sagte
Versuchen Sie, die verstümmelten Zeichen im angehängten Dateinamen mit Python zu entschlüsseln
Versuchen Sie, Merkmale von Sensordaten mit CNN zu extrahieren
Versuchen Sie, mit DCGAN + ein Death Metal-ähnliches Jackenbild zu erzeugen, und kratzen Sie die Metalldatenbank-Site dafür ab
Versuchen Sie, das N Queen-Problem mit SA von PyQUBO zu lösen
Schreiben Sie ein Programm, das das Programm missbraucht und 100 E-Mails sendet
Versuchen Sie, den kürzesten Weg mit Python + NetworkX + Social Data zu lösen
Vom "Zeichnen" zum "Schreiben" des Konfigurationsdiagramms: Zeichnen Sie das AWS-Konfigurationsdiagramm mit Diagrammen
Versuchen Sie, Facebook mit Python zu betreiben
Versuchen Sie, sich mit ONNX Runtime zu profilieren
Versuchen Sie, das Thema Pelican vorzustellen
Probieren Sie Cython in kürzester Zeit aus
Versuchen Sie, das Bild mit opencv2 zu verwischen
Versuchen Sie, Audio mit M5 STACK auszugeben
Der schnellste Weg, EfficientNet auszuprobieren
Der einfachste Weg, PyQtGraph auszuprobieren
So rufen Sie eine POST-Anfrage auf, die Japanisch (Shift-JIS) mit Anfragen unterstützt
Setzen Sie Cabocha 0.68 in Windows ein und versuchen Sie, die Abhängigkeit mit Python zu analysieren
Versuchen Sie, die Höhendaten des National Land Research Institute mit Python abzubilden
Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus zu lösen (Theorie)
Versuchen Sie, nur den Kohlenstoff am Ende der Kette mit SMARTS zu reagieren
Konvertieren Sie mit pyinstaller ein Programm, das die Client-Bibliothek von Google in .exe importiert
Es wurde ein Fehler behoben, bei dem node.surface mit python3 + mecab nicht abgerufen werden konnte
Versuchen Sie, den Hintergrund und das sich bewegende Objekt des Videos mit OpenCV zu trennen
[Einführung in WordCloud] Spielen Sie mit Scraping ♬
Versuchen Sie, Farbfilme mit Python zu reproduzieren
Versuchen Sie, sich mit Python bei qiita anzumelden
Versuchen Sie, sich der Teilsumme zu stellen
Spielen Sie mit dem UI-Modul von pythonista3
Probieren Sie den Variational-Quantum-Eigensolver (VQE) -Algorithmus mit Blueqat aus
Versuchen Sie, die Kamera mit Pythons OpenCV zu verwenden
Fraktal zum Erstellen und Spielen mit Python
Ich möchte mit aws mit Python spielen
Versuchen Sie, Kirschblüten mit xg Boost vorherzusagen
Versuchen Sie, mit Pandas in ordentliche Daten umzuwandeln
Versuchen Sie schnell, Ihren Datensatz mit Pandas zu visualisieren
Python Amateur versucht die Liste zusammenzufassen ①
Erster Versuch von YDK mit Cisco IOS-XE
Versuchen Sie, die Datei mit dem Befehl less neu zu schreiben
Richten Sie die Farbleiste mit matplotlib an der Figur aus
Spielen Sie mit Dajare mithilfe der COTOHA-API
Versuchen Sie, ein Bild mit Entfremdung zu erzeugen
Der Weg zum Kompilieren zu Python 3 mit Thrift
Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus (Python-Code) zu lösen.