Hoy hablaremos de Como crear un módulo del Kernel en lenguaje C para ejecutar nuestro código con el mayor privilegio posible. En algunos casos, es necesario ejecutar código con un privilegio más elevado que root, en linux esto solo puede hacerse de una forma, con un módulo del kernel. Y os preguntaréis, ¿Como puedo crear un modulo del kernel? Muy sencillo: Con lenguaje C. Parece mucho mas difícil de lo que realmente es, vamos allá:
Para ello lo primero que debemos hacer es crear nuestro código C del Modulo del Kernel.
La ruta donde se han guardado estos ficheros es «/tmp/test-modulo».
El fichero «testmodulo.c» en el estará todo el código del módulo:
En texto plano:
// Definiendo __KERNEL__ and MODULE nos permite acceder a nivel de kernel. root@pc#undef __KERNEL__ root@pc#define __KERNEL__ root@pc#undef MODULE root@pc#define MODULE // Linux Kernel/LKM headers: module.h es necesario para todos los modulos y kernel.h //y tambien para para KERN_INFO. root@pc#include <linux/module.h> // Incluido para todos los modulos de kernel root@pc#include <linux/kernel.h> // Incluido para KERN_INFO root@pc#include <linux/init.h> // Incluido para __init y __exit macros static int __init testmodulo_init(void) { printk(KERN_INFO "testmodulo cargado\n"); //Se loga en el log del sistema //Aqui iria el codigo a ejecutar return 0; // Si el retorno no es 0 //quiere decir que el modulo no se ha podido cargar } static void __exit testmodulo_cleanup(void) { printk(KERN_INFO "Informacion de cleanup\n"); //se loga en el /var/log/messages } module_init(testmodulo_init); module_exit(testmodulo_cleanup);
El fichero «Makefile», con el cual especificamos las opciones de compilación:
obj-m := testmodulo.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) all: $(MAKE) -C $(KDIR) M=$(PWD) modules clean: $(MAKE) -C $(KDIR) M=$(PWD) clean
Para compilar y usar el modulo hay que hacer lo siguiente desde la consola:
Vamos al directorio:
root@pc#cd /tmp/test-modulo
Compilamos con make y gcc:
root@pc#make
Ahora testmodulo.ko deberia existir
root@pc#ls /tmp/test-modulo/testmodulo.ko testmodulo.ko
Instalamos el modulo
root@pc#sudo insmod /tmp/test-modulo/testmodulo.ko root@pc#
Consultamos si se ha cargado
root@pc# cat /var/log/messages|grep testmodulo -i Apr 9 20:52:21 sysger kernel: [15604.644410] testmodulo: module license 'unspecified' taints kernel. Apr 9 20:52:21 sysger kernel: [15604.644859] testmodulo cargado root@pc# lsmod|grep testmodulo testmodulo 192232 0
Y con esto ya tendriamos todo listo para usar nuestro nuevo módulo.
¡Muchas gracias por visitar el blog! Si te a gustado no olvides dejar un comentario y compartir el articulo
Muy buen artículo, como información adicional, de un error que me ocurrió, es que si se usa un editor de código como visual studio code, puede generar error al ejecutar el comando make ya que el tab que necesita este comando, antes de cada instrucción, el editor de código lo convierte en 4 espacios y esto hace que falle.