WarDuck
03-05-2010, 18:35
Ok, come da titolo, a scopo didattico vorrei intercettare le chiamate di sistema (ad esempio sys_open che consente l'apertura di un file).
L'idea è quella di usare un Linux Kernel Module e sostituire la voce corrispondente della sys_call_table con la mia nuova funzione.
Tuttavia facendo così il modulo mi crasha, presumo che ci sia una qualche protezione che impedisce la modifica della sys_call_table.
Ho cercato a lungo su Google, ma tutti gli esempi conducono a questo risultato.
Per altro a quanto ho letto dal kernel 2.6 in poi non è più esportata la sys_call_table, quindi ho dovuto leggere il valore della locazione di memoria dal file System.map.
Questo è il codice:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/syscalls.h>
unsigned long* sys_call_table = (unsigned long*)0xc0592150;
asmlinkage long (*def_sys_open)(const char *filename, int flags, int mode);
asmlinkage long mod_sys_open(const char *filename, int flags, int mode)
{
printk(KERN_INFO "[HELLO MODULE] Intercepted system call! Filename: %s\n", filename);
return def_sys_open(filename, flags, mode);
}
static int __init hello(void)
{
printk(KERN_INFO "[HELLO MODULE] Init, sys_call_table open @ %lx\n", sys_call_table[__NR_open]);
def_sys_open = (void*)sys_call_table[__NR_open];
printk(KERN_INFO "[HELLO MODULE] default_sys_open @ %lx\n", (unsigned long)def_sys_open);
printk(KERN_INFO "[HELLO MODULE] mod_sys_open @ %lx\n", (unsigned long)mod_sys_open);
sys_call_table[__NR_open] = (unsigned long)mod_sys_open;
// default_sys_open =(void * )xchg(&sys_call_table[__NR_open], mod_sys_open);
return 0;
}
static void __exit bye(void)
{
sys_call_table[__NR_open] = (unsigned long)def_sys_open;
printk(KERN_INFO "[HELLO MODULE] Goodbye world.\n");
}
module_init(hello);
module_exit(bye);
Lo scopo è quello di individuare le chiamate alla open ed eventualmente gestirla in maniera opportuna, se conoscete altri modi (forse più consoni) fatemi sapere :D.
Edit: fantastico ho appena scoperto che la sys_call_table è diventata read-only... trovato su un forum nascosto nei meandri della rete... :-( a questo punto?
L'idea è quella di usare un Linux Kernel Module e sostituire la voce corrispondente della sys_call_table con la mia nuova funzione.
Tuttavia facendo così il modulo mi crasha, presumo che ci sia una qualche protezione che impedisce la modifica della sys_call_table.
Ho cercato a lungo su Google, ma tutti gli esempi conducono a questo risultato.
Per altro a quanto ho letto dal kernel 2.6 in poi non è più esportata la sys_call_table, quindi ho dovuto leggere il valore della locazione di memoria dal file System.map.
Questo è il codice:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/syscalls.h>
unsigned long* sys_call_table = (unsigned long*)0xc0592150;
asmlinkage long (*def_sys_open)(const char *filename, int flags, int mode);
asmlinkage long mod_sys_open(const char *filename, int flags, int mode)
{
printk(KERN_INFO "[HELLO MODULE] Intercepted system call! Filename: %s\n", filename);
return def_sys_open(filename, flags, mode);
}
static int __init hello(void)
{
printk(KERN_INFO "[HELLO MODULE] Init, sys_call_table open @ %lx\n", sys_call_table[__NR_open]);
def_sys_open = (void*)sys_call_table[__NR_open];
printk(KERN_INFO "[HELLO MODULE] default_sys_open @ %lx\n", (unsigned long)def_sys_open);
printk(KERN_INFO "[HELLO MODULE] mod_sys_open @ %lx\n", (unsigned long)mod_sys_open);
sys_call_table[__NR_open] = (unsigned long)mod_sys_open;
// default_sys_open =(void * )xchg(&sys_call_table[__NR_open], mod_sys_open);
return 0;
}
static void __exit bye(void)
{
sys_call_table[__NR_open] = (unsigned long)def_sys_open;
printk(KERN_INFO "[HELLO MODULE] Goodbye world.\n");
}
module_init(hello);
module_exit(bye);
Lo scopo è quello di individuare le chiamate alla open ed eventualmente gestirla in maniera opportuna, se conoscete altri modi (forse più consoni) fatemi sapere :D.
Edit: fantastico ho appena scoperto che la sys_call_table è diventata read-only... trovato su un forum nascosto nei meandri della rete... :-( a questo punto?