Muszę zastąpić standardowe wywołanie systemowe (np. SYS_mkdir) moją własną implementacją.Przechwytywanie wywołania systemowego w module jądra Linux (jądro 3.5)
Jak czytałem w niektórych źródłach, w tym this question na Stackoverflow, sys_call_table
nie jest eksportowany symbol od wersji 2.6
jądra.
Próbowałem następujący kod:
#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);
}
....
Niestety otrzymuję błąd kompilatora:
error: assignment of read-only location ‘sys_call_table[83]’
Jak mogę zastąpić wywołanie systemowe?
EDYCJA: Czy istnieje rozwiązanie bez łatania jądra?
spróbować z obsadą do typu char * '' następnie przypisać –
może być [to] (http://www.linuxforums.org/forum/kernel/133982-cannot-modify-sys_call_table.html) i [ this] (http://stackoverflow.com/questions/2103315/linux-kernel-system-call-hooking-example) jest pomocny dla ciebie –
Nie ma uniwersalnego rozwiązania bez łatania. –