Ich muss einen Standardsystemaufruf (z. B. SYS_mkdir) durch meine eigene Implementierung ersetzen.Abfangen von Systemaufrufen im Linux-Kernelmodul (Kernel 3.5)
Wie ich in einigen Quellen, einschließlich this question auf Stackoverflow lesen, wird das sys_call_table
nicht als Symbol seit Kernel-Version 2.6
exportiert.
Ich habe 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 das Systemaufruf ersetzen?
EDIT: Gibt es eine Lösung ohne Kernel-Patch?
versuchen mit Typumwandlung zu 'char *' dann –
zuweisen kann [diese] (http://www.linuxforums.org/forum/kernel/133982-cannot-modify-sys_call_table.html) und [ dies] (http://stackoverflow.com/questions/2103315/linux-kernel-system-call-hooking-example) ist hilfreich für Sie –
Es gibt keine universelle Lösung ohne Patching. –