System call interception in linux-kernel-module (kernel 3.5)
Muss ich ersetzen ein standard-system-Aufruf (z.B. SYS_mkdir) mit meine eigene Implementierung.
Als ich Las in einigen Quellen, einschließlich diese Frage auf Stackoverflow, die sys_call_table
wird nicht exportiert symbol seit der kernel-version 2.6
.
Habe ich versucht den folgenden code:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/unistd.h>
#include <asm/syscall.h>
int (*orig_mkdir)(const char *path);
....
int init_module(void)
{
orig_mkdir=sys_call_table[__NR_mkdir];
sys_call_table[__NR_mkdir]=own_mkdir;
printk("sys_mkdir replaced\n");
return(0);
}
....
Leider erhalte ich compiler-Fehler:
error: assignment of read-only location ‘sys_call_table[83]’
Wie kann ich ersetzen die system call?
EDIT: gibt es eine Lösung ohne den kernel zu patchen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
dies funktioniert für mich.
Sehen
Linux-Kernel: System call hooking Beispiel
und
https://bbs.archlinux.org/viewtopic.php?id=139406
Ja, es ist eine Lösung ohne Patch/Wiederaufbau der kernel. Verwenden Sie die Kprobes Infrastruktur (oder SystemTap).
Dieser ermöglicht wird, die "Sonden" (Funktionen) an jedem Punkt(s) innerhalb des Kernels, durch ein kernel-Modul.
Macht ähnliche Sachen durch ändern der sys_call_table wird nun verhindert (es ist read-only) & ist als ein dirty hack! Kprobes/Jprobes/etc sind eine "saubere" Art und Weise, dies zu tun..Auch die Dokumentation und Proben in der kernel source-tree ist hervorragend (Blick unter das kernel-src-tree- Documentation/kprobes.txt).
Zuerst müssen Sie bestimmen die Lage der sys_call_table. Sehen hier.
Bevor Sie schreiben, in dem sich nur der system-Tabelle, die Sie haben, um Ihre Speicher-Seiten beschreibbar. Für, dass der check hier und wenn das nicht funktioniert, versuchen Sie diese.
Verwenden LSM infrustructure.
Blick auf LSM hooks
path_mkdir
oderinode_mkdir
für details. Eine Frage, die gelöst werden muss, ist, wie die Registrierung Ihrer eigenen LSM-Modul, während das system nicht erlauben es ausdrücklich. Siehe die Antwort für details hier:Wie kann ich umsetzen, meine eigene hook-Funktion mit LSM?
Wird das problem verursacht, aufgrund der Tatsache, dass sys_call_table ist nur Lesen. Um zu vermeiden, dass die Fehler, vor dem Bearbeiten der sys_call_table, Sie haben, um es beschreibbar als gut. Der kernel bietet eine Funktion, um es zu erreichen. Und diese Funktion ist gegeben als set_mem_rw().
Fügen Sie einfach den folgenden code-snippet vor dem Bearbeiten der sys_call_table
In der exit-Funktion des kernel-Moduls,bitte vergessen Sie nicht, wieder zurück, der sys_call_table zurück auf nur Lesen.Es kann erreicht werden, wie unten beschrieben.