Ich muss einen Standardsystemaufruf (z. B. SYS_mkdir) durch meine eigene Implementierung ersetzen.
Wie ich in einigen Quellen gelesen habe, einschließlich diese Frage Bei Stackoverflow wird das sys_call_table
seit der Kernelversion 2.6
nicht exportiert.
Ich habe den folgenden Code ausprobiert:
%Vor%Leider erhalte ich einen Compilerfehler:
%Vor%Wie kann ich den Systemaufruf ersetzen?
BEARBEITEN: Gibt es eine Lösung ohne Kernel-Patch?
das funktioniert für mich.
Siehe Linux Kernel: Beispiel für den Aufruf von Systemanrufen und Ссылка
%Vor%Ja, es gibt eine Lösung, ohne den Kernel zu patchen / neu aufzubauen. Verwenden Sie die Kprobes Infrastruktur (oder SystemTap).
Dies ermöglicht es Ihnen, "Sonden" (Funktionen) an beliebigen Punkten im Kernel unter Verwendung eines Kernel-Moduls zu platzieren.
Durch das Ändern der sys_call_table wird jetzt verhindert, dass ähnliche Sachen (es ist nur lesbar) & & amp; gilt als ein schmutziger Hack! Kprobes / Jprobes / etc sind eine "saubere" Möglichkeit, dies zu tun ... Auch die Dokumentation und Beispiele in der Kernel-Source-Struktur zur Verfügung gestellt wird, ist hervorragend (siehe unter dem Kernel src Baum- Documentation / kprobes .txt ).
Zuerst müssen Sie den Speicherort von sys_call_table ermitteln. Siehe hier .
Bevor Sie in die gerade gefundene Systemtabelle schreiben, müssen Sie ihre Speicherseiten beschreibbar machen. Dafür hier und wenn das nicht funktioniert, versuche < a href="https://stackoverflow.com/a/6742086/479753"> dies .
Verwenden Sie LSM Infrastructure.
Sehen Sie sich die LSM-Hooks path_mkdir
oder inode_mkdir
für Details an. Eine Frage, die gelöst werden muss, ist, wie man sein eigenes LSM-Modul registriert, während das System es nicht explizit erlaubt. Siehe die Antwort für Details hier:
Wie kann ich meine eigene Hook-Funktion mit implementieren? LSM?
Das Problem wird dadurch verursacht, dass sys_call_table schreibgeschützt ist. Um den Fehler zu vermeiden, müssen Sie vor der Manipulation der sys_call_table diese ebenfalls schreibbar machen. Der Kernel bietet eine Funktion, um dies zu erreichen. Und diese Funktion wird als set_mem_rw () angegeben.
Fügen Sie einfach das folgende Code-Snippet hinzu, bevor Sie die sys_call_table
manipulieren %Vor%Vergessen Sie in der Exit-Funktion des Kernel-Moduls nicht, die sys_call_table wieder auf read only zurückzusetzen. Dies kann wie folgt erreicht werden.
%Vor%Tags und Links c linux-kernel kernel-module module