Ptrace -Systemaufruf in C

Ptrace -Systemaufruf in C
PTRACE () -Systemanruf wird im Allgemeinen zum Debuggen von Haltepunkten und zum Verfolgen von Systemaufrufen verwendet. Der Aufruf von pTrace () „Prozessverfolgung“ wird häufig zum Debugging verwendet. Es ist der Hauptweg, wie native Debugger den Überblick behalten. Tracees können angehalten werden, Register und Speicher können überprüft und festgelegt werden, Systemaufrufe können überwacht werden und sogar Systemaufrufe können mit dem Ptrace -Systemaufruf abgefangen werden. Die Spur muss zuerst mit dem Tracer verbunden sein. In einem Multithread-Prozess kann jeder Faden separat an einen möglicherweise eindeutigen Tracer oder unabhängig gelassen und daher nicht entschärft werden. Infolgedessen bezieht sich „Tracee“ immer auf einen „potenziell multitHhread.

Alle Signale, die dem nachverfolgten Prozess zur Verfügung gestellt werden, werden es unabhängig von seiner registrierten Signalverarbeitung anhalten und ein Ereignis in Richtung des Verfolgungsprozesses liefern, das mithilfe der Wait () -Systemfunktion ermittelt werden kann. Das Sigkill -Signal ist eine Ausnahme, da es sofort geliefert wird und das erwartete Verhalten durchführt. Es gab noch nie einen Standard für Ptrace System Call. Die Schnittstelle ist über Betriebssysteme hinweg vergleichbar, insbesondere hinsichtlich der wesentlichen Funktionalität, unterscheidet sich jedoch geringfügig von einem System zum nächsten.

Systemaufrufe können mit der Linux -Ausgabe von Ptrace verfolgt werden. Die PTRACE -SYSCALL -Anfrage startet den untergeordneten Prozess genauso wie Ptrace Cont. Dies bringt viele neue Möglichkeiten hervor. Für PTRACE -Peek -Anfragen gibt PTRACE () die gewünschten Daten zurück. Für alle anderen Anfragen wird Null zurückgegeben. Alle Anfragen, die fehlschlagen, return -1, wobei Erno den optimalen Wert festgelegt hat. Bei Ptrace -Peek -Anfragen kann -1 ein legitimer Rückgabewert sein. Das Programm ist dafür verantwortlich, festzustellen, ob dies eine Fehlersituation oder ein gültiger Rückgabewert ist. Dieser Leitfaden erklärt Ihnen die Funktionalität des Ptrace () -Systemaufrufs in C -Sprache mit einem Beispiel.

Beispiel zum Verständnis von pTrace () Systemaufruf in C -Sprache

Um den Aufruf von pTrace () -System in C -Sprache zu verstehen, verwenden wir Ubuntu 20.04 Linux -System Um sein Beispiel zu implementieren. Der GCC -Compiler wurde bereits in unserem System zur Ausführung von Code installiert. Sie können es mit der folgenden Anweisung in der Terminalhülle des Ubuntu 20 installieren.04 Linux -System.

$ sudo APT Installieren Sie GCC

Beginnen wir nun mit unserem Beispiel. Erstellen Sie eine Datei mit einem Ihrer gewünschten Namen mit dem .c Erweiterung im Terminal unter Verwendung der Nano -Anweisung. Sie können die Datei direkt erstellen, indem Sie zu jedem Home -Verzeichnis gehen oder auch den Befehl "touch" verwenden. Der Zweck der Nano -Anweisung besteht darin, den GNU -Editor direkt über das Terminal zu öffnen. Führen Sie nun die folgende Anweisung in der Terminalschale des Ubuntu 20 aus.04 Linux -System.

$ nano q.C

Gnu Nano 4.8 wird auf Ihrem Bildschirm angezeigt. Schreiben Sie nun den Code, der im folgenden Bild angezeigt wird.

Im obigen Code haben wir einige Standardbibliotheken verwendet. PTrace traceme gibt an, dass der übergeordnete dieses Prozesses es verfolgen kann. Wenn sein Elternteil nicht erwartet, es zu verfolgen, sollte ein Prozess diese Anfrage einfach nicht einreichen. Die PID, ADDR und Daten werden nicht berücksichtigt. Die Tracee ist der einzige, der den Ptrace Traceme -Anruf verwendet. Der Tracer verwendet nur die anderen Anfragen. Der übergeordnete Prozess gibt den Prozess eines Kindes und überwacht ihn im obigen Szenario. Der Unterprozess führt die PTRACE-Funktion mit PTrace Traceme als erster Parameter aus, bevor er die EXEC-Funktion aufruft, die den Kernel informiert: Der untergeordnete Prozess steuert dann den übergeordneten Prozess nach dem Aufrufen von Execve ().

Der übergeordnete Prozess verwendete die Wait () -Funktion, um auf Kernel -Warnungen zu warten, und nun, da er benachrichtigt wurde, kann er feststellen, was die Kinderprozesse durchgeführt haben, z. B. die Inspektion von Registerwerten. Der Kernel speichert die gesamten Funktionen des „EAX“ -Registers, das die Anzahl der Systemanrufe erfasst, wenn der Systemaufruf stattfindet. Ptrace Peekuser Lesen Sie ein Wort aus dem Benutzerabschnitt der Tracee, das die Register und andere Daten des Prozesses enthält (SYS/Benutzer.h>)). Infolge des Ptrace () -Anrufs wird die Zeichenfolge zurückgegeben. Der Offset muss normalerweise von Wort ausgerichtet sein, obwohl dies je nach Architektur variieren kann.

Ptrace Cont nimmt den Tracee -Prozess wieder auf, wenn es gestoppt wurde. Wenn Daten nicht Null sind, wird sie als die Anzahl der Signale verstanden, die an die Tracee gesendet werden sollen. Dann werden keine Signale gesendet. Der Tracer kann beispielsweise regulieren, ob ein an die Tracee gesendete Signal übertragen wird oder nicht. Die Zusammenstellung und Ausführung kann durchgeführt werden, indem die folgenden Anweisungen in der Terminalhülle des Ubuntu 20 ausgeführt werden.04 Linux -System.

$ gcc q.C
$ ./A.aus

Die erfolgreiche Ausgabe wurde im oben genannten Bild gezeigt.

Abschluss

Der Ptrace () -Systemaufruf wurde in der C -Programmiersprache häufig verwendet, kann jedoch ein laufendes Programm identifizieren und ändern. Die Ptrace -Funktion mag seltsam erscheinen. Debugger und Systeme rufen Tracker an, die diese Technik häufig einsetzen. Am Benutzer ermöglicht es den Programmierern, interessantere Dinge zu tun. Dieser Artikel lieferte das grundlegende Verständnis und die Implementierung des Ptrace () -Systemaufrufs. Der Beispielcode kann bei Bedarf geändert werden/