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 ;>.
(c) 2000 KIKO81