LiNUX KERNEL MODULES: LKMs

Modificando Syscalls:

Modificar syscalls es mucho mas fácil de lo que pensáis. Solo tenemos que definir esto:

extern void *sys_call_table[];

Y ya tenemos las dirección de todas las syscalls. Como veis es un array, y para referenciarlas nos hace falta un índice (joder que novedad no?); pues bien, para saber a que numero corresponde una syscall os echáis un vistazo a <asm/unistd.h> y veréis las constantes __NR_nombre_de_la_syscall.

Ejemplos:

#define __NR_exit 1 #define __NR_fork 2 #define __NR_read 3

Lo que quiere decir que la dirección de exit en el kernel será sys_call_table[1].

Si queréis modificarla, pues en init_module() guardáis el original de la syscall y ponéis la dirección de la vuestra, y en cleanup_module() la restauráis, algo así:

init_module() { . . ioctl_original = sys_call_table[__NR_ioctl]; sys_call_table[__NR_ioctl] = mi_ioctl; . . } cleanup_module() { sys_call_table[__NR_ioctl] = ioctl_original; }

Si no restauráis la syscall original en cleanup_module() podéis iros preparando a "rebootear" vuestra maquina al descargar el módulo, pero si usáis Windows seguro que ya estáis acostumbrados ;>.

Anterior

(c) 2000 KIKO81