LINUX : Como criar um módulo Kernel em linguagem C para executar o nosso código com os mais altos privilégios possíveis

Hoje vamos falar sobre como criar um módulo de kernel em linguagem C para executar o nosso código com o maior privilégio possível. Em alguns casos, é necessário executar código com um privilégio superior ao da raiz, em linux isto só pode ser feito de uma forma, com um módulo de kernel. E pode perguntar, como posso criar um módulo de kernel? Muito simples: Com linguagem C. Parece muito mais difícil do que realmente é, vamos lá:

A primeira coisa que temos de fazer é criar o nosso código Kernel Module C.

O caminho onde estes ficheiros são guardados é “/tmp/test-modulo”.

O ficheiro “testmodulo.c” conterá todo o código do módulo:

linux como crear un modulo del kernel linux con c

Em texto simples:

// 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);

O ficheiro “Makefile”, com o qual especificamos as opções de compilação:

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 e utilizar o módulo, é necessário fazer o seguinte a partir da consola:

Ir para o directório:

root@pc#cd /tmp/test-modulo

Compilamos com marca e gcc:

root@pc#make

Agora testmodulo.ko deve existir

root@pc#ls /tmp/test-modulo/testmodulo.ko
testmodulo.ko

Instalamos o módulo

root@pc#sudo insmod /tmp/test-modulo/testmodulo.ko
root@pc#

Verificamos se foi carregado

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

 

E com isto, teríamos tudo pronto para usar o nosso novo módulo.

Muito obrigado pela sua visita ao blogue! Se gostou, não se esqueça de deixar um comentário e partilhar o artigo.

Deixe um comentário