Abfangen von Systemaufrufen im Linux-Kernel-Modul (Kernel 3.5)

8

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?

    
Alex 14.12.2012, 09:58
quelle

5 Antworten

7

das funktioniert für mich.

Siehe Linux Kernel: Beispiel für den Aufruf von Systemanrufen und Ссылка

%Vor%     
domenukk 16.12.2012 21:29
quelle
6

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 ).

    
kaiwan 15.12.2012 07:48
quelle
0

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 .

    
LubosD 14.12.2012 13:14
quelle
0

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?

    
Ilya Matveychikov 17.12.2012 18:57
quelle
0

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%     
PaulDaviesC 17.01.2013 16:05
quelle