Warum verwendet strace keine Testsyscalls, um ihre Indizes in der Systemaufruftabelle herauszufinden?


2

Ich verstehe, dass der straceBefehl verwendet ptrace(PTRACE_PEEKUSER, child, __builtin_offsetof(struct user, regs.orig_eax)), um den Index eines Systemaufrufs zu finden, bei dem das Trace-Kind gefangen ist. Um den Index dann in den Namen der syscall-Funktion zu übersetzen, wurden Tabellen erstellt, die aus dem Greifen der in der Installation vorhandenen Linux-Quellcode-Header bestehen.

Diese Methode muss undokumentiert und fehleranfällig sein, da Speicherort und Syntax von Quellcodedeklarationen nicht dokumentiert sind, durch Greifen ermittelt werden müssen und sich auf unbekannte Weise ändern können. Habe ich Recht, das zu sagen?

Wenn dem so ist, warum sollte straceich dann nicht die folgende Methode anwenden, die meiner Meinung nach einfacher ist, sich nur auf die Dokumentation stützt und somit narrensicher ist.

straceSendet zu Beginn des ersten Laufs nach dem Neustart einen Test-Syscall, einen für jede Syscall-Funktion, fängt diesen ab und beobachtet, welchen Syscall-Index das untergeordnete System verwendet. Das ergibt eine vollständige und korrekte benutzerdefinierte Tabelle, die in einer Datei gespeichert werden kann, die weiteren Aufrufen von bekannt ist strace.

Ich bin sicher, dass diese Methode in Betracht gezogen worden sein muss, da es nichts besonders Geniales ist. Es muss also etwas falsch daran sein. Was ist falsch??


Wie würden diese Testsystemaufrufe ausgeführt, außer unter Verwendung der Konstanten aus den System- / Kernel-Headern?
R ..

Auch "first run after reboot" ist ein Konzept, das überhaupt keinen Sinn ergibt. Wie würde es überhaupt so etwas wissen?
R ..

@R .. ?? open(foobar.txt, O_RDONLY) Keine undokumentierten Sachen erforderlich
user322908

@R .. was "den ersten Lauf" betrifft, wollte ich einfach nicht riskieren, dass jemand einige Header ändert, den Kernel neu kompiliert und mit dem neuen Kernel neu startet (das kann übrigens den Strom brechen, straceglaube ich ). Ich muss also sicherstellen, dass die Tabelle stracebeim Neustart gelöscht wird , wenn sie gespeichert wird, da sie nicht bei jedem Aufruf neu berechnet werden soll. Sicherlich muss es in Linux eine Möglichkeit geben, festzustellen, ob ich nach dem Neustart zum ersten Mal angerufen werde. Sicherlich muss es eine Datei geben, die beim Neustart berührt / erstellt wird, damit ich meinen Zeitstempel damit vergleichen kann?
User322908

1
Woher weißt du, open(foobar.txt, O_RDONLY)dass genau ein Systemaufruf erfolgt und das ist SYS_open? Es könnte verwenden SYS_openat. Dies kann dazu führen, dass andere Systemaufrufe als Teil der verzögerten Bindung im dynamischen Linker stattfinden, wenn dies der erste Aufruf von ist open. Oder es handelt sich um andere Systemaufrufe, die intern für einen anderen Zweck verwendet werden. Es gibt keine triviale Eins-zu-Eins-Zuordnung, die Sie zwischen Bibliotheksaufrufen und Systemaufrufen annehmen können.
R ..

Antworten:


1

Weil es auf dieser niedrigen Ebene kein Konzept für einen Syscall-Namen gibt. Es gibt keine Möglichkeit zu stracesagen "Hey, lass uns einen fcntl()Anruf tätigen und sehen, wie die Nummer ist!". Sie kann nur Anrufe tätigen, die auf den Systemrufnummern selbst basieren. Dies liegt daran, dass ein Syscall ausgeführt wird, wenn die Syscall-Nummer im eaxoder -Register gespeichert raxwird und der Prozess int 0x80oder aufruft syscall.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.