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:
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.