Ich schreibe ein Werkzeug. Ein Teil dieses Tools ist seine Fähigkeit, die Parameter der Systemaufrufe zu protokollieren. Okay, ich kann ptrace
für diesen Zweck verwenden, aber ptrace
ist ziemlich langsam. Eine schnellere Methode, die mir in den Sinn kam, war das Glibc zu modifizieren. Aber das wird schwierig, da gcc magisch seine eigenen eingebauten Funktionen als Systemaufruf-Wrapper einfügt, anstatt den in glibc definierten Code zu verwenden. Auch die Verwendung von -fno-builtin
hilft da nicht.Ist dies eine gute Möglichkeit, Systemaufrufe abzufangen?
Also kam ich auf diese Idee, eine Shared Library zu schreiben, die jeden Systemaufruf-Wrapper enthält, wie mmap
und führen Sie dann die Protokollierung vor dem Aufruf der eigentlichen Systemaufruf-Wrapper-Funktion. Zum Beispiel ist der Pseudocode, wie mein mmap
aussehen würde, unten angegeben.
int mmap(...)
{
log_parameters(...);
call_original_mmap(...);
...
}
Dann kann ich LD_PRELOAD verwenden, um diese Bibliothek zuerst zu laden. Denkst du, dass diese Idee funktionieren wird, oder fehlt mir etwas?
Es wird wahrscheinlich nicht für statisch verknüpfte ausführbare Dateien funktionieren. Und es wird nicht für ausführbare Dateien funktionieren, die syscalls ausführen, ohne durch libc zu gehen. –
Möchten Sie jedes Mal abfangen, wenn ein tatsächlicher Sys-Aufruf ausgeführt wird (bei jedem "int 0x80") oder bei jedem Aufruf einer Library-Handler-Funktion? – Chris
Ich denke, es wird wahrscheinlich langsam sein. Das ist genau das, was Valgrind für seine Instrumentierung tut, und obwohl es ein sehr bekanntes und entwickeltes Werkzeug ist, tötet es immer noch die Leistung. Ich denke, wenn es einen schnelleren Weg gäbe, wäre es schon dort benutzt worden. Meine Vermutung ist, dass Sie unterschätzen, wie viel die Protokollierungsfunktion kosten wird, und daran gibt es keinen Weg. – zebediah49