LINUX : Como crear un módulo del Kernel en lenguaje C para ejecutar nuestro código con el mayor privilegio posible

LINUX : Como crear un módulo del Kernel en lenguaje C para ejecutar nuestro código con el mayor privilegio posible

linux como crear un modulo del kernel linux con c

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:

linux como crear un modulo del kernel linux con c

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

Una respuesta

  1. Matias dice:

    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.

Deja una respuesta